diff --git a/projects/components/src/public-api.ts b/projects/components/src/public-api.ts index cbdafa48e..ce20398ed 100644 --- a/projects/components/src/public-api.ts +++ b/projects/components/src/public-api.ts @@ -312,6 +312,7 @@ export { TableCellParser } from './table/cells/table-cell-parser'; export * from './table/cells/data-parsers/table-cell-no-op-parser'; export * from './table/cells/data-parsers/table-cell-string-parser'; export * from './table/cells/data-parsers/table-cell-timestamp-parser'; +export * from './table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component' // Table Controls export * from './table/controls/table-controls.module'; diff --git a/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.scss b/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.scss similarity index 81% rename from projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.scss rename to projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.scss index f80b3d83f..88d0acf65 100644 --- a/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.scss +++ b/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.scss @@ -3,15 +3,14 @@ .string-array-cell { display: flex; - flex-direction: row; align-items: center; - .first-item { + .item { @include ellipsis-overflow(); padding-right: 8px; } - .summary-text { + .tooltip-item { padding: 0 6px; background-color: $gray-2; border-radius: 4px; diff --git a/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.test.ts b/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.test.ts new file mode 100644 index 000000000..e5be6dbf4 --- /dev/null +++ b/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.test.ts @@ -0,0 +1,50 @@ +import { FormattingModule } from '@hypertrace/common'; +import { TableCellNoOpParser, XMoreComponent } from '@hypertrace/components'; +import { createComponentFactory } from '@ngneat/spectator/jest'; +import { MockComponent } from 'ng-mocks'; +import { tableCellDataProvider, tableCellProviders } from '../../test/cell-providers'; +import { StringArrayWithXMore, StringArrayWithXMoreTableCellRendererComponent } from './string-array-with-x-more-table-cell-renderer.component'; + +describe('String array table cell renderer component', () => { + const buildComponent = createComponentFactory({ + component: StringArrayWithXMoreTableCellRendererComponent, + imports: [FormattingModule], + providers: [ + tableCellProviders( + { + id: 'test' + }, + new TableCellNoOpParser(undefined!) + ) + ], + declarations: [MockComponent(XMoreComponent)], + shallow: true + }); + + test('should render array with multiple items as expected', () => { + + const cellData: StringArrayWithXMore = { + items: ['first-item', 'second-item', 'third-item'], + maxToShow: 2 + } + const spectator = buildComponent({ + providers: [tableCellDataProvider(cellData)] + }); + + expect(spectator.queryAll('.item').length).toEqual(cellData.maxToShow); + expect(spectator.query(XMoreComponent)?.count).toEqual(1); + }); + + test('should render array with no item as expected', () => { + + const cellData: StringArrayWithXMore = { + items: [], + maxToShow: 2 + } + const spectator = buildComponent({ + providers: [tableCellDataProvider(cellData)] + }); + + expect(spectator.query('.empty-cell')).toExist(); + }); +}); diff --git a/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.ts b/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.ts new file mode 100644 index 000000000..54937794d --- /dev/null +++ b/projects/components/src/table/cells/data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component.ts @@ -0,0 +1,48 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { TableCellRenderer } from '../../table-cell-renderer'; +import { TableCellRendererBase } from '../../table-cell-renderer-base'; +import { CoreTableCellParserType } from '../../types/core-table-cell-parser-type'; +import { CoreTableCellRendererType } from '../../types/core-table-cell-renderer-type'; +import { TableCellAlignmentType } from '../../types/table-cell-alignment-type'; + +@Component({ + selector: 'ht-string-array-with-x-more-table-cell-renderer', + styleUrls: ['./string-array-with-x-more-table-cell-renderer.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` +
+
+ {{ item }} +
+ + +
+
+ {{ item }} +
+
+
+
+ + - + + ` +}) +@TableCellRenderer({ + type: CoreTableCellRendererType.StringArrayWithXMore, + alignment: TableCellAlignmentType.Left, + parser: CoreTableCellParserType.NoOp +}) +export class StringArrayWithXMoreTableCellRendererComponent extends TableCellRendererBase implements OnInit {} + +export interface StringArrayWithXMore{ + items: string[]; + maxToShow: number; +} \ No newline at end of file diff --git a/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.test.ts b/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.test.ts deleted file mode 100644 index b7071769c..000000000 --- a/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { FormattingModule } from '@hypertrace/common'; -import { TableCellNoOpParser } from '@hypertrace/components'; -import { createComponentFactory } from '@ngneat/spectator/jest'; -import { tableCellDataProvider, tableCellProviders } from '../../test/cell-providers'; -import { StringArrayTableCellRendererComponent } from './string-array-table-cell-renderer.component'; - -describe('String array table cell renderer component', () => { - const buildComponent = createComponentFactory({ - component: StringArrayTableCellRendererComponent, - imports: [FormattingModule], - providers: [ - tableCellProviders( - { - id: 'test' - }, - new TableCellNoOpParser(undefined!) - ) - ], - - shallow: true - }); - - test('should render an array with one item as expected', () => { - const spectator = buildComponent({ - providers: [tableCellDataProvider(['first-item'])] - }); - - expect(spectator.query('.first-item')).toHaveText('first-item'); - expect(spectator.query('.summary-text')).toHaveText(''); - }); - - test('should render an empty array as expected', () => { - const spectator = buildComponent({ - providers: [tableCellDataProvider([])] - }); - - expect(spectator.query('.first-item')).toHaveText('-'); - expect(spectator.query('.summary-text')).toHaveText(''); - }); - - test('should render array with multiple items as expected', () => { - const spectator = buildComponent({ - providers: [tableCellDataProvider(['first-item', 'second-item', 'third-item'])] - }); - - expect(spectator.query('.first-item')).toHaveText('first-item'); - expect(spectator.query('.summary-text')).toHaveText('+2'); - }); -}); diff --git a/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.ts b/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.ts deleted file mode 100644 index 996b2a676..000000000 --- a/projects/components/src/table/cells/data-renderers/string-array/string-array-table-cell-renderer.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core'; -import { TableColumnConfig, TableRow } from '../../../table-api'; -import { - TABLE_CELL_DATA, - TABLE_COLUMN_CONFIG, - TABLE_COLUMN_INDEX, - TABLE_DATA_PARSER, - TABLE_ROW_DATA -} from '../../table-cell-injection'; -import { TableCellParserBase } from '../../table-cell-parser-base'; -import { TableCellRenderer } from '../../table-cell-renderer'; -import { TableCellRendererBase } from '../../table-cell-renderer-base'; -import { CoreTableCellParserType } from '../../types/core-table-cell-parser-type'; -import { CoreTableCellRendererType } from '../../types/core-table-cell-renderer-type'; -import { TableCellAlignmentType } from '../../types/table-cell-alignment-type'; - -@Component({ - selector: 'ht-string-array-table-cell-renderer', - styleUrls: ['./string-array-table-cell-renderer.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - template: ` -
- {{ this.firstItem | htDisplayString }} - {{ this.summaryText }} - - -
{{ value }}
-
-
- ` -}) -@TableCellRenderer({ - type: CoreTableCellRendererType.StringArray, - alignment: TableCellAlignmentType.Left, - parser: CoreTableCellParserType.NoOp -}) -export class StringArrayTableCellRendererComponent extends TableCellRendererBase implements OnInit { - public firstItem!: string; - public summaryText!: string; - - public constructor( - @Inject(TABLE_COLUMN_CONFIG) columnConfig: TableColumnConfig, - @Inject(TABLE_COLUMN_INDEX) index: number, - @Inject(TABLE_DATA_PARSER) parser: TableCellParserBase, - @Inject(TABLE_CELL_DATA) cellData: string[], - @Inject(TABLE_ROW_DATA) rowData: TableRow - ) { - super(columnConfig, index, parser, cellData, rowData); - } - - public ngOnInit(): void { - super.ngOnInit(); - - this.firstItem = this.value[0]; - this.summaryText = this.value.length > 1 ? `+${this.value.length - 1}` : ''; - } -} diff --git a/projects/components/src/table/cells/table-cells.module.ts b/projects/components/src/table/cells/table-cells.module.ts index 4dfed1580..e46ca0db2 100644 --- a/projects/components/src/table/cells/table-cells.module.ts +++ b/projects/components/src/table/cells/table-cells.module.ts @@ -9,6 +9,7 @@ import { FilterButtonModule } from '../../filtering/filter-button/filter-button. import { FilterModalModule } from '../../filtering/filter-modal/filter-modal.module'; import { IconModule } from '../../icon/icon.module'; import { PopoverModule } from '../../popover/popover.module'; +import { XMoreModule } from '../../public-api'; import { TooltipModule } from '../../tooltip/tooltip.module'; import { TableHeaderCellRendererComponent } from '../header/table-header-cell-renderer.component'; import { TableCellBooleanParser } from './data-parsers/table-cell-boolean-parser'; @@ -22,7 +23,7 @@ import { StringEnumTableCellRendererComponent } from './data-renderers/enum/stri import { IconTableCellRendererComponent } from './data-renderers/icon/icon-table-cell-renderer.component'; import { NumericTableCellRendererComponent } from './data-renderers/numeric/numeric-table-cell-renderer.component'; import { RelativeTimestampTableCellRendererComponent } from './data-renderers/relative-timestamp/relative-timestamp-table-cell-renderer.component'; -import { StringArrayTableCellRendererComponent } from './data-renderers/string-array/string-array-table-cell-renderer.component'; +import { StringArrayWithXMoreTableCellRendererComponent } from './data-renderers/string-array-with-x-more-table-cell-renderer/string-array-with-x-more-table-cell-renderer.component'; import { TableDataCellRendererComponent } from './data-renderers/table-data-cell-renderer.component'; import { TextWithCopyActionTableCellRendererComponent } from './data-renderers/text-with-copy/text-with-copy-table-cell-renderer.component'; import { TextTableCellRendererComponent } from './data-renderers/text/text-table-cell-renderer.component'; @@ -52,7 +53,8 @@ export const TABLE_CELL_PARSERS = new InjectionToken('TABLE_CELL_PA FilterButtonModule, FilterModalModule, PopoverModule, - CopyToClipboardModule + CopyToClipboardModule, + XMoreModule, ], exports: [ TableHeaderCellRendererComponent, @@ -71,7 +73,7 @@ export const TABLE_CELL_PARSERS = new InjectionToken('TABLE_CELL_PA TimestampTableCellRendererComponent, TimeAgoTableCellRendererComponent, CodeTableCellRendererComponent, - StringArrayTableCellRendererComponent, + StringArrayWithXMoreTableCellRendererComponent, StringEnumTableCellRendererComponent, TextWithCopyActionTableCellRendererComponent, RelativeTimestampTableCellRendererComponent @@ -88,7 +90,7 @@ export const TABLE_CELL_PARSERS = new InjectionToken('TABLE_CELL_PA TimestampTableCellRendererComponent, TimeAgoTableCellRendererComponent, CodeTableCellRendererComponent, - StringArrayTableCellRendererComponent, + StringArrayWithXMoreTableCellRendererComponent, StringEnumTableCellRendererComponent, TextWithCopyActionTableCellRendererComponent, RelativeTimestampTableCellRendererComponent diff --git a/projects/components/src/table/cells/types/core-table-cell-renderer-type.ts b/projects/components/src/table/cells/types/core-table-cell-renderer-type.ts index 2917244bc..b873d76d0 100644 --- a/projects/components/src/table/cells/types/core-table-cell-renderer-type.ts +++ b/projects/components/src/table/cells/types/core-table-cell-renderer-type.ts @@ -5,7 +5,7 @@ export const enum CoreTableCellRendererType { Number = 'number', RowExpander = 'row-expander', RelativeTimestamp = 'relative-timestamp', - StringArray = 'string-array', + StringArrayWithXMore = 'string-array-with-x-more', StringEnum = 'string-enum', Text = 'text', TextWithCopyAction = 'text-with-copy-action',