UNPKG

@coreui/vue-pro

Version:

UI Components Library for Vue.js

214 lines (210 loc) 10.7 kB
'use strict'; var vue = require('vue'); require('../form/CForm.js'); require('../form/CFormCheck.js'); require('../form/CFormFeedback.js'); require('../form/CFormFloating.js'); var CFormInput = require('../form/CFormInput.js'); require('../form/CFormLabel.js'); require('../form/CFormRange.js'); require('../form/CFormSelect.js'); require('../form/CFormSwitch.js'); require('../form/CFormText.js'); require('../form/CFormTextarea.js'); require('../form/CInputGroup.js'); require('../form/CInputGroupText.js'); require('../table/CTable.js'); require('../table/CTableBody.js'); require('../table/CTableCaption.js'); require('../table/CTableDataCell.js'); var CTableFoot = require('../table/CTableFoot.js'); var CTableHead = require('../table/CTableHead.js'); var CTableHeaderCell = require('../table/CTableHeaderCell.js'); var CTableRow = require('../table/CTableRow.js'); var utils = require('./utils.js'); const CSmartTableHead = vue.defineComponent({ name: 'CSmartTableHead', props: { as: { type: String, default: 'head', }, columnFilter: [Boolean, Object], columnFilterValue: Object, columnSorter: [Boolean, Object], columns: { type: Array, default: () => [], }, items: { type: Array, default: () => [], }, selectable: Boolean, selectAll: [Boolean, Object], selectedAll: [Boolean, String], showGroups: { type: Boolean, default: true, }, sorterState: { type: Array, default: () => [], } }, emits: ['customFilterChange', 'filterInput', 'filterChange', 'selectAllChecked', 'sortClick'], setup(props, { slots, emit }) { const selectedAll = vue.ref(); const seleactAllCheckboxRef = vue.ref(); const columns = vue.computed(() => utils.getColumns(props.columns)); const groups = vue.computed(() => utils.getColumnGroups(props.columns)); vue.watch(() => props.selectedAll, () => { selectedAll.value = props.selectedAll; }, { immediate: true, }); vue.watch([selectedAll, seleactAllCheckboxRef], () => { if (seleactAllCheckboxRef.value && props.selectedAll === true) { seleactAllCheckboxRef.value.indeterminate = false; seleactAllCheckboxRef.value.checked = true; return; } if (seleactAllCheckboxRef.value && props.selectedAll === 'indeterminate') { seleactAllCheckboxRef.value.checked = false; seleactAllCheckboxRef.value.indeterminate = true; return; } if (seleactAllCheckboxRef.value) { seleactAllCheckboxRef.value.indeterminate = false; seleactAllCheckboxRef.value.checked = false; } }); const columnSorterIcon = (column) => { if (utils.getColumnSorterState(utils.getColumnKey(column), props.sorterState) === 0) { return vue.h('span', { class: 'opacity-25 float-end me-1' }, slots.sortingIcon && slots.sortingIcon()); } if (utils.getColumnSorterState(utils.getColumnKey(column), props.sorterState) === 'asc') { return vue.h('span', { class: 'float-end me-1' }, slots.sortingIconAscending && slots.sortingIconAscending()); } if (utils.getColumnSorterState(utils.getColumnKey(column), props.sorterState) === 'desc') { return vue.h('span', { class: 'float-end me-1' }, slots.sortingIconDescending && slots.sortingIconDescending()); } return; }; return () => vue.h(props.as === 'head' ? CTableHead.CTableHead : CTableFoot.CTableFoot, {}, { default: () => [ props.showGroups && groups.value && groups.value.length > 0 && groups.value.map((row) => [ vue.h(CTableRow.CTableRow, {}, () => [ props.selectable && vue.h(CTableHeaderCell.CTableHeaderCell), row.map((cell) => vue.h(CTableHeaderCell.CTableHeaderCell, { colspan: cell.colspan, ...utils.getTableHeaderCellProps(cell), }, () => cell.label)), ]), ]), vue.h(CTableRow.CTableRow, {}, { default: () => [ props.selectable && vue.h(CTableHeaderCell.CTableHeaderCell, {}, () => vue.h('input', { class: 'form-check-input', type: 'checkbox', ref: seleactAllCheckboxRef, onClick: () => { if (selectedAll.value !== 'reset') { selectedAll.value = 'reset'; } else { selectedAll.value = ''; } emit('selectAllChecked'); }, })), columns.value.map((column, index) => { const isSortable = props.columnSorter && (typeof column === 'object' ? column.sorter === undefined ? true : column.sorter : true); return vue.h(CTableHeaderCell.CTableHeaderCell, { ...utils.getTableHeaderCellProps(column), style: utils.getTableHeaderCellStyles(column, props.columnSorter), ...(isSortable && { tabindex: 0, onClick: () => emit('sortClick', utils.getColumnKey(column), index), onKeydown: (event) => { if (event.key === 'Enter') { emit('sortClick', utils.getColumnKey(column), index); } if (event.key === 'ArrowUp') { event.preventDefault(); emit('sortClick', utils.getColumnKey(column), index, 'asc'); } if (event.key === 'ArrowDown') { event.preventDefault(); emit('sortClick', utils.getColumnKey(column), index, 'desc'); } }, }), }, { default: () => [ vue.h('div', { class: 'd-inline', }, utils.getColumnLabel(column)), props.columnSorter && (typeof column === 'object' ? typeof column.sorter === 'undefined' ? true : column.sorter : true) && columnSorterIcon(column), ], }); }), ], }), props.columnFilter && vue.h(CTableRow.CTableRow, {}, { default: () => [ props.selectable && vue.h(CTableHeaderCell.CTableHeaderCell), columns.value.map((column) => { return vue.h(CTableHeaderCell.CTableHeaderCell, { ...utils.getTableHeaderCellProps(column), }, { default: () => (typeof column === 'object' ? column.filter === undefined ? true : column.filter : true) ? typeof column !== 'string' && typeof column.filter === 'function' ? column.filter(utils.getColumnValues(props.items, utils.getColumnKey(column)), (value) => { emit('customFilterChange', utils.getColumnKey(column), value); }) : vue.h(CFormInput.CFormInput, { size: 'sm', onInput: (event) => { emit('filterInput', utils.getColumnKey(column), event.target.value); }, onChange: (event) => { emit('filterChange', utils.getColumnKey(column), event.target.value); }, 'aria-label': `column name: '${utils.getColumnLabel(column)}' filter input`, ...(props.columnFilterValue && props.columnFilterValue[utils.getColumnKey(column)] && { value: props.columnFilterValue[utils.getColumnKey(column)], }), }) : '', }); }), ], }), ], }); }, }); exports.CSmartTableHead = CSmartTableHead; //# sourceMappingURL=CSmartTableHead.js.map