Complete reference for all inputs, outputs, and interfaces.
Type: NgxsmkColumn[]
Default: []
Description: Array of column definitions
columns = [
{
id: 'name',
name: 'Name',
prop: 'name',
width: 200,
sortable: true,
resizable: true
}
];Type: NgxsmkRow[]
Default: []
Description: Array of row data
rows = [
{ id: 1, name: 'John', email: 'john@example.com' },
{ id: 2, name: 'Jane', email: 'jane@example.com' }
];Type: 'single' | 'multi' | 'checkbox' | 'cell' | 'none'
Default: 'single'
Description: Row selection mode
<ngxsmk-datatable [selectionType]="'checkbox'">
</ngxsmk-datatable>Type: NgxsmkRow[]
Default: []
Description: Currently selected rows (two-way binding)
<ngxsmk-datatable [(selected)]="selectedRows">
</ngxsmk-datatable>Type: boolean
Default: true
Description: Enable virtual scrolling for large datasets
<ngxsmk-datatable [virtualScrolling]="true">
</ngxsmk-datatable>Type: number
Default: 50
Description: Height of each row in pixels
<ngxsmk-datatable [rowHeight]="60">
</ngxsmk-datatable>Type: number | 'auto'
Default: 'auto'
Description: Height of header row
<ngxsmk-datatable [headerHeight]="60">
</ngxsmk-datatable>Type: number
Default: 55
Description: Height of footer section
Type: PaginationConfig | null
Default: null
Description: Pagination configuration
pagination = {
pageSize: 10,
pageSizeOptions: [5, 10, 25, 50],
showPageSizeOptions: true,
showFirstLastButtons: true,
currentPage: 1,
totalItems: 100
};Type: boolean
Default: false
Description: Use server-side pagination
<ngxsmk-datatable
[externalPaging]="true"
(page)="loadPage($event)">
</ngxsmk-datatable>Type: boolean
Default: false
Description: Use server-side sorting
<ngxsmk-datatable
[externalSorting]="true"
(sort)="loadSortedData($event)">
</ngxsmk-datatable>Type: RowDetailView | null
Default: null
Description: Row detail configuration
rowDetail = {
template: this.detailTemplate,
rowHeight: 200,
toggleOnClick: true,
expandOnInit: false,
frozen: false
};Type: boolean
Default: false
Description: Enable column visibility toggle
<ngxsmk-datatable [columnVisibilityEnabled]="true">
</ngxsmk-datatable>Type: boolean
Default: false
Description: Show loading spinner
<ngxsmk-datatable [loadingIndicator]="loading">
</ngxsmk-datatable>Type: string
Default: 'No data available'
Description: Message shown when table is empty
Type: string
Default: ''
Description: Additional CSS class for the component
<ngxsmk-datatable [class]="'theme-dark'">
</ngxsmk-datatable>Type: EventEmitter<SelectionEvent>
Description: Emitted when row selection changes
<ngxsmk-datatable (select)="onSelect($event)">
</ngxsmk-datatable>
onSelect(event: SelectionEvent) {
console.log('Selected rows:', event.selected);
}Event Structure:
interface SelectionEvent {
selected: NgxsmkRow[];
row?: NgxsmkRow;
event?: Event;
}Type: EventEmitter<SortEvent>
Description: Emitted when column sort changes
<ngxsmk-datatable (sort)="onSort($event)">
</ngxsmk-datatable>
onSort(event: SortEvent) {
console.log('Sort:', event.column.name, event.newValue);
}Event Structure:
interface SortEvent {
column: NgxsmkColumn;
prevValue: SortDirection;
newValue: SortDirection;
}
type SortDirection = 'asc' | 'desc' | '';Type: EventEmitter<PageEvent>
Description: Emitted when page changes
<ngxsmk-datatable (page)="onPage($event)">
</ngxsmk-datatable>
onPage(event: PageEvent) {
console.log('Page:', event.page);
}Event Structure:
interface PageEvent {
page: number;
pageSize: number;
offset: number;
totalPages: number;
}Type: EventEmitter<any>
Description: Emitted when column is resized
<ngxsmk-datatable (columnResize)="onResize($event)">
</ngxsmk-datatable>
onResize(event: any) {
console.log('Column resized:', event.column.name, event.newWidth);
}Type: EventEmitter<{ column: NgxsmkColumn; visible: boolean }>
Description: Emitted when column visibility changes
<ngxsmk-datatable (columnVisibilityChange)="onVisibilityChange($event)">
</ngxsmk-datatable>
onVisibilityChange(event: { column: NgxsmkColumn; visible: boolean }) {
console.log(`Column ${event.column.name} is now ${event.visible ? 'visible' : 'hidden'}`);
}Type: EventEmitter<any>
Description: Emitted when row detail is toggled
<ngxsmk-datatable (rowDetailToggle)="onDetailToggle($event)">
</ngxsmk-datatable>
onDetailToggle(event: any) {
console.log('Row detail:', event.expanded ? 'expanded' : 'collapsed');
}Type: EventEmitter<any>
Description: Emitted when row or cell is activated (clicked)
<ngxsmk-datatable (activate)="onActivate($event)">
</ngxsmk-datatable>
onActivate(event: any) {
console.log('Activated:', event.row);
}Type: EventEmitter<void>
Description: Emitted when refresh button is clicked
<ngxsmk-datatable (refreshData)="loadData()">
</ngxsmk-datatable>interface NgxsmkColumn {
// Required
id: string; // Unique identifier
name: string; // Display name
// Optional
prop?: string; // Property key in row data
width?: number; // Fixed width in pixels
minWidth?: number; // Minimum width in pixels
maxWidth?: number; // Maximum width in pixels
flexGrow?: number; // Flex grow factor (responsive width)
sortable?: boolean; // Enable sorting
resizable?: boolean; // Enable resizing
frozen?: 'left' | 'right' | false; // Pin column
// Templates
cellTemplate?: TemplateRef<any>; // Custom cell template
headerTemplate?: TemplateRef<any>; // Custom header template
// Styling
cellClass?: string | Function; // CSS class for cells
headerClass?: string; // CSS class for header
}interface NgxsmkRow {
[key: string]: any; // Any properties for your data
// Internal properties (added by component)
$$expanded?: boolean; // Row detail expanded state
$$frozen?: boolean; // Row detail frozen state
$$index?: number; // Row index
}interface PaginationConfig {
pageSize: number; // Rows per page
pageSizeOptions?: number[]; // Available page sizes
showPageSizeOptions?: boolean; // Show page size dropdown
showFirstLastButtons?: boolean; // Show first/last buttons
showRangeLabels?: boolean; // Show "1-10 of 100"
showTotalItems?: boolean; // Show total count
totalItems?: number; // Total number of rows
currentPage?: number; // Current page (1-based)
maxSize?: number; // Max page buttons to show
}interface RowDetailView {
template: TemplateRef<any>; // Detail template
rowHeight?: number; // Detail row height
toggleOnClick?: boolean; // Toggle on row click
expandOnInit?: boolean; // Expand all on init
frozen?: boolean; // Keep details frozen during scroll
}interface SelectionEvent {
selected: NgxsmkRow[]; // Currently selected rows
row?: NgxsmkRow; // Row that triggered event
event?: Event; // Original DOM event
}Select all rows in the current page
@ViewChild(NgxsmkDatatableComponent) table!: NgxsmkDatatableComponent;
selectAllRows() {
this.table.selectAll();
}Clear all selections
clearSelection() {
this.table.deselectAll();
}Main component classes that can be targeted for styling:
// Main container
.ngxsmk-datatable { }
// Header
.ngxsmk-datatable__header { }
.ngxsmk-datatable__header-cell { }
.ngxsmk-datatable__header-cell--sortable { }
.ngxsmk-datatable__header-cell--sorted { }
// Body
.ngxsmk-datatable__body { }
.ngxsmk-datatable__row { }
.ngxsmk-datatable__row--selected { }
.ngxsmk-datatable__row--odd { }
.ngxsmk-datatable__row--even { }
// Cells
.ngxsmk-datatable__cell { }
.ngxsmk-datatable__cell--frozen-left { }
.ngxsmk-datatable__cell--frozen-right { }
// Row details
.ngxsmk-datatable__row-detail { }
.ngxsmk-datatable__row-detail--expanded { }
// Footer
.ngxsmk-datatable__footer { }
// Loading
.ngxsmk-datatable__loading { }
.ngxsmk-datatable__empty { }All customizable CSS variables:
// Colors
--ngxsmk-dt-primary-color: #3b82f6;
--ngxsmk-dt-primary-hover: #2563eb;
--ngxsmk-dt-bg-white: #ffffff;
--ngxsmk-dt-bg-light: #f3f4f6;
--ngxsmk-dt-bg-hover: #f0f4ff;
--ngxsmk-dt-bg-selected: #e8f0ff;
// Text
--ngxsmk-dt-text-primary: #1f2937;
--ngxsmk-dt-text-secondary: #6b7280;
// Borders
--ngxsmk-dt-border-light: #f0f1f3;
--ngxsmk-dt-border-medium: #e5e7eb;
// Dimensions
--ngxsmk-dt-row-height: 54px;
--ngxsmk-dt-padding: 16px;
--ngxsmk-dt-font-size: 14px;
--ngxsmk-dt-radius-lg: 10px;
// Shadows
--ngxsmk-dt-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.08);See Customization Guide for complete list.