From 08ef9852d71c158a5e97b362e8a6ebcfa156be38 Mon Sep 17 00:00:00 2001
From: anandtiwary <52081890+anandtiwary@users.noreply.github.com>
Date: Wed, 13 Oct 2021 23:45:37 -0700
Subject: [PATCH 1/3] feat: adding a custom control template option for table
---
.../table/controls/table-controls.component.ts | 15 ++++++++++++++-
.../widgets/table/table-widget-base.model.ts | 10 ++++++++++
.../table/table-widget-renderer.component.ts | 12 ++++++++++++
.../table/table-widget-view-toggle.model.ts | 4 ++++
.../widgets/table/table-widget.model.ts | 17 +++++++++++++++++
5 files changed, 57 insertions(+), 1 deletion(-)
diff --git a/projects/components/src/table/controls/table-controls.component.ts b/projects/components/src/table/controls/table-controls.component.ts
index 6289032b4..e9dcf9fd9 100644
--- a/projects/components/src/table/controls/table-controls.component.ts
+++ b/projects/components/src/table/controls/table-controls.component.ts
@@ -6,7 +6,8 @@ import {
IterableDiffer,
IterableDiffers,
OnChanges,
- Output
+ Output,
+ TemplateRef
} from '@angular/core';
import { IconType } from '@hypertrace/assets-library';
import { TypedSimpleChanges } from '@hypertrace/common';
@@ -14,6 +15,7 @@ import { IconSize } from '../../icon/icon-size';
import { MultiSelectJustify } from '../../multi-select/multi-select-justify';
import { MultiSelectSearchMode, TriggerLabelDisplayMode } from '../../multi-select/multi-select.component';
import { ToggleItem } from '../../toggle-group/toggle-item';
+import { StatefulTableRow } from '../table-api';
import {
TableCheckboxChange,
TableCheckboxControl,
@@ -86,6 +88,11 @@ import {
[activeItem]="this.activeViewItem"
(activeItemChange)="this.onViewChange($event)"
>
+
+
+
`
@@ -114,6 +121,12 @@ export class TableControlsComponent implements OnChanges {
@Input()
public activeViewItem?: ToggleItem;
+ @Input()
+ public selectedRows?: StatefulTableRow[] = [];
+
+ @Input()
+ public customControlContent?: TemplateRef<{ selectedRows?: StatefulTableRow[] }>;
+
@Output()
public readonly searchChange: EventEmitter = new EventEmitter();
diff --git a/projects/observability/src/shared/dashboard/widgets/table/table-widget-base.model.ts b/projects/observability/src/shared/dashboard/widgets/table/table-widget-base.model.ts
index cb499423b..eca40d128 100644
--- a/projects/observability/src/shared/dashboard/widgets/table/table-widget-base.model.ts
+++ b/projects/observability/src/shared/dashboard/widgets/table/table-widget-base.model.ts
@@ -4,12 +4,14 @@ import {
BaseModel,
EnumPropertyTypeInstance,
ENUM_TYPE,
+ ModelTemplatePropertyType,
WidgetHeaderModel
} from '@hypertrace/dashboards';
import {
ARRAY_PROPERTY,
BOOLEAN_PROPERTY,
ModelApi,
+ ModelJson,
ModelModelPropertyTypeInstance,
ModelProperty,
ModelPropertyType,
@@ -75,6 +77,12 @@ export abstract class TableWidgetBaseModel extends BaseModel {
})
public checkboxOptions: TableWidgetControlCheckboxOptionModel[] = [];
+ @ModelProperty({
+ key: 'custom-control-widget',
+ type: ModelTemplatePropertyType.TYPE
+ })
+ public customControlModelJson?: ModelJson;
+
@ModelProperty({
key: 'mode',
displayName: 'Table Mode',
@@ -141,6 +149,8 @@ export abstract class TableWidgetBaseModel extends BaseModel {
return [];
}
+ public abstract getCustomControlWidgetModel(selectedRows?: TableRow[]): object | undefined;
+
public getSearchAttribute(): string | undefined {
return this.searchAttribute;
}
diff --git a/projects/observability/src/shared/dashboard/widgets/table/table-widget-renderer.component.ts b/projects/observability/src/shared/dashboard/widgets/table/table-widget-renderer.component.ts
index 7e6eb5082..c309c7a7f 100644
--- a/projects/observability/src/shared/dashboard/widgets/table/table-widget-renderer.component.ts
+++ b/projects/observability/src/shared/dashboard/widgets/table/table-widget-renderer.component.ts
@@ -61,6 +61,8 @@ import { TableWidgetModel } from './table-widget.model';
[searchPlaceholder]="this.api.model.getSearchPlaceholder()"
[selectControls]="this.selectControls$ | async"
[checkboxControls]="this.checkboxControls$ | async"
+ [selectedRows]="this.selectedRows"
+ [customControlContent]="customControlDetail"
[viewItems]="this.viewItems"
(searchChange)="this.onSearchChange($event)"
(selectChange)="this.onSelectChange($event)"
@@ -93,6 +95,10 @@ import { TableWidgetModel } from './table-widget.model';
+
+
+
+
`
})
export class TableWidgetRendererComponent
@@ -107,6 +113,8 @@ export class TableWidgetRendererComponent
public columnConfigs$!: Observable;
public combinedFilters$!: Observable;
+ public selectedRows?: StatefulTableRow[] = [];
+
private readonly toggleFilterSubject: Subject = new BehaviorSubject([]);
private readonly searchFilterSubject: Subject = new BehaviorSubject([]);
private readonly selectFilterSubject: BehaviorSubject = new BehaviorSubject([]);
@@ -152,6 +160,9 @@ export class TableWidgetRendererComponent
public getChildModel = (row: TableRow): object | undefined => this.model.getChildModel(row);
+ public getCustomControlWidgetModel = (selectedRows?: TableRow[]): object | undefined =>
+ this.model.getCustomControlWidgetModel(selectedRows);
+
protected fetchData(): Observable | undefined> {
return this.model.getData().pipe(
startWith(undefined),
@@ -369,6 +380,7 @@ export class TableWidgetRendererComponent
}
public onRowSelection(selections: StatefulTableRow[]): void {
+ this.selectedRows = selections;
if (this.api.model.getSelectionMode() === TableSelectionMode.Single) {
/**
* Execute selection handler for single selection mode only
diff --git a/projects/observability/src/shared/dashboard/widgets/table/table-widget-view-toggle.model.ts b/projects/observability/src/shared/dashboard/widgets/table/table-widget-view-toggle.model.ts
index d8a1cd484..025da6c18 100644
--- a/projects/observability/src/shared/dashboard/widgets/table/table-widget-view-toggle.model.ts
+++ b/projects/observability/src/shared/dashboard/widgets/table/table-widget-view-toggle.model.ts
@@ -73,6 +73,10 @@ export class TableWidgetViewToggleModel extends TableWidgetModel implements Mode
return this.delegateModel && this.delegateModel?.getChildModel(row);
}
+ public getCustomControlWidgetModel(selectedRows?: TableRow[]): object | undefined {
+ return this.delegateModel && this.delegateModel?.getCustomControlWidgetModel(selectedRows);
+ }
+
public getRowSelectionHandlers(row: TableRow): TableWidgetRowSelectionModel[] {
return this.delegateModel && this.delegateModel?.getRowSelectionHandlers(row).length > 0
? this.delegateModel?.getRowSelectionHandlers(row)
diff --git a/projects/observability/src/shared/dashboard/widgets/table/table-widget.model.ts b/projects/observability/src/shared/dashboard/widgets/table/table-widget.model.ts
index e6b7f8efe..13d1f046e 100644
--- a/projects/observability/src/shared/dashboard/widgets/table/table-widget.model.ts
+++ b/projects/observability/src/shared/dashboard/widgets/table/table-widget.model.ts
@@ -83,6 +83,12 @@ export class TableWidgetModel extends TableWidgetBaseModel {
})
public childTemplate?: ModelJson;
+ @ModelProperty({
+ key: 'custom-control-widget',
+ type: ModelTemplatePropertyType.TYPE
+ })
+ public customControlModelJson?: ModelJson;
+
@ModelProperty({
key: 'fetchEditableColumns',
displayName: 'Query for additional columns not provided',
@@ -101,6 +107,17 @@ export class TableWidgetModel extends TableWidgetBaseModel {
return this.rowSelectionHandlers ?? [];
}
+ public getCustomControlWidgetModel(selectedRows?: TableRow[]): object | undefined {
+ if (this.customControlModelJson) {
+ const childModel = this.api.createChild