Skip to content

Commit 8b85547

Browse files
committed
refactor to make timeline component generalizeable
1 parent 889df12 commit 8b85547

20 files changed

Lines changed: 376 additions & 202 deletions

File tree

backend/packages/Upgrade/src/api/controllers/validators/AuditLogParamsValidators.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ export class AuditLogParamsValidator {
1515

1616
@IsOptional()
1717
@IsString()
18-
@IsUUID('4')
18+
@IsUUID()
1919
public experimentId?: string;
2020
}

frontend/projects/upgrade/src/app/core/logs/logs.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ export class LogsService {
118118
this.store$.dispatch(logsActions.actionSetErrorLogFilter({ filterType }));
119119
}
120120

121-
fetchExperimentLogsById(experimentId: string) {
121+
getExperimentLogsById(experimentId: string) {
122122
return this.store$.pipe(select(selectExperimentLogs, { experimentId }));
123123
}
124124

frontend/projects/upgrade/src/app/core/logs/store/logs.model.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { AppState } from '../../core.module';
22
import { EntityState } from '@ngrx/entity';
33
import { LOG_TYPE, SERVER_ERROR } from 'upgrade_types';
4+
import { User } from '../../users/store/users.model';
45

56
export const NUMBER_OF_LOGS = 20;
7+
export const SYSTEM_USER_EMAIL = 'system@gmail.com';
68

79
export enum LogType {
810
ERROR_LOG = 'Error log',
@@ -34,12 +36,7 @@ export interface AuditLogs {
3436
versionNumber: number;
3537
type: LOG_TYPE;
3638
data: any;
37-
user?: {
38-
firstName: string;
39-
lastName: string;
40-
email?: string;
41-
imageUrl?: string;
42-
};
39+
user?: User;
4340
}
4441

4542
export interface ErrorLogs {
@@ -54,7 +51,7 @@ export interface ErrorLogs {
5451
name: string;
5552
}
5653

57-
export interface ExperimentLogsMetadata {
54+
export interface AuditLogsMetadata {
5855
logs: AuditLogs[];
5956
skip: number;
6057
total: number | null;
@@ -71,7 +68,7 @@ export interface LogState extends EntityState<AuditLogs | ErrorLogs> {
7168
totalErrorLogs: number;
7269
auditLogFilter: LOG_TYPE;
7370
errorLogFilter: SERVER_ERROR;
74-
experimentLogs: Record<string, ExperimentLogsMetadata>;
71+
experimentAuditLogs: Record<string, AuditLogsMetadata>;
7572
}
7673

7774
export interface State extends AppState {

frontend/projects/upgrade/src/app/core/logs/store/logs.reducer.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { createReducer, on, Action } from '@ngrx/store';
22
import { createEntityAdapter, EntityAdapter } from '@ngrx/entity';
3-
import { AuditLogs, LogState, ErrorLogs, ExperimentLogsMetadata } from './logs.model';
3+
import { AuditLogs, LogState, ErrorLogs, AuditLogsMetadata } from './logs.model';
44
import * as logsActions from './logs.actions';
55

66
export const adapter: EntityAdapter<AuditLogs | ErrorLogs> = createEntityAdapter<AuditLogs | ErrorLogs>();
77

88
export const { selectIds, selectEntities, selectAll, selectTotal } = adapter.getSelectors();
99

10-
const initialExperimentLogsMetadata: ExperimentLogsMetadata = {
10+
const initialAuditLogsMetadata: AuditLogsMetadata = {
1111
logs: [],
1212
skip: 0,
1313
total: null,
@@ -24,7 +24,7 @@ export const initialState: LogState = adapter.getInitialState({
2424
totalErrorLogs: null,
2525
auditLogFilter: null,
2626
errorLogFilter: null,
27-
experimentLogs: {},
27+
experimentAuditLogs: {},
2828
});
2929

3030
const reducer = createReducer(
@@ -67,11 +67,11 @@ const reducer = createReducer(
6767
on(logsActions.actionSetErrorLogFilter, (state, { filterType }) => ({ ...state, errorLogFilter: filterType })),
6868
// Experiment-specific log handlers
6969
on(logsActions.actionGetExperimentLogs, (state, { experimentId, fromStart }) => {
70-
const experimentLog = state.experimentLogs[experimentId] || initialExperimentLogsMetadata;
70+
const experimentLog = state.experimentAuditLogs[experimentId] || initialAuditLogsMetadata;
7171
return {
7272
...state,
73-
experimentLogs: {
74-
...state.experimentLogs,
73+
experimentAuditLogs: {
74+
...state.experimentAuditLogs,
7575
[experimentId]: {
7676
...experimentLog,
7777
isLoading: true,
@@ -81,13 +81,13 @@ const reducer = createReducer(
8181
};
8282
}),
8383
on(logsActions.actionGetExperimentLogsSuccess, (state, { experimentId, auditLogs, totalAuditLogs, fromStart }) => {
84-
const experimentLog = state.experimentLogs[experimentId] || initialExperimentLogsMetadata;
84+
const experimentLog = state.experimentAuditLogs[experimentId] || initialAuditLogsMetadata;
8585
const updatedLogs = fromStart ? auditLogs : [...experimentLog.logs, ...auditLogs];
8686

8787
return {
8888
...state,
89-
experimentLogs: {
90-
...state.experimentLogs,
89+
experimentAuditLogs: {
90+
...state.experimentAuditLogs,
9191
[experimentId]: {
9292
...experimentLog,
9393
logs: updatedLogs,
@@ -99,11 +99,11 @@ const reducer = createReducer(
9999
};
100100
}),
101101
on(logsActions.actionGetExperimentLogsFailure, (state, { experimentId }) => {
102-
const experimentLog = state.experimentLogs[experimentId] || initialExperimentLogsMetadata;
102+
const experimentLog = state.experimentAuditLogs[experimentId] || initialAuditLogsMetadata;
103103
return {
104104
...state,
105-
experimentLogs: {
106-
...state.experimentLogs,
105+
experimentAuditLogs: {
106+
...state.experimentAuditLogs,
107107
[experimentId]: {
108108
...experimentLog,
109109
isLoading: false,
@@ -112,11 +112,11 @@ const reducer = createReducer(
112112
};
113113
}),
114114
on(logsActions.actionSetExperimentLogFilter, (state, { experimentId, filterType }) => {
115-
const experimentLog = state.experimentLogs[experimentId] || initialExperimentLogsMetadata;
115+
const experimentLog = state.experimentAuditLogs[experimentId] || initialAuditLogsMetadata;
116116
return {
117117
...state,
118-
experimentLogs: {
119-
...state.experimentLogs,
118+
experimentAuditLogs: {
119+
...state.experimentAuditLogs,
120120
[experimentId]: {
121121
...experimentLog,
122122
filter: filterType,

frontend/projects/upgrade/src/app/core/logs/store/logs.selectors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export const selectAuditFilterType = createSelector(selectLogState, (state) => s
4040
export const selectErrorFilterType = createSelector(selectLogState, (state) => state.errorLogFilter);
4141

4242
// Experiment-specific log selectors
43-
export const selectExperimentLogsState = createSelector(selectLogState, (state) => state.experimentLogs);
43+
export const selectExperimentLogsState = createSelector(selectLogState, (state) => state.experimentAuditLogs);
4444

4545
export const selectExperimentLogsMetadata = createSelector(
4646
selectExperimentLogsState,

frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-log-section-card/experiment-log-section-card.component.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@
2020

2121
<!-- Timeline Content -->
2222
<ng-container content *ngIf="isSectionCardExpanded">
23-
<app-experiment-logs-timeline
23+
<common-audit-log-timeline
2424
[groupedLogs]="timelineDataSource$ | async"
2525
[isLoading]="isLoading$ | async"
2626
[isEmpty]="(experimentLogs$ | async)?.length === 0"
27+
[config]="timelineConfig"
2728
(scrolledToBottom)="fetchLogsOnScroll()"
2829
>
29-
</app-experiment-logs-timeline>
30+
</common-audit-log-timeline>
3031
</ng-container>
3132
</app-common-section-card>

frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-log-section-card/experiment-log-section-card.component.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ import { ExperimentService } from '../../../../../../../core/experiments/experim
1414
import { Experiment } from '../../../../../../../core/experiments/store/experiments.model';
1515
import { LogsService } from '../../../../../../../core/logs/logs.service';
1616
import { SharedModule } from '../../../../../../../shared/shared.module';
17-
import { ExperimentLogsTimelineComponent } from './experiment-logs-timeline/experiment-logs-timeline.component';
17+
import { CommonAuditLogTimelineComponent } from '../../../../../../../shared-standalone-component-lib/components/common-audit-log-timeline/common-audit-log-timeline.component';
1818
import { AuditLogs, LogDateFormatType } from '../../../../../../../core/logs/store/logs.model';
1919
import { LOG_TYPE } from 'upgrade_types';
2020
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
2121
import { combineLatest, Subject, Observable, BehaviorSubject } from 'rxjs';
2222
import { map, filter, takeUntil, switchMap, tap, take } from 'rxjs/operators';
2323
import { groupBy } from 'lodash';
24+
import { AuditLogTimelineConfig } from '../../../../../../../shared-standalone-component-lib/components/common-audit-log-timeline/common-audit-log-timeline-config.model';
25+
import { EXPERIMENT_TIMELINE_LOG_TYPE_CONFIG } from '../../../../../../../shared-standalone-component-lib/components/common-audit-log-timeline/configs/experiment-timeline.config';
2426

2527
/**
2628
* Section card component for displaying experiment-specific audit logs in a timeline format.
@@ -39,7 +41,7 @@ import { groupBy } from 'lodash';
3941
CommonSectionCardSearchHeaderComponent,
4042
TranslateModule,
4143
SharedModule,
42-
ExperimentLogsTimelineComponent,
44+
CommonAuditLogTimelineComponent,
4345
MatProgressSpinnerModule,
4446
],
4547
standalone: true,
@@ -67,6 +69,7 @@ export class ExperimentLogSectionCardComponent implements OnInit, OnDestroy {
6769
private currentExperimentId: string | null = null;
6870

6971
LogDateFormatType = LogDateFormatType;
72+
timelineConfig: AuditLogTimelineConfig = EXPERIMENT_TIMELINE_LOG_TYPE_CONFIG;
7073

7174
constructor(private readonly experimentService: ExperimentService, private readonly logsService: LogsService) {}
7275

@@ -86,7 +89,7 @@ export class ExperimentLogSectionCardComponent implements OnInit, OnDestroy {
8689
// Get raw logs observable
8790
this.experimentLogs$ = this.selectedExperiment$.pipe(
8891
filter((exp): exp is Experiment => !!exp),
89-
switchMap((exp) => this.logsService.fetchExperimentLogsById(exp.id)),
92+
switchMap((exp) => this.logsService.getExperimentLogsById(exp.id)),
9093
tap((logs) => {
9194
this.buildFilterOptions(logs);
9295
}),

frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.ts

Lines changed: 0 additions & 113 deletions
This file was deleted.

frontend/projects/upgrade/src/app/features/dashboard/logs/components/timeline/timeline.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Component, ChangeDetectionStrategy, Input } from '@angular/core';
22
import * as env from '../../../../../../environments/environment';
3-
import { LogType } from '../../../../../core/logs/store/logs.model';
3+
import { LogType, SYSTEM_USER_EMAIL } from '../../../../../core/logs/store/logs.model';
44
import { EXPERIMENT_LIST_OPERATION, FEATURE_FLAG_LIST_OPERATION, LOG_TYPE, SERVER_ERROR } from 'upgrade_types';
55
import Convert from 'ansi-to-html';
66

@@ -15,7 +15,7 @@ export class TimelineComponent {
1515
@Input() logData;
1616
@Input() logType: LogType;
1717
// Used to change setting icon based on theme
18-
systemUserEmail = 'system@gmail.com';
18+
systemUserEmail = SYSTEM_USER_EMAIL;
1919
endPoint = env.environment.apiBaseUrl.substring(0, env.environment.apiBaseUrl.lastIndexOf('/'));
2020

2121
get LogType() {

frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-log-section-card/experiment-log-diff-display/experiment-log-diff-display.component.html renamed to frontend/projects/upgrade/src/app/shared-standalone-component-lib/components/common-audit-log-timeline/common-audit-log-diff-display/common-audit-log-diff-display.component.html

File renamed without changes.

0 commit comments

Comments
 (0)