diff --git a/projects/demos/src/app/data-grid/data-grid-demo.component.html b/projects/demos/src/app/data-grid/data-grid-demo.component.html index 8d6f059d..0c9ec352 100644 --- a/projects/demos/src/app/data-grid/data-grid-demo.component.html +++ b/projects/demos/src/app/data-grid/data-grid-demo.component.html @@ -104,4 +104,9 @@

Data Formatting

The name field use a formatter.

+ + +

No Result

+ \ No newline at end of file diff --git a/projects/extensions/data-grid/column-menu.component.html b/projects/extensions/data-grid/column-menu.component.html new file mode 100755 index 00000000..8cb64282 --- /dev/null +++ b/projects/extensions/data-grid/column-menu.component.html @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ drag_handle + + +
+
+ +
+
+ + +
+
+
+
+ + + + {{col.label}} + + {{col.label}} + \ No newline at end of file diff --git a/projects/extensions/data-grid/column-selection.component.scss b/projects/extensions/data-grid/column-menu.component.scss similarity index 71% rename from projects/extensions/data-grid/column-selection.component.scss rename to projects/extensions/data-grid/column-menu.component.scss index f18e2e19..d62d0376 100755 --- a/projects/extensions/data-grid/column-selection.component.scss +++ b/projects/extensions/data-grid/column-menu.component.scss @@ -1,33 +1,33 @@ @import '~@angular/material/theming'; -.mtx-grid-column-selection { +.mtx-grid-column-menu { .mat-menu-content { padding: 0; } } -.mtx-grid-column-selection-inner { +.mtx-grid-column-menu-inner { padding: 16px; } -.mtx-grid-column-selection-list { +.mtx-grid-column-menu-list { display: block; max-width: 100%; &.cdk-drop-list-dragging { - .mtx-grid-column-selection-item:not(.cdk-drag-placeholder) { + .mtx-grid-column-menu-item:not(.cdk-drag-placeholder) { transition: transform 250ms cubic-bezier(0, 0, .2, 1); } } &.cdk-drop-list { - .mtx-grid-column-selection-label { + .mtx-grid-column-menu-item-label { padding: 0 4px; } } } -.mtx-grid-column-selection-item { +.mtx-grid-column-menu-item { display: flex; flex-direction: row; align-items: center; diff --git a/projects/extensions/data-grid/column-selection.component.ts b/projects/extensions/data-grid/column-menu.component.ts similarity index 58% rename from projects/extensions/data-grid/column-selection.component.ts rename to projects/extensions/data-grid/column-menu.component.ts index 1aad4502..4b55f466 100755 --- a/projects/extensions/data-grid/column-selection.component.ts +++ b/projects/extensions/data-grid/column-menu.component.ts @@ -11,20 +11,35 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { MtxGridColumnSelectionItem } from './grid.interface'; @Component({ - selector: 'mtx-grid-column-selection', - exportAs: 'mtxGridColumnSelection', - templateUrl: './column-selection.component.html', - styleUrls: ['./column-selection.component.scss'], + selector: 'mtx-grid-column-menu', + exportAs: 'mtxGridColumnMenu', + templateUrl: './column-menu.component.html', + styleUrls: ['./column-menu.component.scss'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class MtxGridColumnSelectionComponent implements OnInit { +export class MtxGridColumnMenuComponent implements OnInit { @Input() columns = []; @Input() selectable = true; @Input() selectedType: 'show' | 'hide' = 'show'; @Input() sortable = true; @Input() dndSortable = true; + @Input() get buttonText() { + const defaultText = `Column ${this.selectedType === 'show' ? 'Shown' : 'Hidden'}`; + const text = this._buttonText ? this._buttonText : defaultText; + return text; + } + set buttonText(value: string) { + this._buttonText = value; + } + private _buttonText = ''; + + @Input() buttonType: 'raised' | 'stroked' | 'flat' | 'icon' | 'fab' | 'mini-fab' | '' = 'stroked'; + @Input() buttonColor: 'primary' | 'accent' | 'warn' | '' = ''; + @Input() buttonClass = ''; + @Input() buttonIcon = ''; + @Output() selectionChange = new EventEmitter(); @Output() sortChange = new EventEmitter(); @@ -37,9 +52,9 @@ export class MtxGridColumnSelectionComponent implements OnInit { return fields; } - constructor() { } + constructor() {} - ngOnInit() { } + ngOnInit() {} handleDrop(event: CdkDragDrop) { moveItemInArray(this.columns, event.previousIndex, event.currentIndex); diff --git a/projects/extensions/data-grid/column-selection.component.html b/projects/extensions/data-grid/column-selection.component.html deleted file mode 100755 index 0befc937..00000000 --- a/projects/extensions/data-grid/column-selection.component.html +++ /dev/null @@ -1,40 +0,0 @@ - - -
- -
-
- drag_handle - - -
-
- -
-
- - -
-
-
-
- - - - {{col.label}} - - {{col.label}} - \ No newline at end of file diff --git a/projects/extensions/data-grid/grid.component.html b/projects/extensions/data-grid/grid.component.html index 39c2fe8f..6651a727 100755 --- a/projects/extensions/data-grid/grid.component.html +++ b/projects/extensions/data-grid/grid.component.html @@ -3,35 +3,42 @@
- - + +
- + - + matColumnDef="MtxGridCheckboxColumnDef"> + + @@ -39,17 +46,17 @@ [sticky]="col.pinned==='left'" [stickyEnd]="col.pinned==='right'"> - + + - - - - + + + - - - - - + + - - + + - +
- - + - + - {{col.header}} - - + {{col.header}} + - +
+
+ + +
+
+ - - \ No newline at end of file + + + +
+ + + + {{noResultText}} +
\ No newline at end of file diff --git a/projects/extensions/data-grid/grid.component.scss b/projects/extensions/data-grid/grid.component.scss index 5ce1c0e8..dda23d98 100755 --- a/projects/extensions/data-grid/grid.component.scss +++ b/projects/extensions/data-grid/grid.component.scss @@ -61,7 +61,7 @@ .mat-header-cell:first-of-type { padding-left: 24px; - &.mat-checkbox-column-cell { + &.mtx-grid-checkbox-cell { padding-left: 10px; padding-right: 10px; } @@ -70,7 +70,7 @@ padding-left: 4px; padding-right: 24px; - &.mat-checkbox-column-cell { + &.mtx-grid-checkbox-cell { padding-left: 10px; padding-right: 10px; } @@ -111,11 +111,31 @@ } } - .mat-expanison-row { + .mtx-grid-expanison { + height: 0; overflow: hidden; + + .mat-cell { + padding-top: 0; + padding-bottom: 0; + } + + &.collapsed { + .mat-cell { + border-bottom-width: 0; + transition: border-bottom-width 225ms cubic-bezier(.4, 0, .2, 1); + } + } } - .mat-expanison-placeholder { + .mtx-grid-expanison-detail { + display: flex; + align-items: center; + min-height: 48px; + overflow: hidden; + } + + .mtx-grid-expanison-placeholder { display: inline-block; width: 40px; height: 40px; @@ -132,10 +152,6 @@ } } - .mat-row-last { - border-bottom-width: 0; - } - .mat-cell { .mat-cell-img { width: 30px; @@ -180,7 +196,7 @@ display: flex; } - .mat-checkbox-column-cell { + .mtx-grid-checkbox-cell { flex: none; justify-content: center; min-width: 40px; @@ -190,4 +206,11 @@ margin-left: 0; } } + + .mtx-grid-no-result { + display: flex; + justify-content: center; + align-items: center; + min-height: 150px; + } } diff --git a/projects/extensions/data-grid/grid.component.ts b/projects/extensions/data-grid/grid.component.ts index d67c97f8..211533e5 100755 --- a/projects/extensions/data-grid/grid.component.ts +++ b/projects/extensions/data-grid/grid.component.ts @@ -42,16 +42,9 @@ import { MtxGridService } from './grid.service'; export class MtxGridComponent implements OnInit, OnChanges { dataSource: MatTableDataSource; - @Input() displayedColumns: string[]; - @Input() columns: MtxGridColumn[] = []; - - columnSelectionData: MtxGridColumnSelectionItem[] = []; - + @Input() displayedColumns: string[]; @Input() data = []; - - @Input() summary = []; - @Input() length = 0; @Input() loading = false; @@ -65,19 +58,12 @@ export class MtxGridComponent implements OnInit, OnChanges { @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; @Input() showPaginator = true; - @Input() pageDisabled = false; - @Input() showFirstLastButtons = true; - @Input() pageIndex = 0; - @Input() pageSize = 10; - @Input() pageSizeOptions = [10, 50, 100]; - @Input() hidePageSize = false; - @Output() page = new EventEmitter(); @Output() sortChange = new EventEmitter(); @@ -85,70 +71,80 @@ export class MtxGridComponent implements OnInit, OnChanges { /** Hover & Striped style */ @Input() rowHover = false; - @Input() rowStriped = false; /** Expandable row */ - @Input() expandable = false; + expansionRowStates = []; + @Input() expandable = false; @Input() expansionTemplate: TemplateRef; - @Output() expansionChange = new EventEmitter(); - expansionRowStates = []; - /** Whether support multiple row/cell selection */ + @Input() multiSelectable = true; /** Row selection */ - @Input() rowSelectable = false; - - @Input() hideRowSelectionCheckbox = false; - private _selectedRow: any; - @Output() rowSelectionChange = new EventEmitter(); - rowSelection: SelectionModel; + @Input() rowSelectable = false; + @Input() hideRowSelectionCheckbox = false; + @Output() rowSelectionChange = new EventEmitter(); + /** Cell selection */ cellSelection = []; @Input() cellSelectable = true; - @Output() cellSelectionChange = new EventEmitter(); private _selectedCell: MtxGridCellSelectionDirective; /** Toolbar */ + @Input() showToolbar = false; - @Input() columnHideable = true; + columnMenuData: MtxGridColumnSelectionItem[] = []; + + @Input() columnMenuButton = false; + @Input() columnMenuButtonText = ''; + @Input() columnMenuButtonType = 'stroked'; + @Input() columnMenuButtonColor = ''; + @Input() columnMenuButtonClass = ''; + @Input() columnMenuButtonIcon = ''; + @Input() columnHideable = true; @Input() columnHidingChecked: 'show' | 'hide' = 'show'; + @Output() columnHidingChange = new EventEmitter(); @Input() columnMovable = true; + @Output() columnMovingChange = new EventEmitter(); @Input() columnPinnable = true; + @Output() columnPinningChange = new EventEmitter(); - @Output() columnHidingChange = new EventEmitter(); + // No Result - @Output() columnMovingChange = new EventEmitter(); + @Input() noResultText = 'No records found'; + @Input() noResultTemplate: TemplateRef; - @Output() columnPinningChange = new EventEmitter(); + get hasNoResult() { + return this.data.length === 0 && !this.loading; + } - constructor(private _dataGridSrv: MtxGridService) { } + constructor(private _dataGridSrv: MtxGridService) {} - ngOnInit() { } + ngOnInit() {} // Waiting for async data ngOnChanges() { this.displayedColumns = this.columns.filter(item => !item.hide).map(item => item.field); - this.columnSelectionData = this.columns.map(item => { + this.columnMenuData = this.columns.map(item => { return { label: item.header, field: item.field, @@ -161,7 +157,7 @@ export class MtxGridComponent implements OnInit, OnChanges { this.countPinnedPosition(); if (this.rowSelectable && !this.hideRowSelectionCheckbox) { - this.displayedColumns.unshift('MatCheckboxColumnDef'); + this.displayedColumns.unshift('MtxGridCheckboxColumnDef'); } // We should copy each item of data for expansion data @@ -287,7 +283,7 @@ export class MtxGridComponent implements OnInit, OnChanges { this.displayedColumns = Object.assign([], columns); if (this.rowSelectable && !this.hideRowSelectionCheckbox) { - this.displayedColumns.unshift('MatCheckboxColumnDef'); + this.displayedColumns.unshift('MtxGridCheckboxColumnDef'); } } @@ -297,7 +293,7 @@ export class MtxGridComponent implements OnInit, OnChanges { this.displayedColumns = Object.assign([], columns); if (this.rowSelectable && !this.hideRowSelectionCheckbox) { - this.displayedColumns.unshift('MatCheckboxColumnDef'); + this.displayedColumns.unshift('MtxGridCheckboxColumnDef'); } } diff --git a/projects/extensions/data-grid/grid.module.ts b/projects/extensions/data-grid/grid.module.ts index 5b8565e9..d9f7a2c8 100755 --- a/projects/extensions/data-grid/grid.module.ts +++ b/projects/extensions/data-grid/grid.module.ts @@ -18,7 +18,7 @@ import { DragDropModule } from '@angular/cdk/drag-drop'; import { MtxDialogModule } from '@ng-matero/extensions/dialog'; import { MtxGridComponent } from './grid.component'; import { MtxGridCellComponent } from './cell.component'; -import { MtxGridColumnSelectionComponent } from './column-selection.component'; +import { MtxGridColumnMenuComponent } from './column-menu.component'; import { MtxGridExpansionToggleDirective } from './expansion-toggle.directive'; import { MtxGridCellSelectionDirective } from './cell-selection.directive'; import { MtxGridService } from './grid.service'; @@ -45,17 +45,17 @@ import { MtxGridService } from './grid.service'; exports: [ MtxGridComponent, MtxGridCellComponent, - MtxGridColumnSelectionComponent, + MtxGridColumnMenuComponent, MtxGridExpansionToggleDirective, MtxGridCellSelectionDirective, ], declarations: [ MtxGridComponent, MtxGridCellComponent, - MtxGridColumnSelectionComponent, + MtxGridColumnMenuComponent, MtxGridExpansionToggleDirective, MtxGridCellSelectionDirective, ], providers: [MtxGridService], }) -export class MtxGridModule { } +export class MtxGridModule {} diff --git a/projects/extensions/data-grid/grid.service.ts b/projects/extensions/data-grid/grid.service.ts index 8a455795..436fc21a 100755 --- a/projects/extensions/data-grid/grid.service.ts +++ b/projects/extensions/data-grid/grid.service.ts @@ -3,7 +3,7 @@ import { MtxGridColumn } from './grid.interface'; @Injectable() export class MtxGridService { - constructor() { } + constructor() {} /** * Get cell value from column key diff --git a/projects/extensions/data-grid/public-api.ts b/projects/extensions/data-grid/public-api.ts index 95d2f025..aca971c6 100644 --- a/projects/extensions/data-grid/public-api.ts +++ b/projects/extensions/data-grid/public-api.ts @@ -3,6 +3,6 @@ export * from './grid.service'; export * from './grid.module'; export * from './grid.component'; export * from './cell.component'; -export * from './column-selection.component'; +export * from './column-menu.component'; export * from './expansion-toggle.directive'; export * from './cell-selection.directive';