This commit is contained in:
@@ -55,13 +55,9 @@ const AVAILABLE_ROLES = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
// Создаем маппинги для конвертации между ID и названиями
|
// Создаем маппинги для конвертации между ID и названиями
|
||||||
const ROLE_ID_TO_NAME = Object.fromEntries(
|
const ROLE_ID_TO_NAME = Object.fromEntries(AVAILABLE_ROLES.map((role) => [role.id, role.name]))
|
||||||
AVAILABLE_ROLES.map(role => [role.id, role.name])
|
|
||||||
)
|
|
||||||
|
|
||||||
const ROLE_NAME_TO_ID = Object.fromEntries(
|
const ROLE_NAME_TO_ID = Object.fromEntries(AVAILABLE_ROLES.map((role) => [role.name, role.id]))
|
||||||
AVAILABLE_ROLES.map(role => [role.name, role.id])
|
|
||||||
)
|
|
||||||
|
|
||||||
const UserEditModal: Component<UserEditModalProps> = (props) => {
|
const UserEditModal: Component<UserEditModalProps> = (props) => {
|
||||||
// Инициализируем форму с использованием ID ролей
|
// Инициализируем форму с использованием ID ролей
|
||||||
@@ -70,7 +66,7 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
email: props.user.email || '',
|
email: props.user.email || '',
|
||||||
name: props.user.name || '',
|
name: props.user.name || '',
|
||||||
slug: props.user.slug || '',
|
slug: props.user.slug || '',
|
||||||
roles: (props.user.roles || []).map(roleName => ROLE_NAME_TO_ID[roleName] || roleName)
|
roles: (props.user.roles || []).map((roleName) => ROLE_NAME_TO_ID[roleName] || roleName)
|
||||||
})
|
})
|
||||||
|
|
||||||
const [errors, setErrors] = createSignal<Record<string, string>>({})
|
const [errors, setErrors] = createSignal<Record<string, string>>({})
|
||||||
@@ -82,11 +78,6 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
return roles.includes('admin') || (props.user.email ? ADMIN_EMAILS.includes(props.user.email) : false)
|
return roles.includes('admin') || (props.user.email ? ADMIN_EMAILS.includes(props.user.email) : false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получаем информацию о роли по ID
|
|
||||||
const getRoleInfo = (roleId: string) => {
|
|
||||||
return AVAILABLE_ROLES.find((role) => role.id === roleId) || { name: roleId, emoji: '👤' }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Обновляем поле формы
|
// Обновляем поле формы
|
||||||
const updateField = (field: keyof ReturnType<typeof formData>, value: string) => {
|
const updateField = (field: keyof ReturnType<typeof formData>, value: string) => {
|
||||||
setFormData((prev) => ({ ...prev, [field]: value }))
|
setFormData((prev) => ({ ...prev, [field]: value }))
|
||||||
@@ -107,7 +98,7 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
email: props.user.email || '',
|
email: props.user.email || '',
|
||||||
name: props.user.name || '',
|
name: props.user.name || '',
|
||||||
slug: props.user.slug || '',
|
slug: props.user.slug || '',
|
||||||
roles: (props.user.roles || []).map(roleName => ROLE_NAME_TO_ID[roleName] || roleName)
|
roles: (props.user.roles || []).map((roleName) => ROLE_NAME_TO_ID[roleName] || roleName)
|
||||||
})
|
})
|
||||||
setErrors({})
|
setErrors({})
|
||||||
}
|
}
|
||||||
@@ -133,12 +124,12 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Создаем новый массив ролей с учетом текущего состояния
|
// Создаем новый массив ролей с учетом текущего состояния
|
||||||
setFormData(prev => {
|
setFormData((prev) => {
|
||||||
const currentRoles = prev.roles || []
|
const currentRoles = prev.roles || []
|
||||||
const isCurrentlySelected = currentRoles.includes(roleId)
|
const isCurrentlySelected = currentRoles.includes(roleId)
|
||||||
|
|
||||||
const newRoles = isCurrentlySelected
|
const newRoles = isCurrentlySelected
|
||||||
? currentRoles.filter(r => r !== roleId) // Убираем роль
|
? currentRoles.filter((r) => r !== roleId) // Убираем роль
|
||||||
: [...currentRoles, roleId] // Добавляем роль
|
: [...currentRoles, roleId] // Добавляем роль
|
||||||
|
|
||||||
console.log('Current roles before:', currentRoles)
|
console.log('Current roles before:', currentRoles)
|
||||||
@@ -150,7 +141,7 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
|
|
||||||
// Очищаем ошибки, связанные с ролями
|
// Очищаем ошибки, связанные с ролями
|
||||||
if (errors().roles) {
|
if (errors().roles) {
|
||||||
setErrors(prev => {
|
setErrors((prev) => {
|
||||||
const newErrors = { ...prev }
|
const newErrors = { ...prev }
|
||||||
delete newErrors.roles
|
delete newErrors.roles
|
||||||
return newErrors
|
return newErrors
|
||||||
@@ -192,7 +183,7 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
await props.onSave({
|
await props.onSave({
|
||||||
...formData(),
|
...formData(),
|
||||||
// Конвертируем ID ролей обратно в названия для сервера
|
// Конвертируем ID ролей обратно в названия для сервера
|
||||||
roles: (formData().roles || []).map(roleId => ROLE_ID_TO_NAME[roleId]).join(',')
|
roles: (formData().roles || []).map((roleId) => ROLE_ID_TO_NAME[roleId]).join(',')
|
||||||
})
|
})
|
||||||
props.onClose()
|
props.onClose()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -205,9 +196,9 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
|
|
||||||
// Обновляем компонент выбора роли
|
// Обновляем компонент выбора роли
|
||||||
const RoleSelector = (props: {
|
const RoleSelector = (props: {
|
||||||
role: typeof AVAILABLE_ROLES[0],
|
role: (typeof AVAILABLE_ROLES)[0]
|
||||||
isSelected: boolean,
|
isSelected: boolean
|
||||||
onToggle: () => void,
|
onToggle: () => void
|
||||||
isDisabled?: boolean
|
isDisabled?: boolean
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
@@ -217,7 +208,8 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
opacity: props.isDisabled ? 0.7 : 1,
|
opacity: props.isDisabled ? 0.7 : 1,
|
||||||
cursor: props.isDisabled ? 'not-allowed' : 'pointer',
|
cursor: props.isDisabled ? 'not-allowed' : 'pointer',
|
||||||
background: props.role.id === 'admin' && props.isSelected ? 'rgba(245, 158, 11, 0.1)' : undefined,
|
background: props.role.id === 'admin' && props.isSelected ? 'rgba(245, 158, 11, 0.1)' : undefined,
|
||||||
border: props.role.id === 'admin' && props.isSelected ? '1px solid rgba(245, 158, 11, 0.3)' : undefined
|
border:
|
||||||
|
props.role.id === 'admin' && props.isSelected ? '1px solid rgba(245, 158, 11, 0.3)' : undefined
|
||||||
}}
|
}}
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -228,9 +220,7 @@ const UserEditModal: Component<UserEditModalProps> = (props) => {
|
|||||||
>
|
>
|
||||||
<div class={formStyles.roleHeader}>
|
<div class={formStyles.roleHeader}>
|
||||||
<span class={formStyles.roleName}>
|
<span class={formStyles.roleName}>
|
||||||
<span style={{ 'margin-right': '0.5rem', 'font-size': '1.1rem' }}>
|
<span style={{ 'margin-right': '0.5rem', 'font-size': '1.1rem' }}>{props.role.emoji}</span>
|
||||||
{props.role.emoji}
|
|
||||||
</span>
|
|
||||||
{props.role.name}
|
{props.role.name}
|
||||||
<Show when={props.role.id === 'admin'}>
|
<Show when={props.role.id === 'admin'}>
|
||||||
<span
|
<span
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
|
import { createEffect, Show } from 'solid-js'
|
||||||
import { useAuth } from '../context/auth'
|
import { useAuth } from '../context/auth'
|
||||||
import { DataProvider } from '../context/data'
|
import { DataProvider } from '../context/data'
|
||||||
import { TableSortProvider } from '../context/sort'
|
import { TableSortProvider } from '../context/sort'
|
||||||
import AdminPage from '../routes/admin'
|
import AdminPage from '../routes/admin'
|
||||||
import { Show, createEffect } from 'solid-js'
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Компонент защищенного маршрута
|
* Компонент защищенного маршрута
|
||||||
|
Reference in New Issue
Block a user