wip for create batch users modal
This commit is contained in:
parent
046eb3d503
commit
f4a888ad26
6 changed files with 163 additions and 1 deletions
|
@ -4,14 +4,16 @@ import { SearchIcon, PlusIcon } from '@heroicons/react/solid';
|
||||||
import { CogIcon, TrashIcon } from '@heroicons/react/outline';
|
import { CogIcon, TrashIcon } from '@heroicons/react/outline';
|
||||||
import { useUsers } from 'src/services/users';
|
import { useUsers } from 'src/services/users';
|
||||||
import { Table } from 'src/components';
|
import { Table } from 'src/components';
|
||||||
import { debounce } from 'lodash';
|
import _, { debounce } from 'lodash';
|
||||||
import { useAuth } from 'src/services/auth';
|
import { useAuth } from 'src/services/auth';
|
||||||
|
|
||||||
import { UserModal } from '../../components/UserModal';
|
import { UserModal } from '../../components/UserModal';
|
||||||
|
import { MultipleUsersModal } from './components';
|
||||||
|
|
||||||
export const Users: React.FC = () => {
|
export const Users: React.FC = () => {
|
||||||
const [selectedRowsIds, setSelectedRowsIds] = useState({});
|
const [selectedRowsIds, setSelectedRowsIds] = useState({});
|
||||||
const [configureModal, setConfigureModal] = useState(false);
|
const [configureModal, setConfigureModal] = useState(false);
|
||||||
|
const [multipleUsersModal, setMultipleUsersModal] = useState(false);
|
||||||
const [userId, setUserId] = useState(null);
|
const [userId, setUserId] = useState(null);
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
const { users, loadUsers, userTableLoading } = useUsers();
|
const { users, loadUsers, userTableLoading } = useUsers();
|
||||||
|
@ -106,6 +108,14 @@ export const Users: React.FC = () => {
|
||||||
<PlusIcon className="-ml-0.5 mr-2 h-4 w-4" aria-hidden="true" />
|
<PlusIcon className="-ml-0.5 mr-2 h-4 w-4" aria-hidden="true" />
|
||||||
Add new user
|
Add new user
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
onClick={() => setMultipleUsersModal(true)}
|
||||||
|
type="button"
|
||||||
|
className="inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-primary-700 hover:bg-primary-800 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-800"
|
||||||
|
>
|
||||||
|
<PlusIcon className="-ml-0.5 mr-2 h-4 w-4" aria-hidden="true" />
|
||||||
|
Add new users
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -166,6 +176,13 @@ export const Users: React.FC = () => {
|
||||||
{configureModal && (
|
{configureModal && (
|
||||||
<UserModal open={configureModal} onClose={configureModalClose} userId={userId} setUserId={setUserId} />
|
<UserModal open={configureModal} onClose={configureModalClose} userId={userId} setUserId={setUserId} />
|
||||||
)}
|
)}
|
||||||
|
{multipleUsersModal && (
|
||||||
|
<MultipleUsersModal
|
||||||
|
open={multipleUsersModal}
|
||||||
|
onClose={() => setMultipleUsersModal(false)}
|
||||||
|
onUpload={_.noop}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
import React, { ChangeEvent, ChangeEventHandler, useEffect, useState } from 'react';
|
||||||
|
import _ from 'lodash';
|
||||||
|
// import { TrashIcon } from '@heroicons/react/outline';
|
||||||
|
// import { useFieldArray, useForm, useWatch } from 'react-hook-form';
|
||||||
|
import { Modal, Tabs } from 'src/components';
|
||||||
|
// import { Input, Select } from 'src/components/Form';
|
||||||
|
import { useUsers } from 'src/services/users';
|
||||||
|
import { useAuth } from 'src/services/auth';
|
||||||
|
import { MultipleUsersModalProps } from './types';
|
||||||
|
import { csvFileToArray } from './utils';
|
||||||
|
|
||||||
|
export const MultipleUsersModal = ({ open, onClose, onUpload }: MultipleUsersModalProps) => {
|
||||||
|
const [file, setFile] = useState<File>();
|
||||||
|
const { userModalLoading } = useUsers();
|
||||||
|
const { currentUser, isAdmin } = useAuth();
|
||||||
|
|
||||||
|
const handleOnChange = (e: ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setFile(_.get(e.target, 'files[0]'));
|
||||||
|
console.log(_.get(e.target, 'files[0]'));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSubmit = () => {
|
||||||
|
// e.preventDefault();
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('image', file, file.name);
|
||||||
|
|
||||||
|
// console.log('csv to array', csvFileToArray(file));
|
||||||
|
console.log('submit', formData);
|
||||||
|
} else {
|
||||||
|
console.log('nothing in file?');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderUpload = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div>Please upload CSV file using , as a delimiter</div>
|
||||||
|
<div>
|
||||||
|
<input type="file" id="csvFileInput" accept=".csv" onChange={handleOnChange} />
|
||||||
|
<button onClick={handleSubmit}>IMPORT CSV</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderMultilineInput = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<textarea
|
||||||
|
rows={5}
|
||||||
|
name="description"
|
||||||
|
className="w-full rounded-md border-gray-700 focus:border-gray-700 shadow-none focus:shadow-slate-800"
|
||||||
|
>
|
||||||
|
Enter details here...
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSave = async () => {
|
||||||
|
// try {
|
||||||
|
// if (userId) {
|
||||||
|
// await handleSubmit((data) => editUserById(data))();
|
||||||
|
// } else {
|
||||||
|
// await handleSubmit((data) => createNewUser(data))();
|
||||||
|
// }
|
||||||
|
// } catch (e: any) {
|
||||||
|
// // Continue
|
||||||
|
// }
|
||||||
|
|
||||||
|
onUpload();
|
||||||
|
|
||||||
|
onClose();
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleClose = () => {
|
||||||
|
onClose();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Modal
|
||||||
|
onClose={handleClose}
|
||||||
|
open={open}
|
||||||
|
onSave={handleSave}
|
||||||
|
isLoading={userModalLoading}
|
||||||
|
// leftActions={
|
||||||
|
// userId &&
|
||||||
|
// user.email !== currentUser?.email && (
|
||||||
|
// <button
|
||||||
|
// onClick={deleteModalOpen}
|
||||||
|
// type="button"
|
||||||
|
// className="mb-4 sm:mb-0 inline-flex items-center px-4 py-2 text-sm font-medium rounded-md text-red-700 bg-red-50 hover:bg-red-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500"
|
||||||
|
// >
|
||||||
|
// <TrashIcon className="-ml-0.5 mr-2 h-4 w-4" aria-hidden="true" />
|
||||||
|
// Delete
|
||||||
|
// </button>
|
||||||
|
// )
|
||||||
|
// }
|
||||||
|
useCancelButton
|
||||||
|
>
|
||||||
|
<div className="bg-white px-4">
|
||||||
|
<div className="space-y-10 divide-y divide-gray-200">
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<h3 className="text-lg leading-6 font-medium text-gray-900">Add new users</h3>
|
||||||
|
</div>
|
||||||
|
<div className="sm:p-6">
|
||||||
|
<Tabs
|
||||||
|
tabs={[
|
||||||
|
{ name: 'Add users', component: renderMultilineInput() },
|
||||||
|
{ name: 'Import from file', component: renderUpload() },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
1
src/modules/users/components/MultipleUsersModal/index.ts
Normal file
1
src/modules/users/components/MultipleUsersModal/index.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export { MultipleUsersModal } from './MultipleUsersModal';
|
5
src/modules/users/components/MultipleUsersModal/types.ts
Normal file
5
src/modules/users/components/MultipleUsersModal/types.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
export type MultipleUsersModalProps = {
|
||||||
|
open: boolean;
|
||||||
|
onClose: () => void;
|
||||||
|
onUpload: () => void;
|
||||||
|
};
|
14
src/modules/users/components/MultipleUsersModal/utils.ts
Normal file
14
src/modules/users/components/MultipleUsersModal/utils.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import { User } from 'src/services/users';
|
||||||
|
|
||||||
|
export const csvFileToArray = (csvData: string) => {
|
||||||
|
const csvRows = csvData.slice(csvData.indexOf('\n') + 1).split('\n');
|
||||||
|
|
||||||
|
const array = csvRows.map((i) => {
|
||||||
|
const values = i.split(',');
|
||||||
|
const email = values[0];
|
||||||
|
const name = values[1];
|
||||||
|
return { email, name, app_roles: [], preferredUsername: '', status: '', id: '' } as User;
|
||||||
|
});
|
||||||
|
|
||||||
|
return array;
|
||||||
|
};
|
1
src/modules/users/components/index.ts
Normal file
1
src/modules/users/components/index.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export { MultipleUsersModal } from './MultipleUsersModal';
|
Loading…
Reference in a new issue