naive-ui
Version:
A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast
303 lines (302 loc) • 17.8 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const seemly_1 = require("seemly");
const vue_1 = require("vue");
const _internal_1 = require("../../_internal");
const _mixins_1 = require("../../_mixins");
const _utils_1 = require("../../_utils");
const pagination_1 = require("../../pagination");
const styles_1 = require("../styles");
const interface_1 = require("./interface");
const MainTable_1 = __importDefault(require("./MainTable"));
const index_cssr_1 = __importDefault(require("./styles/index.cssr"));
const use_check_1 = require("./use-check");
const use_expand_1 = require("./use-expand");
const use_group_header_1 = require("./use-group-header");
const use_resizable_1 = require("./use-resizable");
const use_scroll_1 = require("./use-scroll");
const use_table_data_1 = require("./use-table-data");
const utils_1 = require("./utils");
exports.default = (0, vue_1.defineComponent)({
name: 'DataTable',
alias: ['AdvancedTable'],
props: interface_1.dataTableProps,
slots: Object,
setup(props, { slots }) {
if (process.env.NODE_ENV !== 'production') {
(0, vue_1.watchEffect)(() => {
if (props.onPageChange !== undefined) {
(0, _utils_1.warnOnce)('data-table', '`on-page-change` is deprecated, please use `on-update:page` instead.');
}
if (props.onPageSizeChange !== undefined) {
(0, _utils_1.warnOnce)('data-table', '`on-page-size-change` is deprecated, please use `on-update:page-size` instead.');
}
if (props.onSorterChange !== undefined) {
(0, _utils_1.warnOnce)('data-table', '`on-sorter-change` is deprecated, please use `on-update:sorter` instead.');
}
if (props.onFiltersChange !== undefined) {
(0, _utils_1.warnOnce)('data-table', '`on-filters-change` is deprecated, please use `on-update:filters` instead.');
}
if (props.onCheckedRowKeysChange !== undefined) {
(0, _utils_1.warnOnce)('data-table', '`on-checked-row-keys-change` is deprecated, please use `on-update:checked-row-keys` instead.');
}
});
}
const { mergedBorderedRef, mergedClsPrefixRef, inlineThemeDisabled, mergedRtlRef } = (0, _mixins_1.useConfig)(props);
const rtlEnabledRef = (0, _mixins_1.useRtl)('DataTable', mergedRtlRef, mergedClsPrefixRef);
const mergedBottomBorderedRef = (0, vue_1.computed)(() => {
const { bottomBordered } = props;
// do not add bottom bordered class if bordered is true
// since border is displayed on wrapper
if (mergedBorderedRef.value)
return false;
if (bottomBordered !== undefined)
return bottomBordered;
return true;
});
const themeRef = (0, _mixins_1.useTheme)('DataTable', '-data-table', index_cssr_1.default, styles_1.dataTableLight, props, mergedClsPrefixRef);
const bodyWidthRef = (0, vue_1.ref)(null);
const mainTableInstRef = (0, vue_1.ref)(null);
const { getResizableWidth, clearResizableWidth, doUpdateResizableWidth } = (0, use_resizable_1.useResizable)();
const { rowsRef, colsRef, dataRelatedColsRef, hasEllipsisRef } = (0, use_group_header_1.useGroupHeader)(props, getResizableWidth);
const { treeMateRef, mergedCurrentPageRef, paginatedDataRef, rawPaginatedDataRef, selectionColumnRef, hoverKeyRef, mergedPaginationRef, mergedFilterStateRef, mergedSortStateRef, childTriggerColIndexRef, doUpdatePage, doUpdateFilters, onUnstableColumnResize, deriveNextSorter, filter, filters, clearFilter, clearFilters, clearSorter, page, sort } = (0, use_table_data_1.useTableData)(props, { dataRelatedColsRef });
const downloadCsv = (options) => {
const { fileName = 'data.csv', keepOriginalData = false } = options || {};
const data = keepOriginalData ? props.data : rawPaginatedDataRef.value;
const csvData = (0, utils_1.generateCsv)(props.columns, data, props.getCsvCell, props.getCsvHeader);
const blob = new Blob([csvData], { type: 'text/csv;charset=utf-8' });
const downloadUrl = URL.createObjectURL(blob);
(0, _utils_1.download)(downloadUrl, fileName.endsWith('.csv') ? fileName : `${fileName}.csv`);
URL.revokeObjectURL(downloadUrl);
};
const { doCheckAll, doUncheckAll, doCheck, doUncheck, headerCheckboxDisabledRef, someRowsCheckedRef, allRowsCheckedRef, mergedCheckedRowKeySetRef, mergedInderminateRowKeySetRef } = (0, use_check_1.useCheck)(props, {
selectionColumnRef,
treeMateRef,
paginatedDataRef
});
const { stickyExpandedRowsRef, mergedExpandedRowKeysRef, renderExpandRef, expandableRef, doUpdateExpandedRowKeys } = (0, use_expand_1.useExpand)(props, treeMateRef);
const { handleTableBodyScroll, handleTableHeaderScroll, syncScrollState, setHeaderScrollLeft, leftActiveFixedColKeyRef, leftActiveFixedChildrenColKeysRef, rightActiveFixedColKeyRef, rightActiveFixedChildrenColKeysRef, leftFixedColumnsRef, rightFixedColumnsRef, fixedColumnLeftMapRef, fixedColumnRightMapRef } = (0, use_scroll_1.useScroll)(props, {
bodyWidthRef,
mainTableInstRef,
mergedCurrentPageRef
});
const { localeRef } = (0, _mixins_1.useLocale)('DataTable');
const mergedTableLayoutRef = (0, vue_1.computed)(() => {
// Layout
// virtual |descrete header | ellpisis => fixed
// = virtual | maxHeight | ellpisis => fixed
if (props.virtualScroll
|| props.flexHeight
|| props.maxHeight !== undefined
|| hasEllipsisRef.value) {
return 'fixed';
}
return props.tableLayout;
});
(0, vue_1.provide)(interface_1.dataTableInjectionKey, {
props,
treeMateRef,
renderExpandIconRef: (0, vue_1.toRef)(props, 'renderExpandIcon'),
loadingKeySetRef: (0, vue_1.ref)(new Set()),
slots,
indentRef: (0, vue_1.toRef)(props, 'indent'),
childTriggerColIndexRef,
bodyWidthRef,
componentId: (0, seemly_1.createId)(),
hoverKeyRef,
mergedClsPrefixRef,
mergedThemeRef: themeRef,
scrollXRef: (0, vue_1.computed)(() => props.scrollX),
rowsRef,
colsRef,
paginatedDataRef,
leftActiveFixedColKeyRef,
leftActiveFixedChildrenColKeysRef,
rightActiveFixedColKeyRef,
rightActiveFixedChildrenColKeysRef,
leftFixedColumnsRef,
rightFixedColumnsRef,
fixedColumnLeftMapRef,
fixedColumnRightMapRef,
mergedCurrentPageRef,
someRowsCheckedRef,
allRowsCheckedRef,
mergedSortStateRef,
mergedFilterStateRef,
loadingRef: (0, vue_1.toRef)(props, 'loading'),
rowClassNameRef: (0, vue_1.toRef)(props, 'rowClassName'),
mergedCheckedRowKeySetRef,
mergedExpandedRowKeysRef,
mergedInderminateRowKeySetRef,
localeRef,
expandableRef,
stickyExpandedRowsRef,
rowKeyRef: (0, vue_1.toRef)(props, 'rowKey'),
renderExpandRef,
summaryRef: (0, vue_1.toRef)(props, 'summary'),
virtualScrollRef: (0, vue_1.toRef)(props, 'virtualScroll'),
virtualScrollXRef: (0, vue_1.toRef)(props, 'virtualScrollX'),
heightForRowRef: (0, vue_1.toRef)(props, 'heightForRow'),
minRowHeightRef: (0, vue_1.toRef)(props, 'minRowHeight'),
virtualScrollHeaderRef: (0, vue_1.toRef)(props, 'virtualScrollHeader'),
headerHeightRef: (0, vue_1.toRef)(props, 'headerHeight'),
rowPropsRef: (0, vue_1.toRef)(props, 'rowProps'),
stripedRef: (0, vue_1.toRef)(props, 'striped'),
checkOptionsRef: (0, vue_1.computed)(() => {
const { value: selectionColumn } = selectionColumnRef;
return selectionColumn === null || selectionColumn === void 0 ? void 0 : selectionColumn.options;
}),
rawPaginatedDataRef,
filterMenuCssVarsRef: (0, vue_1.computed)(() => {
const { self: { actionDividerColor, actionPadding, actionButtonMargin } } = themeRef.value;
return {
'--n-action-padding': actionPadding,
'--n-action-button-margin': actionButtonMargin,
'--n-action-divider-color': actionDividerColor
};
}),
onLoadRef: (0, vue_1.toRef)(props, 'onLoad'),
mergedTableLayoutRef,
maxHeightRef: (0, vue_1.toRef)(props, 'maxHeight'),
minHeightRef: (0, vue_1.toRef)(props, 'minHeight'),
flexHeightRef: (0, vue_1.toRef)(props, 'flexHeight'),
headerCheckboxDisabledRef,
paginationBehaviorOnFilterRef: (0, vue_1.toRef)(props, 'paginationBehaviorOnFilter'),
summaryPlacementRef: (0, vue_1.toRef)(props, 'summaryPlacement'),
filterIconPopoverPropsRef: (0, vue_1.toRef)(props, 'filterIconPopoverProps'),
scrollbarPropsRef: (0, vue_1.toRef)(props, 'scrollbarProps'),
syncScrollState,
doUpdatePage,
doUpdateFilters,
getResizableWidth,
onUnstableColumnResize,
clearResizableWidth,
doUpdateResizableWidth,
deriveNextSorter,
doCheck,
doUncheck,
doCheckAll,
doUncheckAll,
doUpdateExpandedRowKeys,
handleTableHeaderScroll,
handleTableBodyScroll,
setHeaderScrollLeft,
renderCell: (0, vue_1.toRef)(props, 'renderCell')
});
const exposedMethods = {
filter,
filters,
clearFilters,
clearSorter,
page,
sort,
clearFilter,
downloadCsv,
scrollTo: (arg0, arg1) => {
var _a;
(_a = mainTableInstRef.value) === null || _a === void 0 ? void 0 : _a.scrollTo(arg0, arg1);
}
};
const cssVarsRef = (0, vue_1.computed)(() => {
const { size } = props;
const { common: { cubicBezierEaseInOut }, self: { borderColor, tdColorHover, tdColorSorting, tdColorSortingModal, tdColorSortingPopover, thColorSorting, thColorSortingModal, thColorSortingPopover, thColor, thColorHover, tdColor, tdTextColor, thTextColor, thFontWeight, thButtonColorHover, thIconColor, thIconColorActive, filterSize, borderRadius, lineHeight, tdColorModal, thColorModal, borderColorModal, thColorHoverModal, tdColorHoverModal, borderColorPopover, thColorPopover, tdColorPopover, tdColorHoverPopover, thColorHoverPopover, paginationMargin, emptyPadding, boxShadowAfter, boxShadowBefore, sorterSize, resizableContainerSize, resizableSize, loadingColor, loadingSize, opacityLoading, tdColorStriped, tdColorStripedModal, tdColorStripedPopover, [(0, _utils_1.createKey)('fontSize', size)]: fontSize, [(0, _utils_1.createKey)('thPadding', size)]: thPadding, [(0, _utils_1.createKey)('tdPadding', size)]: tdPadding } } = themeRef.value;
return {
'--n-font-size': fontSize,
'--n-th-padding': thPadding,
'--n-td-padding': tdPadding,
'--n-bezier': cubicBezierEaseInOut,
'--n-border-radius': borderRadius,
'--n-line-height': lineHeight,
'--n-border-color': borderColor,
'--n-border-color-modal': borderColorModal,
'--n-border-color-popover': borderColorPopover,
'--n-th-color': thColor,
'--n-th-color-hover': thColorHover,
'--n-th-color-modal': thColorModal,
'--n-th-color-hover-modal': thColorHoverModal,
'--n-th-color-popover': thColorPopover,
'--n-th-color-hover-popover': thColorHoverPopover,
'--n-td-color': tdColor,
'--n-td-color-hover': tdColorHover,
'--n-td-color-modal': tdColorModal,
'--n-td-color-hover-modal': tdColorHoverModal,
'--n-td-color-popover': tdColorPopover,
'--n-td-color-hover-popover': tdColorHoverPopover,
'--n-th-text-color': thTextColor,
'--n-td-text-color': tdTextColor,
'--n-th-font-weight': thFontWeight,
'--n-th-button-color-hover': thButtonColorHover,
'--n-th-icon-color': thIconColor,
'--n-th-icon-color-active': thIconColorActive,
'--n-filter-size': filterSize,
'--n-pagination-margin': paginationMargin,
'--n-empty-padding': emptyPadding,
'--n-box-shadow-before': boxShadowBefore,
'--n-box-shadow-after': boxShadowAfter,
'--n-sorter-size': sorterSize,
'--n-resizable-container-size': resizableContainerSize,
'--n-resizable-size': resizableSize,
'--n-loading-size': loadingSize,
'--n-loading-color': loadingColor,
'--n-opacity-loading': opacityLoading,
'--n-td-color-striped': tdColorStriped,
'--n-td-color-striped-modal': tdColorStripedModal,
'--n-td-color-striped-popover': tdColorStripedPopover,
'--n-td-color-sorting': tdColorSorting,
'--n-td-color-sorting-modal': tdColorSortingModal,
'--n-td-color-sorting-popover': tdColorSortingPopover,
'--n-th-color-sorting': thColorSorting,
'--n-th-color-sorting-modal': thColorSortingModal,
'--n-th-color-sorting-popover': thColorSortingPopover
};
});
const themeClassHandle = inlineThemeDisabled
? (0, _mixins_1.useThemeClass)('data-table', (0, vue_1.computed)(() => props.size[0]), cssVarsRef, props)
: undefined;
const mergedShowPaginationRef = (0, vue_1.computed)(() => {
if (!props.pagination)
return false;
if (props.paginateSinglePage)
return true;
const mergedPagination = mergedPaginationRef.value;
const { pageCount } = mergedPagination;
if (pageCount !== undefined)
return pageCount > 1;
return (mergedPagination.itemCount
&& mergedPagination.pageSize
&& mergedPagination.itemCount > mergedPagination.pageSize);
});
return Object.assign({ mainTableInstRef, mergedClsPrefix: mergedClsPrefixRef, rtlEnabled: rtlEnabledRef, mergedTheme: themeRef, paginatedData: paginatedDataRef, mergedBordered: mergedBorderedRef, mergedBottomBordered: mergedBottomBorderedRef, mergedPagination: mergedPaginationRef, mergedShowPagination: mergedShowPaginationRef, cssVars: inlineThemeDisabled ? undefined : cssVarsRef, themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass, onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender }, exposedMethods);
},
render() {
const { mergedClsPrefix, themeClass, onRender, $slots, spinProps } = this;
onRender === null || onRender === void 0 ? void 0 : onRender();
return ((0, vue_1.h)("div", { class: [
`${mergedClsPrefix}-data-table`,
this.rtlEnabled && `${mergedClsPrefix}-data-table--rtl`,
themeClass,
{
[`${mergedClsPrefix}-data-table--bordered`]: this.mergedBordered,
[`${mergedClsPrefix}-data-table--bottom-bordered`]: this.mergedBottomBordered,
[`${mergedClsPrefix}-data-table--single-line`]: this.singleLine,
[`${mergedClsPrefix}-data-table--single-column`]: this.singleColumn,
[`${mergedClsPrefix}-data-table--loading`]: this.loading,
[`${mergedClsPrefix}-data-table--flex-height`]: this.flexHeight
}
], style: this.cssVars },
(0, vue_1.h)("div", { class: `${mergedClsPrefix}-data-table-wrapper` },
(0, vue_1.h)(MainTable_1.default, { ref: "mainTableInstRef" })),
this.mergedShowPagination ? ((0, vue_1.h)("div", { class: `${mergedClsPrefix}-data-table__pagination` },
(0, vue_1.h)(pagination_1.NPagination, Object.assign({ theme: this.mergedTheme.peers.Pagination, themeOverrides: this.mergedTheme.peerOverrides.Pagination, disabled: this.loading }, this.mergedPagination)))) : null,
(0, vue_1.h)(vue_1.Transition, { name: "fade-in-scale-up-transition" }, {
default: () => {
return this.loading ? ((0, vue_1.h)("div", { class: `${mergedClsPrefix}-data-table-loading-wrapper` }, (0, _utils_1.resolveSlot)($slots.loading, () => [
(0, vue_1.h)(_internal_1.NBaseLoading, Object.assign({ clsPrefix: mergedClsPrefix, strokeWidth: 20 }, spinProps))
]))) : null;
}
})));
}
});
;