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}
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
)}