Giao diện
CTable — lọc và tìm kiếm
Truyền filter-fields là bảng có sẵn một drawer lọc và thanh điều kiện đang áp dụng — trang chỉ khai báo trường lọc, giống như khai columns.
vue
<script setup lang="ts">
import type { TableFilterField } from '@tasco/ui'
const filterFields: TableFilterField[] = [
{ key: 'customer', label: 'Khách hàng', type: 'input', placeholder: 'Tên khách hàng' },
{ key: 'status', label: 'Trạng thái', type: 'select', options: STATUS_OPTIONS, multiple: true },
{ key: 'createdAt', label: 'Ngày tạo', type: 'dateRange' },
]
</script>
<template>
<CTable
:filter-fields="filterFields"
:filter-values="filterValues"
show-filter
@update:filter-values="onFilter"
/>
</template>Kiểu trường
type | Control | Giá trị trong filterValues | Chữ trên thẻ điều kiện |
|---|---|---|---|
input | Ô nhập (Enter = Áp dụng) | chuỗi đã cắt khoảng trắng | chính chuỗi đó |
select | Select tìm theo nhãn; options, multiple | value hoặc mảng value | nhãn option, nối bằng dấu phẩy |
date | DatePicker | 'YYYY-MM-DD' | DD/MM/YYYY |
dateRange | RangePicker | ['YYYY-MM-DD', 'YYYY-MM-DD'] | DD/MM/YYYY – DD/MM/YYYY |
custom | Slot #filterField | tuỳ control | format(value) nếu có |
Mọi trường đều có key, label, placeholder? và format?: (value) => string.
Trường tự dựng
vue
<template #filterField="{ field, values }">
<CInputNumber
:value="(values[field.key] as number | undefined)"
:min="0"
style="width: 100%"
@update:value="(value: unknown) => (values[field.key] = value)"
/>
</template>values là bản nháp của drawer: ghi thẳng vào values[field.key]. Khai format cho trường custom để thẻ điều kiện hiển thị được chữ dễ đọc thay vì [object Object].
Khai type: 'custom' mà quên slot #filterField → CTable ném lỗi [@tasco/ui] ngay khi dựng bảng.
Cách drawer làm việc
- Sửa trong drawer chưa ảnh hưởng bảng. Áp dụng mới phát
update:filterValuesrồi đóng. - Đóng drawer bằng ✕, Esc hay bấm nền đều bỏ nháp.
- Đặt lại chỉ xoá nháp — vẫn phải bấm Áp dụng.
- Đóng drawer thì focus quay lại nút "Lọc"; bỏ một thẻ điều kiện thì focus nhảy sang thẻ kế tiếp.
Giá trị phát ra
- Trường rỗng bị loại bỏ:
'',null,[], khoảng ngày trống.0vàfalsevẫn là điều kiện hợp lệ. - Chấm đỏ trên nút "Lọc" và
aria-labelcủa nút đếm theo số điều kiện đang áp dụng. - Khoá có giá trị nhưng không khai trong
filter-fields(ví dụ đọc từ URL) vẫn hiện thành thẻ, nhãn là chính khoá đó — framework không giấu "lọc ngầm".
Đi cùng useTable
vue
<CTable
:filter-values="filterValues"
@update:filter-values="onFilter"
@change="onChange"
/>useTable giữ bộ lọc form tách khỏi filter cột của a-table rồi mới gộp vào query.filters, nên đổi trang hay sắp xếp không làm mất bộ lọc. Trang tự viết @change mà không dùng useTable thì phải tự gộp — a-table phát lại filter cột ở mỗi lần change.
query.filters là object nên useApi nối vào query string dạng JSON. Backend cần dạng status=1&brand=GEELY thì quy đổi trong fetcher.
Không dùng drawer dựng sẵn
Không truyền filter-fields thì nút "Lọc" chỉ phát @filter — trang tự mở drawer riêng và tự đếm filter-count để hiện chấm đỏ:
vue
<CTable show-filter :filter-count="activeCount" @filter="openMyFilterDrawer" />Vài control lọc đơn giản đặt ngang phía trên bảng thì dùng CFilterBar; từ ba bốn trường trở lên nên chuyển sang drawer.
Liên quan
useTable— gộp bộ lọc vào truy vấn.- Trang danh sách — mẫu đầy đủ.
- Toolbar — ô tìm kiếm nhanh.