import { createEffect, createSignal, For, Show } from 'solid-js' import { Topic, useData } from '../context/data' import styles from '../styles/Form.module.css' import modalStyles from '../styles/Modal.module.css' import EditableCodePreview from '../ui/EditableCodePreview' import Modal from '../ui/Modal' interface TopicEditModalProps { topic: Topic isOpen: boolean onClose: () => void onSave: (updatedTopic: Topic) => void onError?: (message: string) => void } export default function TopicEditModal(props: TopicEditModalProps) { const { communities, topics, getCommunityName, selectedCommunity } = useData() // Состояние формы const [formData, setFormData] = createSignal({ id: 0, title: '', slug: '', body: '', community: 0, parent_ids: [] as number[] }) // Состояние для выбора родителей const [availableParents, setAvailableParents] = createSignal([]) const [parentSearch, setParentSearch] = createSignal('') // Состояние для редактирования body const [showBodyEditor, setShowBodyEditor] = createSignal(false) const [bodyContent, setBodyContent] = createSignal('') const [saving, setSaving] = createSignal(false) // Инициализация формы при открытии createEffect(() => { if (props.isOpen && props.topic) { console.log('[TopicEditModal] Initializing with topic:', props.topic) setFormData({ id: props.topic.id, title: props.topic.title || '', slug: props.topic.slug || '', body: props.topic.body || '', community: selectedCommunity() || 0, parent_ids: props.topic.parent_ids || [] }) setBodyContent(props.topic.body || '') updateAvailableParents(selectedCommunity() || 0) } }) // Обновление доступных родителей при смене сообщества const updateAvailableParents = (communityId: number) => { const allTopics = topics() const currentTopicId = formData().id // Фильтруем топики того же сообщества, исключая текущий топик const filteredTopics = allTopics.filter( (topic) => topic.community === communityId && topic.id !== currentTopicId ) setAvailableParents(filteredTopics) } // Фильтрация родителей по поиску const filteredParents = () => { const search = parentSearch().toLowerCase() if (!search) return availableParents() return availableParents().filter( (topic) => topic.title?.toLowerCase().includes(search) || topic.slug?.toLowerCase().includes(search) ) } // Обработка изменения сообщества const handleCommunityChange = (e: Event) => { const target = e.target as HTMLSelectElement const communityId = Number.parseInt(target.value) setFormData((prev) => ({ ...prev, community: communityId, parent_ids: [] // Сбрасываем родителей при смене сообщества })) updateAvailableParents(communityId) } // Обработка изменения родителей const handleParentToggle = (parentId: number) => { setFormData((prev) => ({ ...prev, parent_ids: prev.parent_ids.includes(parentId) ? prev.parent_ids.filter((id) => id !== parentId) : [...prev.parent_ids, parentId] })) } // Обработка изменения полей формы const handleFieldChange = (field: string, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })) } // Открытие редактора body const handleOpenBodyEditor = () => { setBodyContent(formData().body) setShowBodyEditor(true) } // Сохранение body из редактора const handleBodySave = (content: string) => { setFormData((prev) => ({ ...prev, body: content })) setBodyContent(content) setShowBodyEditor(false) } // Получение пути до корня для топика const getTopicPath = (topicId: number): string => { const topic = topics().find((t) => t.id === topicId) if (!topic) return 'Неизвестный топик' const community = getCommunityName(topic.community) return `${community} → ${topic.title}` } // Сохранение изменений const handleSave = async () => { try { setSaving(true) const updatedTopic = { ...props.topic, ...formData() } console.log('[TopicEditModal] Saving topic:', updatedTopic) // TODO: Здесь должен быть вызов API для сохранения // await updateTopic(updatedTopic) props.onSave(updatedTopic) props.onClose() } catch (error) { console.error('[TopicEditModal] Error saving topic:', error) props.onError?.(error instanceof Error ? error.message : 'Ошибка сохранения топика') } finally { setSaving(false) } } return ( <>
{/* Основная информация */}

Основная информация

{/* Содержимое */}

Содержимое

{formData().body.length > 200 ? `${formData().body.substring(0, 200)}...` : formData().body}
Нет содержимого. Нажмите для редактирования.
✏️ Кликните для редактирования в полноэкранном редакторе
{/* Родительские топики */} 0}>

Родительские топики

0}>
Выбранные родители:
    {(parentId) => (
  • {getTopicPath(parentId)}
  • )}
Доступные родители:
{(parent) => ( )}
Не найдено топиков по запросу "{parentSearch()}" Нет доступных родительских топиков в этом сообществе
{/* Кнопки */}
{/* Редактор body */} setShowBodyEditor(false)} title="Редактирование содержимого топика" size="large" > setShowBodyEditor(false)} placeholder="Введите содержимое топика..." /> ) }