diff --git a/packages/backend/src/api/DTO/ExperimentDTO.ts b/packages/backend/src/api/DTO/ExperimentDTO.ts index 0b938e106..d4950a904 100644 --- a/packages/backend/src/api/DTO/ExperimentDTO.ts +++ b/packages/backend/src/api/DTO/ExperimentDTO.ts @@ -173,9 +173,8 @@ export class PartitionValidator { @IsString() public site: string; - @IsOptional() @IsString() - public target?: string; + public target = ''; @IsOptional() @IsString() diff --git a/packages/backend/src/api/services/AnalyticsService.ts b/packages/backend/src/api/services/AnalyticsService.ts index 846d868ff..ba5f385f2 100644 --- a/packages/backend/src/api/services/AnalyticsService.ts +++ b/packages/backend/src/api/services/AnalyticsService.ts @@ -342,6 +342,8 @@ export class AnalyticsService { const excludeIfReached = row.excludeIfReached ? 'TRUE' : 'FALSE'; const stratification = row.stratification && row.stratificationValue ? `${row.stratification}: ${row.stratificationValue}` : 'NA'; + const target = row.target ? ` (${row.target})` : ''; + const decisionPoint = row.site + target; return { ExperimentId: row.experimentId, @@ -356,8 +358,7 @@ export class AnalyticsService { DesignType: row.designType, AlgorithmType: row.algorithmType, Stratification: stratification, - Site: row.site, - Target: row.target, + DecisionPoint: decisionPoint, ExcludeifReached: excludeIfReached, ConditionName: row.conditionName, Payload: row.payload ? row.payload : row.conditionName, @@ -406,8 +407,7 @@ export class AnalyticsService { DesignType: '', AlgorithmType: '', Stratification: '', - Site: '', - Target: '', + DecisionPoint: '', ExcludeifReached: '', ConditionName: '', Payload: '', diff --git a/packages/backend/src/api/services/ExperimentService.ts b/packages/backend/src/api/services/ExperimentService.ts index 2f63cbe13..62940974c 100644 --- a/packages/backend/src/api/services/ExperimentService.ts +++ b/packages/backend/src/api/services/ExperimentService.ts @@ -217,10 +217,13 @@ export class ExperimentService { const [experimentData, count] = await Promise.all([queryBuilderToReturn.getMany(), countQuery.getCount()]); return [ experimentData.map((experiment) => { + const experimentWithStringTargets = this.coerceExperimentDecisionPointTargets(experiment); return { - ...experiment, - state: EXPERIMENT_STATE_DISPLAY_NAME_OVERRIDES[experiment.state] || experiment.state, - stateTimeLogs: this.transformStateTimeLogs(experiment.stateTimeLogs), + ...experimentWithStringTargets, + state: + EXPERIMENT_STATE_DISPLAY_NAME_OVERRIDES[experimentWithStringTargets.state] || + experimentWithStringTargets.state, + stateTimeLogs: this.transformStateTimeLogs(experimentWithStringTargets.stateTimeLogs), }; }), count || 0, @@ -430,14 +433,15 @@ export class ExperimentService { public async getExperimentPartitions(experimentId: string, logger: UpgradeLogger): Promise { logger.info({ message: `getExperimentPartitions experiment => ${experimentId}` }); const experiment: Experiment = await this.findOne(experimentId, logger); - return experiment?.partitions; + return this.coerceDecisionPointTargets(experiment?.partitions || []); } public async getAllExperimentPartitions( logger: UpgradeLogger ): Promise>> { logger.info({ message: 'getAllExperimentPartitions experiment' }); - return this.decisionPointRepository.partitionPointAndName(); + const decisionPoints = await this.decisionPointRepository.partitionPointAndName(); + return this.coerceDecisionPointTargets(decisionPoints as DecisionPoint[]); } public async getAllUniqueIdentifiers(logger: UpgradeLogger): Promise { @@ -1868,9 +1872,11 @@ export class ExperimentService { } public formattingConditionPayload(experiment: Experiment): Experiment { - if (experiment.type === EXPERIMENT_TYPE.FACTORIAL) { + const experimentWithStringTargets = this.coerceExperimentDecisionPointTargets(experiment); + + if (experimentWithStringTargets.type === EXPERIMENT_TYPE.FACTORIAL) { const conditionPayload: ConditionPayload[] = []; - experiment.conditions.forEach((condition) => { + experimentWithStringTargets.conditions.forEach((condition) => { const conditionPayloads = condition.conditionPayloads.map((conditionPayload) => { return { ...conditionPayload, parentCondition: condition }; }); @@ -1878,10 +1884,10 @@ export class ExperimentService { delete condition.conditionPayloads; }); - return { ...experiment, conditionPayloads: conditionPayload }; + return { ...experimentWithStringTargets, conditionPayloads: conditionPayload }; } - const { conditions, partitions } = experiment; + const { conditions, partitions } = experimentWithStringTargets; const conditionPayload: ConditionPayload[] = []; partitions.forEach((partition) => { @@ -1895,7 +1901,7 @@ export class ExperimentService { } }); }); - return { ...experiment, conditionPayloads: conditionPayload }; + return { ...experimentWithStringTargets, conditionPayloads: conditionPayload }; } public reducedConditionPayload(experiment: Experiment): any { @@ -1910,6 +1916,8 @@ export class ExperimentService { } public formattingPayload(experiment: Experiment): any { + const experimentWithStringTargets = this.coerceExperimentDecisionPointTargets(experiment); + const updatedConditionPayloads = experiment.conditionPayloads.map((conditionPayload) => { const { payloadType, payloadValue, ...rest } = conditionPayload; return { @@ -1927,7 +1935,21 @@ export class ExperimentService { return { ...rest, levels: updatedLevels }; }); - return { ...experiment, factors: updatedFactors, conditionPayloads: updatedConditionPayloads }; + return { ...experimentWithStringTargets, factors: updatedFactors, conditionPayloads: updatedConditionPayloads }; + } + + private coerceDecisionPointTargets(decisionPoints: DecisionPoint[]): DecisionPoint[] { + return decisionPoints.map((decisionPoint) => ({ + ...decisionPoint, + target: decisionPoint.target ?? '', + })); + } + + private coerceExperimentDecisionPointTargets(experiment: Experiment): Experiment { + return { + ...experiment, + partitions: this.coerceDecisionPointTargets(experiment.partitions || []), + }; } private mapStatusStrings(statusString: string): string { diff --git a/packages/backend/test/integration/mockData/experiment/raw.ts b/packages/backend/test/integration/mockData/experiment/raw.ts index 754450819..551ad9be4 100644 --- a/packages/backend/test/integration/mockData/experiment/raw.ts +++ b/packages/backend/test/integration/mockData/experiment/raw.ts @@ -168,6 +168,7 @@ export const experiment = { { id: 'd2702d3c-5e04-41a7-8766-1da8a95b72ae', site: 'CurriculumSequence', + target: '', description: 'No Decision Point', twoCharacterId: 'NP', excludeIfReached: false, diff --git a/packages/backend/test/unit/services/ExperimentAssignmentService.test.ts b/packages/backend/test/unit/services/ExperimentAssignmentService.test.ts index fcbf71868..d909aecf6 100644 --- a/packages/backend/test/unit/services/ExperimentAssignmentService.test.ts +++ b/packages/backend/test/unit/services/ExperimentAssignmentService.test.ts @@ -73,6 +73,8 @@ describe('Experiment Assignment Service Test', () => { const moocletExperimentServiceMock = sinon.createStubInstance(MoocletExperimentService); experimentServiceMock.formattingConditionPayload.restore(); experimentServiceMock.formattingPayload.restore(); + experimentServiceMock.coerceExperimentDecisionPointTargets.restore(); + experimentServiceMock.coerceDecisionPointTargets.restore(); beforeAll(() => { configureLogger(); diff --git a/packages/frontend/projects/upgrade/src/app/core/experiments/store/experiments.model.ts b/packages/frontend/projects/upgrade/src/app/core/experiments/store/experiments.model.ts index a89cf858a..c4c1e8b54 100644 --- a/packages/frontend/projects/upgrade/src/app/core/experiments/store/experiments.model.ts +++ b/packages/frontend/projects/upgrade/src/app/core/experiments/store/experiments.model.ts @@ -53,8 +53,8 @@ export interface ExperimentConditionFilterOptions { export interface ExperimentPartitionFilterOptions { id: string; - point: string; - twoCharacterId: string; + site: string; + target: string; } export interface ExperimentDateFilterOptions { @@ -432,7 +432,7 @@ export interface ExperimentConditionDTO { export interface ExperimentPartitionDTO { id: string; site: string; - target?: string; + target: string; description?: string; order: number; excludeIfReached: boolean; diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/experiment-decision-point.utils.ts b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/experiment-decision-point.utils.ts new file mode 100644 index 000000000..5eb9ea346 --- /dev/null +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/experiment-decision-point.utils.ts @@ -0,0 +1,3 @@ +export function formatDecisionPointDisplay(decisionPoint: { site: string; target: string }): string { + return decisionPoint.target ? `${decisionPoint.site} (${decisionPoint.target})` : decisionPoint.site; +} diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/modals/upsert-decision-point-modal/upsert-decision-point-modal.component.html b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/modals/upsert-decision-point-modal/upsert-decision-point-modal.component.html index 5e4e85095..fc39477d1 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/modals/upsert-decision-point-modal/upsert-decision-point-modal.component.html +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/modals/upsert-decision-point-modal/upsert-decision-point-modal.component.html @@ -31,7 +31,7 @@ - Target + Target (optional) { - const isSameSite = decisionPoint.site?.trim() === site; - const isSameTarget = decisionPoint.target?.trim() === target; + const isSameSite = decisionPoint.site.trim() === site; + const isSameTarget = decisionPoint.target.trim() === target; // For edit action, exclude the current decision point being edited if (this.config.params.action === UPSERT_EXPERIMENT_ACTION.EDIT) { const sourceDecisionPoint = this.config.params.sourceDecisionPoint; if (sourceDecisionPoint) { const isCurrentDecisionPoint = - decisionPoint.site?.trim() === sourceDecisionPoint.site?.trim() && - decisionPoint.target?.trim() === sourceDecisionPoint.target?.trim(); + decisionPoint.site.trim() === sourceDecisionPoint.site.trim() && + decisionPoint.target.trim() === sourceDecisionPoint.target.trim(); // Skip validation if it's the same decision point being edited if (isCurrentDecisionPoint) { @@ -276,8 +276,8 @@ export class UpsertDecisionPointModalComponent implements OnInit, OnDestroy { excludeIfReached: formData.excludeIfReached, }; - // Validate trimmed values are not empty - if (!decisionPointData.site || !decisionPointData.target) { + // Validate trimmed site value is not empty + if (!decisionPointData.site) { CommonFormHelpersService.triggerTouchedToDisplayErrors(this.decisionPointForm); return; } diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.html b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.html index d072f8fa9..67d293072 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.html +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.html @@ -11,26 +11,18 @@ [ngClass]="{ 'no-data': !decisionPoints?.length }" class="decision-points-table" > - - - - {{ DECISION_POINT_TRANSLATION_KEYS.SITE | translate }} + + + + {{ DECISION_POINT_TRANSLATION_KEYS.DECISION_POINT | translate }} - - - {{ decisionPoint.site }} - - - - - - - - {{ DECISION_POINT_TRANSLATION_KEYS.TARGET | translate }} - - - - {{ decisionPoint.target }} + + + {{ getDecisionPoint(decisionPoint) }} diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.scss b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.scss index 6fa5876d1..8b800e400 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.scss +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.scss @@ -62,15 +62,11 @@ } } - .site-column { - width: 36%; + .decision-point-column { + width: 70%; padding-left: 32px; } - .target-column { - width: 34%; - } - .exclude-if-reached-column { width: 20%; text-align: center; diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.ts b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.ts index 074e40f4f..89f90e137 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.ts +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-decision-points-section-card/experiment-decision-points-table/experiment-decision-points-table.component.ts @@ -14,6 +14,7 @@ import { EXPERIMENT_ROW_ACTION, } from '../../../../../../../../core/experiments/store/experiments.model'; import { SharedModule } from '../../../../../../../../shared/shared.module'; +import { formatDecisionPointDisplay } from '../../../../../experiment-decision-point.utils'; @Component({ selector: 'app-experiment-decision-points-table', @@ -40,15 +41,18 @@ export class ExperimentDecisionPointsTableComponent { @Input() actionsTooltip?: string = ''; @Output() rowAction = new EventEmitter(); - displayedColumns: string[] = ['site', 'target', 'excludeIfReached', 'actions']; + displayedColumns: string[] = ['decisionPoint', 'excludeIfReached', 'actions']; DECISION_POINT_TRANSLATION_KEYS = { - SITE: 'experiments.details.decision-points.site.text', - TARGET: 'experiments.details.decision-points.target.text', + DECISION_POINT: 'experiments.details.decision-points.decision-point.text', EXCLUDE_IF_REACHED: 'experiments.details.decision-points.exclude-if-reached.text', ACTIONS: 'experiments.details.decision-points.actions.text', }; + getDecisionPoint(decisionPoint: ExperimentDecisionPoint): string { + return formatDecisionPointDisplay(decisionPoint); + } + onEditButtonClick(decisionPoint: ExperimentDecisionPoint): void { this.rowAction.emit({ action: EXPERIMENT_ROW_ACTION.EDIT, decisionPoint }); } diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.scss b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.scss index 545f0ff5f..2e07c0111 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.scss +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.scss @@ -40,9 +40,12 @@ div { } mat-cell:nth-child(2), - mat-cell:nth-child(3), - mat-header-cell:nth-child(2), - mat-header-cell:nth-child(3) { + mat-header-cell:nth-child(2) { + flex: 1; + } + + mat-cell:nth-child(n + 3), + mat-header-cell:nth-child(n + 3) { flex: 0 0 25%; width: 25%; } diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.ts b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.ts index 487f1d5a2..a6a5f3634 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.ts +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-expandable-row/enrollment-condition-expandable-row.component.ts @@ -40,7 +40,6 @@ export class EnrollmentConditionExpandableRowComponent implements OnDestroy { 'home.view-experiment.global.users-enrolled.text', 'home.view-experiment.global.group-enrolled.text', 'home.view-experiment-global.experiment-site.text', - 'home.view-experiment-global.experiment-target.text', ]) .subscribe((arrayValues) => { this.columnHeaders = { @@ -49,7 +48,6 @@ export class EnrollmentConditionExpandableRowComponent implements OnDestroy { userEnrolled: arrayValues['home.view-experiment.global.users-enrolled.text'], groupEnrolled: arrayValues['home.view-experiment.global.group-enrolled.text'], experimentPoint: arrayValues['home.view-experiment-global.experiment-site.text'], - experimentId: arrayValues['home.view-experiment-global.experiment-target.text'], }; }); } diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-table.component.ts b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-table.component.ts index 4181ff3b5..7144f94e3 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-table.component.ts +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-condition-table.component.ts @@ -10,6 +10,7 @@ import { TranslateModule } from '@ngx-translate/core'; import { EnrollmentConditionExpandableRowComponent } from './enrollment-condition-expandable-row/enrollment-condition-expandable-row.component'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { formatDecisionPointDisplay } from '../../../../../experiment-decision-point.utils'; @Component({ selector: 'app-enrollment-condition-table', @@ -54,8 +55,7 @@ export class EnrollmentConditionTableComponent implements OnChanges, OnInit, OnD const partitions = []; condition.partitions.forEach((partition) => { const partitionObj: EnrollmentByConditionOrPartitionData = { - experimentPoint: this.getPartitionData(partition.id, 'site'), - experimentId: this.getPartitionData(partition.id, 'target') || '', + experimentPoint: this.getDecisionPointData(partition.id), userEnrolled: partition.users, groupEnrolled: partition.groups, }; @@ -73,11 +73,9 @@ export class EnrollmentConditionTableComponent implements OnChanges, OnInit, OnD }); } - getPartitionData(partitionId: string, key: string) { - return this.experiment.partitions.reduce( - (acc, partition) => (partition.id === partitionId ? (acc = partition[key]) : acc), - null - ); + getDecisionPointData(partitionId: string) { + const decisionPoint = this.experiment.partitions.find((partition) => partition.id === partitionId); + return decisionPoint ? formatDecisionPointDisplay(decisionPoint) : ''; } getConditionData(conditionId: string, key: string) { diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-point-partition-table/enrollment-point-partition-table.component.ts b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-point-partition-table/enrollment-point-partition-table.component.ts index 982d643f6..7277a06f2 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-point-partition-table/enrollment-point-partition-table.component.ts +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-condition-table/enrollment-point-partition-table/enrollment-point-partition-table.component.ts @@ -12,7 +12,7 @@ import { EnrollmentConditionExpandableRowComponent } from '../enrollment-conditi export class EnrollmentPointPartitionTableComponent implements OnChanges { @Input() partitionData: any[]; @Input() experiment: ExperimentVM; - commonColumns = ['expandIcon', 'experimentPoint', 'experimentId', 'userEnrolled']; + commonColumns = ['expandIcon', 'experimentPoint', 'userEnrolled']; displayedColumns: string[] = []; ngOnChanges() { diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.html b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.html index 130b3bbba..9a96c9a30 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.html +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.html @@ -25,7 +25,7 @@
{{ 'home.view-experiment.enrollments-by-decision-p @for (partition of partitionsFilterOptions; track partition) { - {{ partition.point + ' (' + partition.twoCharacterId + ')' }} + {{ getDecisionPointDisplayText(partition) }} } diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.ts b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.ts index 4695a6225..11c82faf5 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.ts +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-enrollment-data-section-card/enrollment-over-time/enrollment-over-time.component.ts @@ -25,6 +25,7 @@ import { DateFilterOption, SINCE_DATE_FORMATTER, } from '../../../../../../../../shared/services/common-chart-helpers.service'; +import { formatDecisionPointDisplay } from '../../../../../experiment-decision-point.utils'; // Used in EnrollmentOverTimeComponent enum ExperimentFilterType { @@ -128,9 +129,9 @@ export class EnrollmentOverTimeComponent implements OnChanges, OnInit, OnDestroy this.selectedPartition = []; this.experiment.partitions.forEach((partition) => { this.partitionsFilterOptions.push({ - point: partition.site, + site: partition.site, id: partition.id, - twoCharacterId: partition.twoCharacterId, + target: partition.target, }); this.selectedPartition.push(partition.id); }); @@ -310,6 +311,10 @@ export class EnrollmentOverTimeComponent implements OnChanges, OnInit, OnDestroy ); } + getDecisionPointDisplayText(partition: ExperimentPartitionFilterOptions): string { + return formatDecisionPointDisplay(partition); + } + // For maintaining checkbox Select All in condition and partition filter isChecked(type: string): boolean { const selectedType = type === 'conditions' ? this.selectedCondition : this.selectedPartition; diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.html b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.html index afe0c075b..c8652c519 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.html +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.html @@ -17,22 +17,13 @@ {{ PAYLOAD_TRANSLATION_KEYS.DECISION_POINT | translate }} -
- - {{ getSite(payload.decisionPoint) }} - - - {{ getTarget(payload.decisionPoint) }} - -
+ + {{ getDecisionPoint(payload.decisionPoint) }} + diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.scss b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.scss index 05898dfed..19317efda 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.scss +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.scss @@ -81,14 +81,6 @@ width: 35%; } - td.decision-point-column { - .stacked-content { - display: flex; - flex-direction: column; - gap: 4px; - } - } - .actions-column { width: 10%; min-width: 96px; diff --git a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.ts b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.ts index d732c1555..f781441a7 100644 --- a/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.ts +++ b/packages/frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-payloads-section-card/experiment-payloads-table/experiment-payloads-table.component.ts @@ -15,6 +15,7 @@ import { EXPERIMENT_ROW_ACTION, } from '../../../../../../../../core/experiments/store/experiments.model'; import { SharedModule } from '../../../../../../../../shared/shared.module'; +import { formatDecisionPointDisplay } from '../../../../../experiment-decision-point.utils'; @Component({ selector: 'app-experiment-payloads-table', @@ -51,16 +52,9 @@ export class ExperimentPayloadsTableComponent { ACTIONS: 'experiments.details.payloads.actions.text', }; - // Get site name from decision point ID - getSite(decisionPointId: string): string { + getDecisionPoint(decisionPointId: string): string { const decisionPoint = this.partitions.find((dp) => dp.id === decisionPointId); - return decisionPoint?.site || ''; - } - - // Get target name from decision point ID - getTarget(decisionPointId: string): string { - const decisionPoint = this.partitions.find((dp) => dp.id === decisionPointId); - return decisionPoint?.target || ''; + return formatDecisionPointDisplay(decisionPoint); } // Get condition name from condition ID diff --git a/packages/frontend/projects/upgrade/src/assets/i18n/en.json b/packages/frontend/projects/upgrade/src/assets/i18n/en.json index 0579a1445..bcd038da2 100644 --- a/packages/frontend/projects/upgrade/src/assets/i18n/en.json +++ b/packages/frontend/projects/upgrade/src/assets/i18n/en.json @@ -231,7 +231,7 @@ "home.new-experiment.schedule.group-count.text": "enrolled", "home.new-experiment.schedule.group-count-having-met-ending-criteria.text": "Number of groups having met ending criteria: {{ groupSatisfied }}", "home.view-experiment-global.description.text": "DESCRIPTION", - "home.view-experiment-global.experiment-site.text": "Site", + "home.view-experiment-global.experiment-site.text": "Decision Point", "home.view-experiment-global.experiment-target.text": "Target", "home.view-experiment.design.required.text": "REQUIRED", "home.view-experiment.global.weight.text": "Weight (%)", @@ -277,7 +277,7 @@ "home.view-experiment.metrics-analysis-unavailable.text": "Experiment metrics analysis has been temporarily disabled in this view. This information is still available when exporting the experiment data.", "home.view-experiment.graph-type.text": "Type", "home.view-experiment.graph-conditions.text": "Conditions", - "home.view-experiment.graph-decision-point.text": "Sites", + "home.view-experiment.graph-decision-point.text": "Decision Points", "home.view-experiment.graph-time.text": "Time", "home.view-experiment.graph-select-all.text": "Select All", "home.view-experiment.mat-tab.data.text": "Data", @@ -484,7 +484,7 @@ "experiments.details.decision-points.card.title.text": "Decision Points", "experiments.details.decision-points.card.subtitle.text": "Define decision points for this experiment.", "experiments.details.add-decision-point.button.text": "Add Decision Point", - "experiments.details.decision-points.site.text": "Site", + "experiments.details.decision-points.decision-point.text": "Decision Point", "experiments.details.decision-points.target.text": "Target", "experiments.details.decision-points.exclude-if-reached.text": "Exclude If Reached", "experiments.details.decision-points.actions.text": "Actions",