Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/app/services/cRaterService.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { HttpTestingController, provideHttpClientTesting } from '@angular/common
import { CRaterIdea } from '../../assets/wise5/components/common/cRater/CRaterIdea';
import { CRaterScore } from '../../assets/wise5/components/common/cRater/CRaterScore';
import { RawCRaterResponse } from '../../assets/wise5/components/common/cRater/RawCRaterResponse';
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
import { provideHttpClient } from '@angular/common/http';
import { ProjectService } from '../../assets/wise5/services/projectService';
import { ComponentContent } from '../../assets/wise5/common/ComponentContent';
let service: CRaterService;
Expand All @@ -24,7 +24,7 @@ describe('CRaterService', () => {
ConfigService,
CRaterService,
{ provide: ProjectService, useClass: MockProjectService },
provideHttpClient(withInterceptorsFromDi()),
provideHttpClient(),
provideHttpClientTesting()
]
});
Expand Down Expand Up @@ -182,7 +182,7 @@ function makeCRaterVerifyRequest() {
it('should make a CRater verify request', () => {
spyOn(configService, 'getCRaterRequestURL').and.returnValue('/c-rater');
const itemId = 'ColdBeverage1Sub';
service.makeCRaterVerifyRequest(itemId);
service.makeCRaterVerifyRequest(itemId).subscribe();
http.expectOne({
url: `/c-rater/verify?itemId=${itemId}`,
method: 'GET'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<mat-form-field>
<mat-label i18n>AI Model ID</mat-label>
<mat-select [(ngModel)]="selectedItemId" (selectionChange)="getItemRubric()">
@for (itemId of itemIds; track itemId) {
<mat-option [value]="itemId">{{ itemId }}</mat-option>
}
</mat-select>
</mat-form-field>
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CRaterItemSelectComponent } from './crater-item-select.component';
import { MockProviders } from 'ng-mocks';
import { CRaterService } from '../../../../services/cRaterService';
import { TeacherProjectService } from '../../../../services/teacherProjectService';
import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatSelectHarness } from '@angular/material/select/testing';
import { Observable } from 'rxjs';

let loader: HarnessLoader;
describe('CRaterItemSelectComponent', () => {
let component: CRaterItemSelectComponent;
let fixture: ComponentFixture<CRaterItemSelectComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CRaterItemSelectComponent],
providers: [MockProviders(CRaterService, TeacherProjectService)]
}).compileComponents();

fixture = TestBed.createComponent(CRaterItemSelectComponent);
loader = TestbedHarnessEnvironment.loader(fixture);
component = fixture.componentInstance;
component.componentContent = { itemId: 'berkeley_HeLa', type: 'DialogGuidance' };
fixture.detectChanges();
});

it('should show selected item id', async () => {
const select = await loader.getHarness(MatSelectHarness);
expect(await select.getValueText()).toBe('berkeley_HeLa');
});

