Skip to content

CFilterBar

Thanh lọc ngang đặt phía trên bảng: ô tìm kiếm dựng sẵn, chỗ cắm vài control lọc, nút Đặt lại.

Dùng khi: trang danh sách chỉ cần hai đến ba điều kiện lọc và muốn chúng luôn nhìn thấy.

Không dùng khi: từ bốn điều kiện trở lên, hoặc điều kiện phức tạp (khoảng ngày, chọn nhiều cấp) — dùng drawer lọc dựng sẵn của CTable, gọn hơn và có sẵn thanh điều kiện đang áp dụng.

Component không tự gọi API

CFilterBar chỉ phát sự kiện; trang quyết định làm gì:

Sự kiệnKhi nào
@search(value)Bấm nút tìm hoặc nhấn Enter trong ô tìm kiếm
@resetBấm "Đặt lại" — ô tìm kiếm đã được xoá, các control khác do trang tự xoá
update:searchValueMỗi lần gõ (qua v-model:search-value)
ts
function onSearch(value: string) {
  filters.value = { ...filters.value, keyword: value }
  reload()               // useTable
}

function onReset() {
  status.value = undefined   // xoá control của trang
  filters.value = {}
  reload()
}

Quên xử lý @reset là lỗi hay gặp nhất: ô tìm kiếm trắng nhưng select vẫn giữ giá trị cũ.

Cắm control lọc

Slot mặc định nhận bất kỳ control nào của @tasco/ui:

vue
<CFilterBar v-model:search-value="keyword" @search="onSearch" @reset="onReset">
  <CSelect v-model:value="status" placeholder="Trạng thái" allow-clear style="min-width: 160px" />
  <CRangePicker v-model:value="range" />

  <template #actions>
    <CButton variant="outline">Xuất Excel</CButton>
  </template>
</CFilterBar>

Slot #actions đặt nút phụ sau ô tìm kiếm — dành cho hành động liên quan tới tập dữ liệu đang lọc, không phải hành động của cả trang (những cái đó thuộc về CPageHeader).

Đặt min-width cho select để thanh lọc không nhảy khi đổi giá trị.

Khoá khi đang tải

vue
<CFilterBar :loading="loading" />

loading khoá ô tìm kiếm và nút, tránh người dùng bắn liên tiếp nhiều lời gọi trong lúc bảng đang tải.

API

Props

TênKiểuMặc địnhMô tả
searchValuestring''v-model:searchValue — text ô tìm kiếm.
searchPlaceholderstring'Tìm kiếm…'Gợi ý trong ô tìm kiếm.
showSearchbooleantrueHiện ô tìm kiếm.
showResetbooleantrueHiện nút "Đặt lại" (sự kiện reset).
loadingbooleanfalseKhoá thanh lọc khi trang đang tải dữ liệu.

Sự kiện

TênPayloadMô tả
update:searchValue[v: string]v-model:searchValue.
search[value: string]Bấm nút tìm kiếm hoặc nhấn Enter — trang tự gọi useTable.reload().
reset[]Bấm "Đặt lại": text tìm kiếm đã được xoá, trang tự xoá các bộ lọc còn lại.

Slot

TênProps của slotMô tả
#defaultanyCác control lọc đặt bên trái (CSelect, CDatePicker…).
#actionsanyNút phụ đặt sau ô tìm kiếm.

Khả năng tiếp cận

  • Ô tìm kiếm là <input> thật, Enter kích hoạt tìm kiếm — không cần bấm chuột.
  • Mỗi control lọc cắm vào slot cần nhãn riêng (placeholder là gợi ý, không thay được nhãn với trình đọc màn hình): dùng aria-label khi không có nhãn hiển thị.
  • Sau khi bấm Đặt lại, giữ focus ở thanh lọc để người dùng bàn phím tiếp tục thao tác.

Lưu ý

  • Không tự debounce: gõ tới đâu gọi API tới đó là quyết định của trang.
  • Điều kiện đang áp dụng không hiện thành thẻ như drawer của CTable — cần nhìn thấy điều kiện thì chọn drawer.
  • Thanh lọc nằm ngoài bảng, nên khi bảng thu gọn (collapsible) thanh lọc vẫn hiện.

Liên quan