Skip to content

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

typeControlGiá trị trong filterValuesChữ trên thẻ điều kiện
inputÔ nhập (Enter = Áp dụng)chuỗi đã cắt khoảng trắngchính chuỗi đó
selectSelect tìm theo nhãn; options, multiplevalue hoặc mảng valuenhãn option, nối bằng dấu phẩy
dateDatePicker'YYYY-MM-DD'DD/MM/YYYY
dateRangeRangePicker['YYYY-MM-DD', 'YYYY-MM-DD']DD/MM/YYYY – DD/MM/YYYY
customSlot #filterFieldtuỳ controlformat(value) nếu có

Mọi trường đều có key, label, placeholder?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>

valuesbả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 #filterFieldCTable 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:filterValues rồ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. 0false vẫn là điều kiện hợp lệ.
  • Chấm đỏ trên nút "Lọc" và aria-label củ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