it('should get rubric and update component when item id is changed', async () => {
const cRaterService = TestBed.inject(CRaterService);
const rubricSpy = spyOn(cRaterService, 'makeCRaterVerifyRequest').and.returnValue(
new Observable<any>((observer) => {
observer.next({
rubric: {
description: 'Test description',
ideas: [
{ name: '1', text: 'Idea 1 text' },
{ name: '2', text: 'Idea 2 text' }
]
}
});
observer.complete();
})
);
const saveSpy = spyOn(TestBed.inject(TeacherProjectService), 'saveProject');
const select = await loader.getHarness(MatSelectHarness);
await select.open();
const options = await select.getOptions();
await options[0].click(); // Select the first item (berkeley_BowlsInAFridge)
expect(rubricSpy).toHaveBeenCalled();
expect(saveSpy).toHaveBeenCalled();
expect(component.componentContent.itemId).toEqual('berkeley_BowlsInAFridge');
expect(component.componentContent.cRaterRubric).toEqual({
description: 'Test description',
ideas: [
{ name: '1', text: 'Idea 1 text' },
{ name: '2', text: 'Idea 2 text' }
]
});
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { Component, Input } from '@angular/core';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { CRaterService } from '../../../../services/cRaterService';
import { TeacherProjectService } from '../../../../services/teacherProjectService';
import { FormsModule } from '@angular/forms';

@Component({
imports: [FormsModule, MatFormFieldModule, MatSelect, MatOption],
selector: 'c-rater-item-select',
templateUrl: './crater-item-select.component.html'
})
export class CRaterItemSelectComponent {
@Input() componentContent: any;
protected itemIds = [
'berkeley_BowlsInAFridge',
'berkeley_CarOnAColdDay',
'berkeley_COAL-II',
'berkeley_CovidImpacts',
'berkeley_FoodJustice',
'berkeley_FoodJusticeShortLabelIdeaKI',
'berkeley_GenEx-Siblings',
'berkeley_HeLa',
'berkeley_Impacts',
'berkeley_Lizards',
'berkeley_MusicalInstruments-Speed',
'berkeley_PhotoEnergyStory',
'berkeley_PlateTectonics_MtHood',
'berkeley_SPOON-II'
];
protected selectedItemId: string;

constructor(
private cRaterService: CRaterService,
private projectService: TeacherProjectService
) {}

ngOnInit(): void {
if (this.componentContent.type === 'OpenResponse') {
this.selectedItemId = this.componentContent.cRater.itemId;
} else if (this.componentContent.type === 'DialogGuidance') {
this.selectedItemId = this.componentContent.itemId;
}
}

protected getItemRubric(): void {
this.cRaterService.makeCRaterVerifyRequest(this.selectedItemId).subscribe((response) => {
const cRaterRubric = response.rubric ?? { description: '', ideas: [] };
if (this.componentContent.type === 'OpenResponse') {
this.componentContent.cRater.rubric = cRaterRubric;
this.componentContent.cRater.itemId = this.selectedItemId;
} else if (this.componentContent.type === 'DialogGuidance') {
this.componentContent.cRaterRubric = cRaterRubric;
this.componentContent.itemId = this.selectedItemId;
}
this.projectService.saveProject();
});
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
<div class="description notice-bg-bg">
<h5 class="flex flex-row items-center gap-1 !text-xl">
<span i18n>Model Description</span>
</h5>
<mat-card appearance="outlined" class="description-content">
<mat-form-field class="description-input form-field-no-hint" appearance="fill">
<mat-label i18n>User-Friendly Description</mat-label>
<textarea
matInput
[(ngModel)]="cRaterRubric.description"
(ngModelChange)="inputChanged.next($event)"
cdkTextareaAutosize
></textarea>
</mat-form-field>
</mat-card>
</div>
<mat-form-field class="description-input" appearance="fill">
<mat-label i18n>User-Friendly Description</mat-label>
<textarea
matInput
[(ngModel)]="cRaterRubric.description"
(ngModelChange)="inputChanged.next($event)"
cdkTextareaAutosize
></textarea>
</mat-form-field>
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@ import { Component, Input } from '@angular/core';
import { CRaterRubric } from '../CRaterRubric';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
import { FormsModule } from '@angular/forms';
import { MatCardModule } from '@angular/material/card';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { Subject, Subscription } from 'rxjs';
import { TeacherProjectService } from '../../../../services/teacherProjectService';

@Component({
selector: 'edit-crater-description',
imports: [CdkTextareaAutosize, FormsModule, MatCardModule, MatFormFieldModule, MatInputModule],
imports: [CdkTextareaAutosize, FormsModule, MatFormFieldModule, MatInputModule],
templateUrl: './edit-crater-description.component.html',
styleUrl: './edit-crater-description.component.scss'
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ h5 {
ul {
margin: 16px 0 0 0;
padding: 0 0 16px;
max-height: 60vh;
overflow: auto;
}

li {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,13 @@ import { Component, Input } from '@angular/core';
import { CRaterRubric } from '../CRaterRubric';
import { EditCRaterDescriptionComponent } from '../edit-crater-description/edit-crater-description.component';
import { EditCRaterIdeaDescriptionsComponent } from '../edit-crater-idea-descriptions/edit-crater-idea-descriptions.component';
import { MatCardModule } from '@angular/material/card';

@Component({
selector: 'edit-crater-info',
imports: [EditCRaterDescriptionComponent, EditCRaterIdeaDescriptionsComponent, MatCardModule],
styles: ['.wrapper { padding: 16px; }'],
template: `<mat-card appearance="outlined" class="wrapper">
<h5 class="gap-1 !text-xl">
<span i18n>Edit CRater Information</span>
</h5>
imports: [EditCRaterDescriptionComponent, EditCRaterIdeaDescriptionsComponent],
template: `<h5 class="!text-xl" i18n>AI Model Details</h5>
<edit-crater-description [cRaterRubric]="cRaterRubric" />
<edit-crater-idea-descriptions [ideaDescriptions]="cRaterRubric.ideas" />
</mat-card>`
<edit-crater-idea-descriptions [ideaDescriptions]="cRaterRubric.ideas" />`
})
export class EditCRaterInfoComponent {
@Input() cRaterRubric: CRaterRubric;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,7 @@
[componentContent]="componentContent"
(promptChangedEvent)="promptChanged($event)"
/>
<mat-form-field>
<mat-label i18n>Item ID</mat-label>
<input
matInput
[(ngModel)]="componentContent.itemId"
(ngModelChange)="inputChange.next($event)"
type="text"
/>
</mat-form-field>
<c-rater-item-select [componentContent]="componentContent" />
<edit-component-max-submit [componentContent]="componentContent" />
<mat-checkbox
color="primary"
Expand All @@ -29,4 +21,5 @@
[feedbackRules]="componentContent.feedbackRules"
[version]="componentContent.version"
/>
<edit-crater-info [cRaterRubric]="componentContent.cRaterRubric" />
</div>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
import { provideHttpClient } from '@angular/common/http';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ProjectLocale } from '../../../../../app/domain/projectLocale';
import { ProjectAssetService } from '../../../../../app/services/projectAssetService';
Expand All @@ -8,6 +8,8 @@ import { TeacherNodeService } from '../../../services/teacherNodeService';
import { TeacherProjectService } from '../../../services/teacherProjectService';
import { TeacherProjectTranslationService } from '../../../services/teacherProjectTranslationService';
import { DialogGuidanceAuthoringComponent } from './dialog-guidance-authoring.component';
import { MockComponent } from 'ng-mocks';
import { EditComponentPrompt } from '../../../../../app/authoring-tool/edit-component-prompt/edit-component-prompt.component';

const componentContent = {
id: 'i64ex48j1z',
Expand All @@ -18,31 +20,31 @@ const componentContent = {
showSubmitButton: false,
isComputerAvatarEnabled: false
};

describe('DialogGuidanceAuthoringComponent', () => {
let component: DialogGuidanceAuthoringComponent;
let fixture: ComponentFixture<DialogGuidanceAuthoringComponent>;

beforeEach(() => {
TestBed.configureTestingModule({
imports: [DialogGuidanceAuthoringComponent, StudentTeacherCommonServicesModule],
imports: [
DialogGuidanceAuthoringComponent,
MockComponent(EditComponentPrompt),
StudentTeacherCommonServicesModule
],
providers: [
ProjectAssetService,
TeacherNodeService,
TeacherProjectService,
TeacherProjectTranslationService,
provideHttpClient(withInterceptorsFromDi())
provideHttpClient()
]
});
spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue(
new ProjectLocale({ default: 'en-US' })
);
fixture = TestBed.createComponent(DialogGuidanceAuthoringComponent);
component = fixture.componentInstance;
spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true);
spyOn(TestBed.inject(TeacherProjectService), 'getComponent').and.returnValue(
copy(componentContent)
);
const projectService = TestBed.inject(TeacherProjectService);
spyOn(projectService, 'getLocale').and.returnValue(new ProjectLocale({ default: 'en-US' }));
spyOn(projectService, 'isDefaultLocale').and.returnValue(true);
spyOn(projectService, 'getComponent').and.returnValue(copy(componentContent));
component.componentContent = copy(componentContent);
fixture.detectChanges();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInput } from '@angular/material/input';
import { EditComponentMaxSubmitComponent } from '../../../../../app/authoring-tool/edit-component-max-submit/edit-component-max-submit.component';
import { EditComponentPrompt } from '../../../../../app/authoring-tool/edit-component-prompt/edit-component-prompt.component';
import { ProjectAssetService } from '../../../../../app/services/projectAssetService';
Expand All @@ -14,21 +13,23 @@ import { TeacherProjectService } from '../../../services/teacherProjectService';
import { CRaterRubric } from '../../common/cRater/CRaterRubric';
import { EditFeedbackRulesComponent } from '../../common/feedbackRule/edit-feedback-rules/edit-feedback-rules.component';
import { EditDialogGuidanceComputerAvatarComponent } from '../edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component';
import { CRaterItemSelectComponent } from '../../common/cRater/crater-item-select/crater-item-select.component';
import { EditCRaterInfoComponent } from '../../common/cRater/edit-crater-info/edit-crater-info.component';

@Component({
selector: 'dialog-guidance-authoring',
templateUrl: './dialog-guidance-authoring.component.html',
styles: ['edit-feedback-rules { margin-bottom: 16px; } '],
imports: [
CRaterItemSelectComponent,
EditComponentMaxSubmitComponent,
EditComponentPrompt,
MatFormFieldModule,
MatInput,
EditCRaterInfoComponent,
EditDialogGuidanceComputerAvatarComponent,
EditFeedbackRulesComponent,
FormsModule,
EditComponentMaxSubmitComponent,
MatCheckbox,
EditDialogGuidanceComputerAvatarComponent,
EditFeedbackRulesComponent
]
MatFormFieldModule
],
selector: 'dialog-guidance-authoring',
templateUrl: './dialog-guidance-authoring.component.html'
})
export class DialogGuidanceAuthoringComponent extends AbstractComponentAuthoring {
constructor(
Expand All @@ -41,7 +42,7 @@ export class DialogGuidanceAuthoringComponent extends AbstractComponentAuthoring
super(configService, nodeService, projectAssetService, projectService);
}

ngOnInit() {
ngOnInit(): void {
super.ngOnInit();
if (this.componentContent.computerAvatarSettings == null) {
this.componentContent.computerAvatarSettings =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ import { Component } from '@angular/core';
import { EditAdvancedComponentComponent } from '../../../../../app/authoring-tool/edit-advanced-component/edit-advanced-component.component';
import { EditComponentConstraintsComponent } from '../../../../../app/authoring-tool/edit-component-constraints/edit-component-constraints.component';
import { EditComponentJsonComponent } from '../../../../../app/authoring-tool/edit-component-json/edit-component-json.component';
import { EditCRaterInfoComponent } from '../../common/cRater/edit-crater-info/edit-crater-info.component';

@Component({
imports: [EditComponentConstraintsComponent, EditComponentJsonComponent, EditCRaterInfoComponent],
imports: [EditComponentConstraintsComponent, EditComponentJsonComponent],
template: `
<edit-component-constraints [componentContent]="component.content" />
<edit-component-json [component]="component" />
<edit-crater-info [cRaterRubric]="component.content.cRaterRubric" />
`
})
export class EditDialogGuidanceAdvancedComponent extends EditAdvancedComponentComponent {}
Loading