feat(web): enhance quick action grid and resource page with search functionality
Build and Push EvoFirewall Docker Image / build-and-push (push) Successful in 1m50s
Build and Push EvoFirewall Docker Image / create-release (push) Skipped

- Updated QuickActionItem interface to support optional `onSelect` handler and `badgeLabel`.
- Refactored QuickActionGrid to conditionally render links or buttons based on the presence of a `to` property.
- Introduced search functionality in ResourcePage, allowing users to filter items based on a search query.
- Added search input to the ResourcePage toolbar, improving user experience for data management.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Denozordec
2026-07-21 04:03:32 +07:00
co-authored by Cursor
parent 0653313a57
commit 33d301b191
11 changed files with 1082 additions and 431 deletions
+12 -17
View File
@@ -33,8 +33,8 @@ export const Route = createFileRoute('/_auth/rules/')({
})
/**
* Policy sets list — ResourcePage (Frame + tabs + Filters + DataGrid).
* Preview: https://reui.io/preview/base/data-grid-filtering-2 · stats-12
* Policy sets list — ResourcePage (Frame + Filters + DataGrid + search).
* Preview: https://reui.io/preview/base/data-grid-filtering-2
* Empty: https://reui.io/preview/base/empty-state-12
* Create sheet: https://reui.io/preview/base/sheet-8
*/
@@ -46,7 +46,7 @@ function PolicySetsPage() {
const [name, setName] = useState('')
const [description, setDescription] = useState('')
const [filters, setFilters] = useState<Filter[]>([])
const [activeTab, setActiveTab] = useState('all')
const [searchQuery, setSearchQuery] = useState('')
const [deleteId, setDeleteId] = useState<string | null>(null)
const create = useMutation({
@@ -105,12 +105,11 @@ function PolicySetsPage() {
return undefined
}, [])
const tabFilter = useCallback((item: PolicySet, tabId: string) => {
if (tabId === 'all') return true
if (tabId === 'enabled') return item.enabled
if (tabId === 'disabled') return !item.enabled
return true
}, [])
const getSearchText = useCallback(
(item: PolicySet) =>
[item.name, item.description ?? ''].filter(Boolean).join(' '),
[],
)
const columns: ColumnDef<PolicySet>[] = useMemo(
() => [
@@ -248,14 +247,10 @@ function PolicySetsPage() {
onFiltersChange={setFilters}
onClearFilters={() => setFilters([])}
getFilterFieldValue={getFilterFieldValue}
tabs={[
{ id: 'all', label: 'Все' },
{ id: 'enabled', label: 'Включён' },
{ id: 'disabled', label: 'Выключен' },
]}
activeTab={activeTab}
onTabChange={setActiveTab}
tabFilter={tabFilter}
searchQuery={searchQuery}
onSearchChange={setSearchQuery}
searchPlaceholder="Поиск наборов…"
getSearchText={getSearchText}
isLoading={setsQ.isLoading}
isError={setsQ.isError}
error={setsQ.error}