front update
This commit is contained in:
parent
7d84ed7f9e
commit
f19a6fa57c
@ -10,14 +10,11 @@ import API from '../../services/api';
|
|||||||
import setNotification from '../errors/error-notification';
|
import setNotification from '../errors/error-notification';
|
||||||
|
|
||||||
const Content = ({ form, playlistId }) => {
|
const Content = ({ form, playlistId }) => {
|
||||||
console.log(form.values);
|
|
||||||
|
|
||||||
const [fileSelector, setFileSelector] = useState(false);
|
const [fileSelector, setFileSelector] = useState(false);
|
||||||
const toggleFileSelector = () => setFileSelector(!fileSelector);
|
const toggleFileSelector = () => setFileSelector(!fileSelector);
|
||||||
|
|
||||||
const handleAddFiles = (files) => {
|
const handleAddFiles = (files) => {
|
||||||
console.log('handle add file');
|
|
||||||
console.log(files);
|
|
||||||
let formFiles = form.values.files;
|
let formFiles = form.values.files;
|
||||||
let max_position = formFiles[formFiles.length - 1]?.position ?? 0;
|
let max_position = formFiles[formFiles.length - 1]?.position ?? 0;
|
||||||
files.forEach((file) => {
|
files.forEach((file) => {
|
||||||
|
@ -7,7 +7,6 @@ const ModalCreatePlaylist = ({ opened, handler, addPlaylist }) => {
|
|||||||
if (item) {
|
if (item) {
|
||||||
addPlaylist(item);
|
addPlaylist(item);
|
||||||
}
|
}
|
||||||
console.log("call handler")
|
|
||||||
handler();
|
handler();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -20,10 +20,6 @@ const Playlists = () => {
|
|||||||
const [playlists, setPlaylist] = useState([]);
|
const [playlists, setPlaylist] = useState([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log('profile');
|
|
||||||
API.profile()
|
|
||||||
.then((res) => console.log(res))
|
|
||||||
.catch((err) => console.log(err));
|
|
||||||
API.listPlaylists(limit, page)
|
API.listPlaylists(limit, page)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
|
@ -2,18 +2,18 @@ import { useEffect, useState } from 'react';
|
|||||||
import NavbarSignage from '../../components/navbar';
|
import NavbarSignage from '../../components/navbar';
|
||||||
import API from '../../services/api';
|
import API from '../../services/api';
|
||||||
import setNotification from '../errors/error-notification';
|
import setNotification from '../errors/error-notification';
|
||||||
import ModalCreateUser from './create';
|
import ModalUserEditor from './user-editor';
|
||||||
import { Button } from '@mantine/core';
|
import { Button } from '@mantine/core';
|
||||||
import GrantAccess, { Perm } from '../../tools/grant-access';
|
import GrantAccess, { Perm } from '../../tools/grant-access';
|
||||||
import UserTable from './users-table';
|
import UserTable from './users-table';
|
||||||
|
|
||||||
const Users = () => {
|
const Users = () => {
|
||||||
const [showCreate, setShowCreate] = useState(true);
|
const [showCreate, setShowCreate] = useState(false);
|
||||||
const [showUpdate, setShowUpdate] = useState(false);
|
const [showUpdate, setShowUpdate] = useState(false);
|
||||||
|
const [itemToUpdate, setItemToUpdate] = useState();
|
||||||
|
|
||||||
const toggleModalCreate = () => setShowCreate(!showCreate);
|
const toggleModalCreate = () => setShowCreate(!showCreate);
|
||||||
const toggleModalUpdate = () => setShowUpdate(!showUpdate);
|
const toggleModalUpdate = () => setShowUpdate(!showUpdate);
|
||||||
|
|
||||||
const [users, setUsers] = useState([]);
|
const [users, setUsers] = useState([]);
|
||||||
const [roles, setRoles] = useState([]);
|
const [roles, setRoles] = useState([]);
|
||||||
|
|
||||||
@ -49,6 +49,10 @@ const Users = () => {
|
|||||||
setUsers((prev) => [...prev, user]);
|
setUsers((prev) => [...prev, user]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const updateUser = (user) => {
|
||||||
|
// setUsers((prev) => [...prev, user]);
|
||||||
|
};
|
||||||
|
|
||||||
const navbar = {
|
const navbar = {
|
||||||
title: 'Users',
|
title: 'Users',
|
||||||
search: search,
|
search: search,
|
||||||
@ -63,11 +67,29 @@ const Users = () => {
|
|||||||
<NavbarSignage data={navbar} />
|
<NavbarSignage data={navbar} />
|
||||||
<UserTable
|
<UserTable
|
||||||
data={users}
|
data={users}
|
||||||
// updateItem={setItem} // todo
|
updateItem={(item) => {
|
||||||
|
console.log(item);
|
||||||
|
setItemToUpdate(item);
|
||||||
|
toggleModalUpdate();
|
||||||
|
}}
|
||||||
onDelete={(id) => setUsers(users.filter((item) => item.id != id))}
|
onDelete={(id) => setUsers(users.filter((item) => item.id != id))}
|
||||||
updateHandler={toggleModalUpdate}
|
updateHandler={toggleModalUpdate}
|
||||||
/>
|
/>
|
||||||
<ModalCreateUser opened={showCreate} handler={toggleModalCreate} addUser={(user) => addUser(user)} APICall={API.createUser} />
|
<ModalUserEditor
|
||||||
|
opened={showCreate}
|
||||||
|
handler={(item) => updateUser(item)}
|
||||||
|
handlerClose={toggleModalCreate}
|
||||||
|
APICall={API.createUser}
|
||||||
|
name="Create"
|
||||||
|
/>
|
||||||
|
<ModalUserEditor
|
||||||
|
opened={showUpdate}
|
||||||
|
handler={(item) => addUser(item)}
|
||||||
|
handlerClose={toggleModalUpdate}
|
||||||
|
APICall={API.updateUser}
|
||||||
|
item={itemToUpdate}
|
||||||
|
name="Update"
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -4,24 +4,26 @@ import { useState } from 'react';
|
|||||||
import { Perm, checkPerm } from '../../tools/grant-access';
|
import { Perm, checkPerm } from '../../tools/grant-access';
|
||||||
import { useAuth } from '../../tools/auth-provider';
|
import { useAuth } from '../../tools/auth-provider';
|
||||||
import setNotification from '../errors/error-notification';
|
import setNotification from '../errors/error-notification';
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
const ModalCreateUser = ({ opened, handler, addUser, APICall, item }) => {
|
const ModalUserEditor = ({ opened, handlerClose, handler, APICall, name, item }) => {
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
const { user } = useAuth();
|
const { user } = useAuth();
|
||||||
const handleClose = (item) => {
|
const handleFinish = (e) => {
|
||||||
if (item) {
|
console.log(e)
|
||||||
addUser(item);
|
if (e) {
|
||||||
|
handler(e);
|
||||||
}
|
}
|
||||||
handler();
|
handlerClose();
|
||||||
};
|
};
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
initialValues: {
|
initialValues: {
|
||||||
login: '',
|
login: item?.login ?? '',
|
||||||
password: '',
|
password: item?.password ?? '',
|
||||||
create_user: false,
|
create_user: checkPerm(Perm.CREATE_USER, item),
|
||||||
create_role: false,
|
create_role: checkPerm(Perm.CREATE_ROLE, item),
|
||||||
create_playlist: false,
|
create_playlist: checkPerm(Perm.CREATE_PLAYLIST, item),
|
||||||
},
|
},
|
||||||
validate: {
|
validate: {
|
||||||
login: isNotEmpty('Login is required'),
|
login: isNotEmpty('Login is required'),
|
||||||
@ -29,6 +31,18 @@ const ModalCreateUser = ({ opened, handler, addUser, APICall, item }) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (item) {
|
||||||
|
form.setFieldValue('login', item?.login ?? '');
|
||||||
|
form.setFieldValue('password', item?.password ?? '');
|
||||||
|
form.setFieldValue('create_user', checkPerm(Perm.CREATE_USER, item));
|
||||||
|
form.setFieldValue('create_role', checkPerm(Perm.CREATE_ROLE, item));
|
||||||
|
form.setFieldValue('create_playlist', checkPerm(Perm.CREATE_PLAYLIST, item));
|
||||||
|
}
|
||||||
|
return () => {};
|
||||||
|
// eslint-disable-next-line
|
||||||
|
}, [item]);
|
||||||
|
|
||||||
const handleSubmit = async (event) => {
|
const handleSubmit = async (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
if (form.validate().hasErrors) return;
|
if (form.validate().hasErrors) return;
|
||||||
@ -37,7 +51,7 @@ const ModalCreateUser = ({ opened, handler, addUser, APICall, item }) => {
|
|||||||
if (item) {
|
if (item) {
|
||||||
// await APICall(item?.id, { name: form.values.name });
|
// await APICall(item?.id, { name: form.values.name });
|
||||||
// item.name = form.values.name;
|
// item.name = form.values.name;
|
||||||
handleClose(item);
|
handleFinish(item);
|
||||||
} else {
|
} else {
|
||||||
let data = { login: form.values.login, password: form.values.password };
|
let data = { login: form.values.login, password: form.values.password };
|
||||||
data.permissions = 0;
|
data.permissions = 0;
|
||||||
@ -45,7 +59,7 @@ const ModalCreateUser = ({ opened, handler, addUser, APICall, item }) => {
|
|||||||
if (form.values.create_role) data.permissions += 2;
|
if (form.values.create_role) data.permissions += 2;
|
||||||
if (form.values.create_playlist) data.permissions += 4;
|
if (form.values.create_playlist) data.permissions += 4;
|
||||||
const res = await APICall(data);
|
const res = await APICall(data);
|
||||||
handleClose(res.data);
|
handleFinish(res.data);
|
||||||
}
|
}
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@ -57,13 +71,13 @@ const ModalCreateUser = ({ opened, handler, addUser, APICall, item }) => {
|
|||||||
// todo parent role
|
// todo parent role
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal.Root opened={opened} onClose={handler}>
|
<Modal.Root opened={opened} onClose={handlerClose}>
|
||||||
<Modal.Overlay />
|
<Modal.Overlay />
|
||||||
<Modal.Content>
|
<Modal.Content>
|
||||||
<Modal.Header>
|
<Modal.Header>
|
||||||
<Modal.Title>
|
<Modal.Title>
|
||||||
<Text fw={700} fz="lg">
|
<Text fw={700} fz="lg">
|
||||||
Create User
|
{name} User
|
||||||
</Text>
|
</Text>
|
||||||
</Modal.Title>
|
</Modal.Title>
|
||||||
<Modal.CloseButton />
|
<Modal.CloseButton />
|
||||||
@ -90,29 +104,32 @@ const ModalCreateUser = ({ opened, handler, addUser, APICall, item }) => {
|
|||||||
<Stack spacing="sm">
|
<Stack spacing="sm">
|
||||||
<Switch
|
<Switch
|
||||||
label="Create user"
|
label="Create user"
|
||||||
disabled={checkPerm(Perm.CREATE_USER, user)}
|
disabled={!checkPerm(Perm.CREATE_USER, user)}
|
||||||
{...form.getInputProps('create_user')}
|
checked={form.getInputProps('create_user').value}
|
||||||
|
onChange={(e) => form.setFieldValue('create_user', e.target.checked)}
|
||||||
/>
|
/>
|
||||||
<Switch
|
<Switch
|
||||||
label="Create role"
|
label="Create role"
|
||||||
disabled={checkPerm(Perm.CREATE_ROLE, user)}
|
disabled={!checkPerm(Perm.CREATE_ROLE, user)}
|
||||||
{...form.getInputProps('create_role')}
|
checked={form.getInputProps('create_role').value}
|
||||||
|
onChange={(e) => form.setFieldValue('create_role', e.target.checked)}
|
||||||
/>
|
/>
|
||||||
<Switch
|
<Switch
|
||||||
label="Create playlist"
|
label="Create playlist"
|
||||||
disabled={checkPerm(Perm.CREATE_PLAYLIST, user)}
|
disabled={!checkPerm(Perm.CREATE_PLAYLIST, user)}
|
||||||
{...form.getInputProps('create_playlist')}
|
checked={form.getInputProps('create_playlist').value}
|
||||||
|
onChange={(e) => form.setFieldValue('create_playlist', e.target.checked)}
|
||||||
/>
|
/>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Paper>
|
</Paper>
|
||||||
</Stack>
|
</Stack>
|
||||||
|
|
||||||
<Group position="right" mt="md">
|
<Group position="right" mt="md">
|
||||||
<Button variant="light" color="red" onClick={handler}>
|
<Button variant="light" color="red" onClick={handlerClose}>
|
||||||
Cancel
|
Cancel
|
||||||
</Button>
|
</Button>
|
||||||
<Button type="submit" variant="light" color="green" loading={isLoading}>
|
<Button type="submit" variant="light" color="green" loading={isLoading}>
|
||||||
Create
|
{name}
|
||||||
</Button>
|
</Button>
|
||||||
</Group>
|
</Group>
|
||||||
</form>
|
</form>
|
||||||
@ -122,4 +139,4 @@ const ModalCreateUser = ({ opened, handler, addUser, APICall, item }) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ModalCreateUser;
|
export default ModalUserEditor;
|
@ -7,9 +7,13 @@ const UserTable = (props) => {
|
|||||||
<td>{user.login}</td>
|
<td>{user.login}</td>
|
||||||
<td>
|
<td>
|
||||||
<Group>
|
<Group>
|
||||||
<Button onClick={() => 1} color="green">View</Button>
|
<Button onClick={() => 1} color="green">
|
||||||
<Button onClick={() => 1}>Update</Button>
|
View
|
||||||
<Button onClick={() => 1} color="red">Delete</Button>
|
</Button>
|
||||||
|
<Button onClick={() => props.updateItem(user)}>Update</Button>
|
||||||
|
<Button onClick={() => 1} color="red">
|
||||||
|
Delete
|
||||||
|
</Button>
|
||||||
</Group>
|
</Group>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -12,18 +12,20 @@ export const Perm = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const checkBit = (dec, perm) => {
|
const checkBit = (dec, perm) => {
|
||||||
|
if (!dec || !perm) return false;
|
||||||
const binStr = (dec >>> 0).toString(2);
|
const binStr = (dec >>> 0).toString(2);
|
||||||
const len = binStr.length;
|
const len = binStr.length;
|
||||||
return binStr[len - perm - 1];
|
return binStr[len - perm] === '1';
|
||||||
};
|
};
|
||||||
|
|
||||||
export const checkPerm = (perm, user, item = {}) => {
|
export const checkPerm = (perm, user, item = {}) => {
|
||||||
|
if (!perm || !user) return false;
|
||||||
switch (perm) {
|
switch (perm) {
|
||||||
case Perm.CREATE_ROLE:
|
case Perm.CREATE_ROLE:
|
||||||
return user.roles.length >= 1 && checkBit(user.roles[0].permissions, Perm.CREATE_ROLE);
|
return user.roles.length >= 1 && checkBit(user.roles[0].permissions, Perm.CREATE_ROLE);
|
||||||
case Perm.CREATE_PLAYLIST:
|
case Perm.CREATE_PLAYLIST:
|
||||||
return user.roles.length >= 1 && checkBit(user.roles[0].permissions, Perm.CREATE_PLAYLIST);
|
return user.roles.length >= 1 && checkBit(user.roles[0].permissions, Perm.CREATE_PLAYLIST);
|
||||||
case Perm.CREATE_ROLE:
|
case Perm.CREATE_USER:
|
||||||
return user.roles.length >= 1 && checkBit(user.roles[0].permissions, Perm.CREATE_USER);
|
return user.roles.length >= 1 && checkBit(user.roles[0].permissions, Perm.CREATE_USER);
|
||||||
case Perm.OWN_PLAYLIST:
|
case Perm.OWN_PLAYLIST:
|
||||||
return item?.owner_id === user.id;
|
return item?.owner_id === user.id;
|
||||||
|
Loading…
Reference in New Issue
Block a user