Skip to content

Commit 9e33e1c

Browse files
bcb37Copilot
andauthored
add experiment list modals and functionality (#2638)
* add experiment list modals and functionality * Update frontend/projects/upgrade/src/app/core/experiments/store/experiments.reducer.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update frontend/projects/upgrade/src/app/core/experiments/store/experiments.reducer.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add missing text values --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 44b214f commit 9e33e1c

File tree

22 files changed

+602
-38
lines changed

22 files changed

+602
-38
lines changed

frontend/projects/upgrade/src/app/core/experiments/experiments.data.service.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import {
44
ExperimentStateInfo,
55
ExperimentPaginationParams,
66
UpdateExperimentFilterModeRequest,
7+
ExperimentSegmentListResponse,
78
} from './store/experiments.model';
89
import { HttpClient, HttpParams } from '@angular/common/http';
910
import { ENV, Environment } from '../../../environments/environment-types';
1011
import { ExperimentFile } from '../../features/dashboard/home/components/modal/import-experiment/import-experiment.component';
11-
import { map } from 'rxjs/operators';
1212
import { Observable } from 'rxjs';
13+
import { ExperimentSegmentListRequest } from '../segments/store/segments.model';
1314

1415
@Injectable()
1516
export class ExperimentDataService {
@@ -108,6 +109,36 @@ export class ExperimentDataService {
108109
return this.http.post(url, params);
109110
}
110111

112+
addInclusionList(list: ExperimentSegmentListRequest): Observable<ExperimentSegmentListResponse> {
113+
const url = this.environment.api.addExperimentInclusionList;
114+
return this.http.post<ExperimentSegmentListResponse>(url, list);
115+
}
116+
117+
updateInclusionList(list: ExperimentSegmentListRequest): Observable<ExperimentSegmentListResponse> {
118+
const url = `${this.environment.api.addExperimentInclusionList}/${list.list.id}`;
119+
return this.http.put<ExperimentSegmentListResponse>(url, list);
120+
}
121+
122+
deleteInclusionList(segmentId: string) {
123+
const url = `${this.environment.api.addExperimentInclusionList}/${segmentId}`;
124+
return this.http.delete(url);
125+
}
126+
127+
addExclusionList(list: ExperimentSegmentListRequest): Observable<ExperimentSegmentListResponse> {
128+
const url = this.environment.api.addExperimentExclusionList;
129+
return this.http.post<ExperimentSegmentListResponse>(url, list);
130+
}
131+
132+
updateExclusionList(list: ExperimentSegmentListRequest): Observable<ExperimentSegmentListResponse> {
133+
const url = `${this.environment.api.addExperimentExclusionList}/${list.list.id}`;
134+
return this.http.put<ExperimentSegmentListResponse>(url, list);
135+
}
136+
137+
deleteExclusionList(segmentId: string) {
138+
const url = `${this.environment.api.addExperimentExclusionList}/${segmentId}`;
139+
return this.http.delete(url);
140+
}
141+
111142
fetchContextMetaData() {
112143
const url = this.environment.api.contextMetaData;
113144
return this.http.get(url);

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import { AppState } from '../core.state';
5151
import { map, filter, tap } from 'rxjs/operators';
5252
import { LocalStorageService } from '../local-storage/local-storage.service';
5353
import { ENV, Environment } from '../../../environments/environment-types';
54+
import { ExperimentSegmentListRequest } from '../segments/store/segments.model';
5455

5556
@Injectable()
5657
export class ExperimentService {
@@ -289,4 +290,28 @@ export class ExperimentService {
289290
metric_Name: 'Success Rate',
290291
};
291292
}
293+
294+
addExperimentInclusionPrivateSegmentList(list: ExperimentSegmentListRequest) {
295+
this.store$.dispatch(experimentAction.actionAddExperimentInclusionList({ list }));
296+
}
297+
298+
updateExperimentInclusionPrivateSegmentList(list: ExperimentSegmentListRequest) {
299+
this.store$.dispatch(experimentAction.actionUpdateExperimentInclusionList({ list }));
300+
}
301+
302+
deleteExperimentInclusionPrivateSegmentList(segmentId: string) {
303+
this.store$.dispatch(experimentAction.actionDeleteExperimentInclusionList({ segmentId }));
304+
}
305+
306+
addExperimentExclusionPrivateSegmentList(list: ExperimentSegmentListRequest) {
307+
this.store$.dispatch(experimentAction.actionAddExperimentExclusionList({ list }));
308+
}
309+
310+
updateExperimentExclusionPrivateSegmentList(list: ExperimentSegmentListRequest) {
311+
this.store$.dispatch(experimentAction.actionUpdateExperimentExclusionList({ list }));
312+
}
313+
314+
deleteExperimentExclusionPrivateSegmentList(segmentId: string) {
315+
this.store$.dispatch(experimentAction.actionDeleteExperimentExclusionList({ segmentId }));
316+
}
292317
}

frontend/projects/upgrade/src/app/core/experiments/store/experiments.actions.ts

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import {
1212
IEnrollmentStatByDate,
1313
IContextMetaData,
1414
UpdateExperimentFilterModeRequest,
15+
ExperimentSegmentListResponse,
1516
} from './experiments.model';
17+
import { ExperimentSegmentListRequest, ExperimentSegmentListDetails } from '../../segments/store/segments.model';
1618

1719
export const actionGetExperiments = createAction('[Experiment] Get Experiments', props<{ fromStarting?: boolean }>());
1820

@@ -254,3 +256,93 @@ export const actionBeginExperimentDetailStatsPolling = createAction(
254256
);
255257

256258
export const actionEndExperimentDetailStatsPolling = createAction('[Experiment] End polling for detail stats');
259+
260+
export const actionAddExperimentInclusionList = createAction(
261+
'[Experiment] Add Experiment Inclusion List',
262+
props<{ list: ExperimentSegmentListRequest }>()
263+
);
264+
265+
export const actionAddExperimentInclusionListSuccess = createAction(
266+
'[Experiment] Add Experiment Inclusion List Success',
267+
props<{ listResponse: ExperimentSegmentListResponse }>()
268+
);
269+
270+
export const actionAddExperimentInclusionListFailure = createAction(
271+
'[Experiment] Add Experiment Inclusion List Failure',
272+
props<{ error: any }>()
273+
);
274+
275+
export const actionUpdateExperimentInclusionList = createAction(
276+
'[Experiment] Update Experiment Inclusion List',
277+
props<{ list: ExperimentSegmentListRequest }>()
278+
);
279+
280+
export const actionUpdateExperimentInclusionListSuccess = createAction(
281+
'[Experiment] Update Experiment Inclusion List Success',
282+
props<{ listResponse: ExperimentSegmentListResponse }>()
283+
);
284+
285+
export const actionUpdateExperimentInclusionListFailure = createAction(
286+
'[Experiment] Update Experiment Inclusion List Failure',
287+
props<{ error: any }>()
288+
);
289+
290+
export const actionDeleteExperimentInclusionList = createAction(
291+
'[Experiment] Delete Experiment Inclusion List',
292+
props<{ segmentId: string }>()
293+
);
294+
295+
export const actionDeleteExperimentInclusionListSuccess = createAction(
296+
'[Experiment] Delete Experiment Inclusion List Success',
297+
props<{ segmentId: string }>()
298+
);
299+
300+
export const actionDeleteExperimentInclusionListFailure = createAction(
301+
'[Experiment] Delete Experiment Inclusion List Failure',
302+
props<{ error: any }>()
303+
);
304+
305+
export const actionAddExperimentExclusionList = createAction(
306+
'[Experiment] Add Experiment Exclusion List',
307+
props<{ list: ExperimentSegmentListRequest }>()
308+
);
309+
310+
export const actionAddExperimentExclusionListSuccess = createAction(
311+
'[Experiment] Add Experiment Exclusion List Success',
312+
props<{ listResponse: ExperimentSegmentListResponse }>()
313+
);
314+
315+
export const actionAddExperimentExclusionListFailure = createAction(
316+
'[Experiment] Add Experiment Exclusion List Failure',
317+
props<{ error: any }>()
318+
);
319+
320+
export const actionUpdateExperimentExclusionList = createAction(
321+
'[Experiment] Update Experiment Exclusion List',
322+
props<{ list: ExperimentSegmentListRequest }>()
323+
);
324+
325+
export const actionUpdateExperimentExclusionListSuccess = createAction(
326+
'[Experiment] Update Experiment Exclusion List Success',
327+
props<{ listResponse: ExperimentSegmentListResponse }>()
328+
);
329+
330+
export const actionUpdateExperimentExclusionListFailure = createAction(
331+
'[Experiment] Update Experiment Exclusion List Failure',
332+
props<{ error: any }>()
333+
);
334+
335+
export const actionDeleteExperimentExclusionList = createAction(
336+
'[Experiment] Delete Experiment Exclusion List',
337+
props<{ segmentId: string }>()
338+
);
339+
340+
export const actionDeleteExperimentExclusionListSuccess = createAction(
341+
'[Experiment] Delete Experiment Exclusion List Success',
342+
props<{ segmentId: string }>()
343+
);
344+
345+
export const actionDeleteExperimentExclusionListFailure = createAction(
346+
'[Experiment] Delete Experiment Exclusion List Failure',
347+
props<{ error: any }>()
348+
);

frontend/projects/upgrade/src/app/core/experiments/store/experiments.effects.ts

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import {
4141
selectIsPollingExperimentDetailStats,
4242
selectExperimentGraphRange,
4343
} from './experiments.selectors';
44-
import { interval } from 'rxjs';
44+
import { interval, of } from 'rxjs';
4545
import { selectCurrentUser } from '../../auth/store/auth.selectors';
4646
import { ENV, Environment } from '../../../../environments/environment-types';
4747
import JSZip from 'jszip';
@@ -512,6 +512,92 @@ export class ExperimentEffects {
512512
)
513513
);
514514

515+
addExperimentInclusionList$ = createEffect(() =>
516+
this.actions$.pipe(
517+
ofType(experimentAction.actionAddExperimentInclusionList),
518+
switchMap((action) => {
519+
return this.experimentDataService.addInclusionList(action.list).pipe(
520+
map((listResponse) => {
521+
this.commonModalEvents.forceCloseModal();
522+
return experimentAction.actionAddExperimentInclusionListSuccess({ listResponse });
523+
}),
524+
catchError((error) => of(experimentAction.actionAddExperimentInclusionListFailure({ error })))
525+
);
526+
})
527+
)
528+
);
529+
530+
updateExperimentInclusionList$ = createEffect(() =>
531+
this.actions$.pipe(
532+
ofType(experimentAction.actionUpdateExperimentInclusionList),
533+
switchMap((action) => {
534+
return this.experimentDataService.updateInclusionList(action.list).pipe(
535+
map((listResponse) => {
536+
this.commonModalEvents.forceCloseModal();
537+
return experimentAction.actionUpdateExperimentInclusionListSuccess({ listResponse });
538+
}),
539+
catchError((error) => of(experimentAction.actionUpdateExperimentInclusionListFailure({ error })))
540+
);
541+
})
542+
)
543+
);
544+
545+
deleteExperimentInclusionList$ = createEffect(() =>
546+
this.actions$.pipe(
547+
ofType(experimentAction.actionDeleteExperimentInclusionList),
548+
map((action) => action.segmentId),
549+
switchMap((segmentId) => {
550+
return this.experimentDataService.deleteInclusionList(segmentId).pipe(
551+
map(() => experimentAction.actionDeleteExperimentInclusionListSuccess({ segmentId })),
552+
catchError((error) => of(experimentAction.actionDeleteExperimentInclusionListFailure({ error })))
553+
);
554+
})
555+
)
556+
);
557+
558+
addExperimentExclusionList$ = createEffect(() =>
559+
this.actions$.pipe(
560+
ofType(experimentAction.actionAddExperimentExclusionList),
561+
switchMap((action) => {
562+
return this.experimentDataService.addExclusionList(action.list).pipe(
563+
map((listResponse) => {
564+
this.commonModalEvents.forceCloseModal();
565+
return experimentAction.actionAddExperimentExclusionListSuccess({ listResponse });
566+
}),
567+
catchError((error) => of(experimentAction.actionAddExperimentExclusionListFailure({ error })))
568+
);
569+
})
570+
)
571+
);
572+
573+
updateExperimentExclusionList$ = createEffect(() =>
574+
this.actions$.pipe(
575+
ofType(experimentAction.actionUpdateExperimentExclusionList),
576+
switchMap((action) => {
577+
return this.experimentDataService.updateExclusionList(action.list).pipe(
578+
map((listResponse) => {
579+
this.commonModalEvents.forceCloseModal();
580+
return experimentAction.actionUpdateExperimentExclusionListSuccess({ listResponse });
581+
}),
582+
catchError((error) => of(experimentAction.actionUpdateExperimentExclusionListFailure({ error })))
583+
);
584+
})
585+
)
586+
);
587+
588+
deleteExperimentExclusionList$ = createEffect(() =>
589+
this.actions$.pipe(
590+
ofType(experimentAction.actionDeleteExperimentExclusionList),
591+
map((action) => action.segmentId),
592+
switchMap((segmentId) => {
593+
return this.experimentDataService.deleteExclusionList(segmentId).pipe(
594+
map(() => experimentAction.actionDeleteExperimentExclusionListSuccess({ segmentId })),
595+
catchError((error) => of(experimentAction.actionDeleteExperimentExclusionListFailure({ error })))
596+
);
597+
})
598+
)
599+
);
600+
515601
private download(filename, text, isZip: boolean) {
516602
const element = document.createElement('a');
517603
isZip

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,3 +606,7 @@ export interface RewardMetricData {
606606
metric_Operation: string;
607607
metric_Name: string;
608608
}
609+
610+
export interface ExperimentSegmentListResponse extends SegmentNew {
611+
experiment: Experiment;
612+
}

0 commit comments

Comments
 (0)