diff --git a/src/app/pages/pages-menu.ts b/src/app/pages/pages-menu.ts index 586bde89..6134b318 100644 --- a/src/app/pages/pages-menu.ts +++ b/src/app/pages/pages-menu.ts @@ -206,6 +206,10 @@ export const MENU_ITEMS: NbMenuItem[] = [ title: 'Smart Table', link: '/pages/tables/smart-table', }, + { + title: 'Tree Grid', + link: '/pages/tables/tree-grid', + }, ], }, { diff --git a/src/app/pages/tables/tables-routing.module.ts b/src/app/pages/tables/tables-routing.module.ts index 0a737d2e..3271c0a2 100644 --- a/src/app/pages/tables/tables-routing.module.ts +++ b/src/app/pages/tables/tables-routing.module.ts @@ -3,14 +3,21 @@ import { Routes, RouterModule } from '@angular/router'; import { TablesComponent } from './tables.component'; import { SmartTableComponent } from './smart-table/smart-table.component'; +import { TreeGridComponent } from './tree-grid/tree-grid.component'; const routes: Routes = [{ path: '', component: TablesComponent, - children: [{ - path: 'smart-table', - component: SmartTableComponent, - }], + children: [ + { + path: 'smart-table', + component: SmartTableComponent, + }, + { + path: 'tree-grid', + component: TreeGridComponent, + }, + ], }]; @NgModule({ @@ -22,4 +29,5 @@ export class TablesRoutingModule { } export const routedComponents = [ TablesComponent, SmartTableComponent, + TreeGridComponent, ]; diff --git a/src/app/pages/tables/tables.module.ts b/src/app/pages/tables/tables.module.ts index 5ee3ae10..a9074c4f 100644 --- a/src/app/pages/tables/tables.module.ts +++ b/src/app/pages/tables/tables.module.ts @@ -1,19 +1,24 @@ import { NgModule } from '@angular/core'; -import { NbCardModule } from '@nebular/theme'; +import { NbCardModule, NbIconModule, NbInputModule, NbTreeGridModule } from '@nebular/theme'; import { Ng2SmartTableModule } from 'ng2-smart-table'; import { ThemeModule } from '../../@theme/theme.module'; import { TablesRoutingModule, routedComponents } from './tables-routing.module'; +import { FsIconComponent } from './tree-grid/tree-grid.component'; @NgModule({ imports: [ NbCardModule, + NbTreeGridModule, + NbIconModule, + NbInputModule, ThemeModule, TablesRoutingModule, Ng2SmartTableModule, ], declarations: [ ...routedComponents, + FsIconComponent, ], }) export class TablesModule { } diff --git a/src/app/pages/tables/tree-grid/tree-grid.component.html b/src/app/pages/tables/tree-grid/tree-grid.component.html new file mode 100644 index 00000000..8e339f90 --- /dev/null +++ b/src/app/pages/tables/tree-grid/tree-grid.component.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + +
+ {{customColumn}} + + + {{row.data[customColumn]}} + + {{column}} + {{row.data[column] || '-'}}
+ +
+
diff --git a/src/app/pages/tables/tree-grid/tree-grid.component.scss b/src/app/pages/tables/tree-grid/tree-grid.component.scss new file mode 100644 index 00000000..b3d421f1 --- /dev/null +++ b/src/app/pages/tables/tree-grid/tree-grid.component.scss @@ -0,0 +1,47 @@ +button[nbTreeGridRowToggle] { + background: transparent; + border: none; + padding: 0; +} + +.search-label { + display: block; +} +.search-input { + margin-bottom: 1rem; +} + +.nb-column-name { + width: 100%; +} + +.nb-tree-grid-header-cell, +.nb-tree-grid-header-cell button { + text-transform: capitalize; +} + +@media screen and (min-width: 400px) { + .nb-column-name, + .nb-column-size { + width: 50%; + } +} + +@media screen and (min-width: 500px) { + .nb-column-name, + .nb-column-size, + .nb-column-kind { + width: 33.333%; + } +} + +@media screen and (min-width: 600px) { + .nb-column-name { + width: 31%; + } + .nb-column-size, + .nb-column-kind, + .nb-column-items { + width: 23%; + } +} diff --git a/src/app/pages/tables/tree-grid/tree-grid.component.ts b/src/app/pages/tables/tree-grid/tree-grid.component.ts new file mode 100644 index 00000000..d1cf35c4 --- /dev/null +++ b/src/app/pages/tables/tree-grid/tree-grid.component.ts @@ -0,0 +1,98 @@ +import { Component, Input } from '@angular/core'; +import { NbSortDirection, NbSortRequest, NbTreeGridDataSource, NbTreeGridDataSourceBuilder } from '@nebular/theme'; + +interface TreeNode { + data: T; + children?: TreeNode[]; + expanded?: boolean; +} + +interface FSEntry { + name: string; + size: string; + kind: string; + items?: number; +} + +@Component({ + selector: 'ngx-tree-grid', + templateUrl: './tree-grid.component.html', + styleUrls: ['./tree-grid.component.scss'], +}) +export class TreeGridComponent { + customColumn = 'name'; + defaultColumns = [ 'size', 'kind', 'items' ]; + allColumns = [ this.customColumn, ...this.defaultColumns ]; + + dataSource: NbTreeGridDataSource; + + sortColumn: string; + sortDirection: NbSortDirection = NbSortDirection.NONE; + + constructor(private dataSourceBuilder: NbTreeGridDataSourceBuilder) { + this.dataSource = this.dataSourceBuilder.create(this.data); + } + + updateSort(sortRequest: NbSortRequest): void { + this.sortColumn = sortRequest.column; + this.sortDirection = sortRequest.direction; + } + + getSortDirection(column: string): NbSortDirection { + if (this.sortColumn === column) { + return this.sortDirection; + } + return NbSortDirection.NONE; + } + + private data: TreeNode[] = [ + { + data: { name: 'Projects', size: '1.8 MB', items: 5, kind: 'dir' }, + children: [ + { data: { name: 'project-1.doc', kind: 'doc', size: '240 KB' } }, + { data: { name: 'project-2.doc', kind: 'doc', size: '290 KB' } }, + { data: { name: 'project-3', kind: 'txt', size: '466 KB' } }, + { data: { name: 'project-4.docx', kind: 'docx', size: '900 KB' } }, + ], + }, + { + data: { name: 'Reports', kind: 'dir', size: '400 KB', items: 2 }, + children: [ + { data: { name: 'Report 1', kind: 'doc', size: '100 KB' } }, + { data: { name: 'Report 2', kind: 'doc', size: '300 KB' } }, + ], + }, + { + data: { name: 'Other', kind: 'dir', size: '109 MB', items: 2 }, + children: [ + { data: { name: 'backup.bkp', kind: 'bkp', size: '107 MB' } }, + { data: { name: 'secret-note.txt', kind: 'txt', size: '2 MB' } }, + ], + }, + ]; + + getShowOn(index: number) { + const minWithForMultipleColumns = 400; + const nextColumnStep = 100; + return minWithForMultipleColumns + (nextColumnStep * index); + } +} + +@Component({ + selector: 'ngx-fs-icon', + template: ` + + + + + + `, +}) +export class FsIconComponent { + @Input() kind: string; + @Input() expanded: boolean; + + isDir(): boolean { + return this.kind === 'dir'; + } +}