From c83a4dcd8145c1cec9533cd508648b2919b4a7ef Mon Sep 17 00:00:00 2001 From: shats Date: Tue, 11 Nov 2025 19:48:27 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=20CommunitiesManager=20=D1=81=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D0=B8=D0=BA=D0=BE=D0=BD=D0=BE?= =?UTF-8?q?=D0=BA,=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC=20=D0=B8=20=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8.=20=D0=92=D0=BD?= =?UTF-8?q?=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D1=8B=20=D1=81=D0=BE=D1=85=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B5=20=D1=83=D0=B4=D0=BE=D0=B1=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8,=20?= =?UTF-8?q?=D0=B0=20=D1=82=D0=B0=D0=BA=D0=B6=D0=B5=20=D1=83=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D1=88=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/CommunitiesManager.jsx | 124 ++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 33 deletions(-) diff --git a/frontend/src/CommunitiesManager.jsx b/frontend/src/CommunitiesManager.jsx index 33563f1..812eb80 100644 --- a/frontend/src/CommunitiesManager.jsx +++ b/frontend/src/CommunitiesManager.jsx @@ -15,7 +15,9 @@ import { IconHash, IconFilter, IconChartBar, - IconList + IconList, + IconArrowUp, + IconArrowDown } from '@tabler/icons-react'; import PageHeaderActions from './components/PageHeaderActions.jsx'; import PageHeader from './components/PageHeader.jsx'; @@ -23,6 +25,7 @@ import EmptyState from './components/EmptyState.jsx'; import { TableEmpty } from './components/TableSkeleton.jsx'; import Breadcrumbs from './components/Breadcrumbs.jsx'; import CommunityStats from './components/CommunityStats.jsx'; +import SavedFilters from './components/SavedFilters.jsx'; const API_URL = '/api'; @@ -298,16 +301,24 @@ function CommunitiesManager() { {activeTab === 'list' && (
-
-

Добавить

+
+

Добавить

- - setNewItem({...newItem, value:e.target.value})} placeholder="65001:200 или 100" /> + +
+ + setNewItem({...newItem, value:e.target.value})} placeholder="65001:200 или 100" /> +
+ {newItem.value && !/^(\d+|\d+:\d+)$/.test(String(newItem.value).trim()) && (
Формат: число или N:N
)} + {newItem.value && /^(\d+|\d+:\d+)$/.test(String(newItem.value).trim()) && (
Корректно
)}
- setNewItem({...newItem, name:e.target.value})} placeholder="Напр. Social" /> +
+ + setNewItem({...newItem, name:e.target.value})} placeholder="Напр. Social" /> +
@@ -325,7 +336,7 @@ function CommunitiesManager() { setNewItem({...newItem, color:e.target.value})} placeholder="blue, green, red ..." />
- +
@@ -333,20 +344,55 @@ function CommunitiesManager() {
-
-
-

Список community {items.length}

-
- - {setSearchTerm(e.target.value); setCurrentPage(1);}} /> +
+
+
+
+

Список community {filtered.length}

+
+
+
+ { + if (filters.searchTerm !== undefined) setSearchTerm(filters.searchTerm); + if (filters.sortField !== undefined) setSortField(filters.sortField); + if (filters.sortOrder !== undefined) setSortOrder(filters.sortOrder); + setCurrentPage(1); + }} + /> +
+ + {setSearchTerm(e.target.value); setCurrentPage(1);}} style={{ paddingRight: searchTerm ? '2.5rem' : undefined }} /> + {!!searchTerm && ( + + )} +
+
+
- - + + @@ -360,8 +406,8 @@ function CommunitiesManager() { - ) : paginated.map((item) => ( - + ) : paginated.map((item, idx) => ( +
changeSort('value')}>Value {sortField==='value' && {sortOrder==='asc'?'▲':'▼'}}changeSort('name')}>Название {sortField==='name' && {sortOrder==='asc'?'▲':'▼'}}changeSort('value')}> +
+ + Value + {sortField==='value' && {sortOrder==='asc'? : }} +
+
changeSort('name')}> +
+ + Название + {sortField==='name' && {sortOrder==='asc'? : }} +
+
Описание Теги Gateway
Добавить} />
{editingValue === item.value ? ( setEditingDraft({...editingDraft, value:e.target.value})} ref={editRef} /> @@ -419,22 +465,34 @@ function CommunitiesManager() {
{totalPages > 1 && ( -
-
Показано {((page - 1) * pageSize) + 1} - {Math.min(page * pageSize, filtered.length)} из {filtered.length}
-
    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -
+
+
+
Показано {((page - 1) * pageSize) + 1} - {Math.min(page * pageSize, filtered.length)} из {filtered.length}
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
)}