0.7.7-topics-editing
All checks were successful
Deploy on push / deploy (push) Successful in 6s

This commit is contained in:
2025-07-03 12:15:10 +03:00
parent 441cca8045
commit eb2140bcc6
27 changed files with 3097 additions and 805 deletions

View File

@@ -14,7 +14,7 @@ interface TopicsProps {
}
export const Topics = (props: TopicsProps) => {
const { selectedCommunity, loadTopicsByCommunity, topics: contextTopics } = useData()
const { selectedCommunity, loadTopicsByCommunity, topics: contextTopics, getTopicTitle } = useData()
// Состояние поиска
const [searchQuery, setSearchQuery] = createSignal('')
@@ -133,16 +133,32 @@ export const Topics = (props: TopicsProps) => {
/**
* Сохранение изменений топика
*/
const handleTopicSave = (updatedTopic: Topic) => {
const handleTopicSave = async (updatedTopic: Topic) => {
console.log('[TopicsRoute] Saving topic:', updatedTopic)
console.log('[TopicsRoute] Topic parent_ids:', updatedTopic.parent_ids)
// TODO: добавить логику сохранения изменений в базу данных
// await updateTopic(updatedTopic)
// Сразу обновляем локальные данные для мгновенного отображения
const currentTopics = contextTopics()
console.log('[TopicsRoute] Current topics count:', currentTopics.length)
const updatedTopics = currentTopics.map(topic =>
topic.id === updatedTopic.id ? updatedTopic : topic
)
console.log('[TopicsRoute] Updated topics count:', updatedTopics.length)
// Обновляем состояние контекста напрямую (это сработает мгновенно)
const { setTopics } = useData()
setTopics(updatedTopics)
props.onSuccess?.('Топик успешно обновлён')
// Обновляем локальные данные (пока что просто перезагружаем)
void loadTopicsForCommunity()
// Ждем большее время чтобы сервер точно обработал изменения и инвалидировал кеш
console.log('[TopicsRoute] Scheduling reload in 500ms...')
setTimeout(() => {
console.log('[TopicsRoute] Reloading topics from server...')
void loadTopicsForCommunity()
}, 500)
}
/**
@@ -152,6 +168,40 @@ export const Topics = (props: TopicsProps) => {
props.onError?.(message)
}
/**
* Рендер родительских тем для топика
*/
const renderParentTopics = (parentIds?: number[]) => {
if (!parentIds || parentIds.length === 0) {
return <span style="color: #999; font-style: italic;">Нет родителей</span>
}
return (
<div style="display: flex; flex-wrap: wrap; gap: 4px;">
<For each={parentIds}>
{(parentId) => {
const parentTitle = getTopicTitle(parentId)
return (
<span
style="
background: #e3f2fd;
color: #1976d2;
padding: 2px 6px;
border-radius: 12px;
font-size: 0.75rem;
white-space: nowrap;
"
title={`ID: ${parentId}`}
>
#{parentTitle || `ID:${parentId}`}
</span>
)
}}
</For>
</div>
)
}
/**
* Рендер строки топика
*/
@@ -169,6 +219,9 @@ export const Topics = (props: TopicsProps) => {
<td class={styles.tableCell} title={topic.slug}>
{truncateText(topic.slug, 30)}
</td>
<td class={styles.tableCell}>
{renderParentTopics(topic.parent_ids)}
</td>
<td class={styles.tableCell}>
{topic.body ? (
<span style="color: #666;">{truncateText(topic.body.replace(/<[^>]*>/g, ''), 60)}</span>
@@ -203,20 +256,21 @@ export const Topics = (props: TopicsProps) => {
<SortableHeader field="slug" allowedFields={TOPICS_SORT_CONFIG.allowedFields}>
Slug
</SortableHeader>
<th class={styles.tableHeaderCell}>Родительские темы</th>
<th class={styles.tableHeaderCell}>Body</th>
</tr>
</thead>
<tbody>
<Show when={loading()}>
<tr>
<td colspan="4" class={styles.loadingCell}>
<td colspan="5" class={styles.loadingCell}>
Загрузка...
</td>
</tr>
</Show>
<Show when={!loading() && sortedTopics().length === 0}>
<tr>
<td colspan="4" class={styles.emptyCell}>
<td colspan="5" class={styles.emptyCell}>
Нет топиков
</td>
</tr>