diff --git a/src/assets/wise5/authoringTool/domain/expand-event.ts b/src/assets/wise5/authoringTool/domain/expand-event.ts new file mode 100644 index 00000000000..d98d49bab0c --- /dev/null +++ b/src/assets/wise5/authoringTool/domain/expand-event.ts @@ -0,0 +1,4 @@ +export interface ExpandEvent { + expanded: boolean; + id: string; +} diff --git a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html index 3acae6e9591..fcf696a1fdb 100644 --- a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html +++ b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html @@ -1,26 +1,60 @@ -
- - -
- +
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
-
-
-
diff --git a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.scss b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.scss index bb1c8c16754..777531dc697 100644 --- a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.scss +++ b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.scss @@ -1,20 +1,19 @@ -.groupHeader { - margin-left: 5px !important; +.lesson { + padding: 8px; + margin: 16px 0px; + border: 2px solid #dddddd; + border-radius: 6px; + position: relative; } -.pointer { - cursor: pointer; -} - -.projectItem:hover { +.lesson-bar:hover { background-color: #add8e6; } -.projectItemTitleDiv:hover { - background-color: #add8e6; +.full-width { + width: 100%; } -.projectItemTitleDiv { - width: 100%; - font-weight: initial; +.pointer { + cursor: pointer; } diff --git a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.spec.ts b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.spec.ts index 88359ce8e07..1195f2a30a7 100644 --- a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.spec.ts +++ b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.spec.ts @@ -12,14 +12,27 @@ import { NodeIconAndTitleComponent } from '../choose-node-location/node-icon-and import { NodeIconComponent } from '../../vle/node-icon/node-icon.component'; import { FormsModule } from '@angular/forms'; import { MatIconModule } from '@angular/material/icon'; +import { ProjectAuthoringStepComponent } from '../project-authoring-step/project-authoring-step.component'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { ProjectAuthoringLessonHarness } from './project-authoring-lesson.harness'; -describe('ProjectAuthoringLessonComponent', () => { - let component: ProjectAuthoringLessonComponent; - let fixture: ComponentFixture; +let component: ProjectAuthoringLessonComponent; +let fixture: ComponentFixture; +const groupId1 = 'group1'; +let harness: ProjectAuthoringLessonHarness; +const nodeId1 = 'node1'; +const nodeId2 = 'node2'; +let teacherProjectService: TeacherProjectService; - beforeEach(() => { +describe('ProjectAuthoringLessonComponent', () => { + beforeEach(async () => { TestBed.configureTestingModule({ - declarations: [NodeIconComponent, NodeIconAndTitleComponent, ProjectAuthoringLessonComponent], + declarations: [ + NodeIconComponent, + NodeIconAndTitleComponent, + ProjectAuthoringLessonComponent, + ProjectAuthoringStepComponent + ], imports: [ FormsModule, HttpClientTestingModule, @@ -35,13 +48,59 @@ describe('ProjectAuthoringLessonComponent', () => { TeacherWebSocketService ] }); + teacherProjectService = TestBed.inject(TeacherProjectService); + teacherProjectService.idToNode = { + node1: { + id: nodeId1, + title: 'Step 1' + }, + node2: { + id: nodeId2, + title: 'Step 2' + } + }; fixture = TestBed.createComponent(ProjectAuthoringLessonComponent); component = fixture.componentInstance; - component.lesson = {}; + component.lesson = { + id: groupId1, + ids: [nodeId1, nodeId2], + type: 'group' + }; fixture.detectChanges(); + harness = await TestbedHarnessEnvironment.harnessForFixture( + fixture, + ProjectAuthoringLessonHarness + ); }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + lessonIsExpanded_clickCollapseButton_hideSteps(); + lessonIsCollapsed_clickExpandButton_showSteps(); }); + +function lessonIsExpanded_clickCollapseButton_hideSteps() { + describe('lesson is expanded', () => { + describe('collapse button is clicked', () => { + it('hides steps', async () => { + component.expanded = true; + await (await harness.getCollapseButton()).click(); + expect(component.expanded).toBeFalse(); + const steps = await harness.getSteps(); + expect(steps.length).toEqual(0); + }); + }); + }); +} + +function lessonIsCollapsed_clickExpandButton_showSteps() { + describe('lesson is collapsed', () => { + describe('expand button is clicked', () => { + it('shows steps', async () => { + component.expanded = false; + await (await harness.getExpandButton()).click(); + expect(component.expanded).toBeTrue(); + const steps = await harness.getSteps(); + expect(steps.length).toEqual(2); + }); + }); + }); +} diff --git a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.ts b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.ts index d86b16ccb52..e0ec3ff54f6 100644 --- a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.ts +++ b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.ts @@ -3,6 +3,7 @@ import { TeacherDataService } from '../../services/teacherDataService'; import { TeacherProjectService } from '../../services/teacherProjectService'; import { SelectNodeEvent } from '../domain/select-node-event'; import { NodeTypeSelected } from '../domain/node-type-selected'; +import { ExpandEvent } from '../domain/expand-event'; @Component({ selector: 'project-authoring-lesson', @@ -10,6 +11,8 @@ import { NodeTypeSelected } from '../domain/node-type-selected'; styleUrls: ['./project-authoring-lesson.component.scss'] }) export class ProjectAuthoringLessonComponent { + @Input() expanded: boolean = true; + @Output() onExpandedChanged: EventEmitter = new EventEmitter(); protected idToNode: any = {}; @Input() lesson: any; protected nodeTypeSelected: Signal; @@ -35,4 +38,9 @@ export class ProjectAuthoringLessonComponent { protected setCurrentNode(nodeId: string): void { this.dataService.setCurrentNodeByNodeId(nodeId); } + + protected toggleExpanded(): void { + this.expanded = !this.expanded; + this.onExpandedChanged.emit({ id: this.lesson.id, expanded: this.expanded }); + } } diff --git a/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.harness.ts b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.harness.ts new file mode 100644 index 00000000000..257b48b16da --- /dev/null +++ b/src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.harness.ts @@ -0,0 +1,22 @@ +import { ComponentHarness } from '@angular/cdk/testing'; +import { MatButtonHarness } from '@angular/material/button/testing'; +import { ProjectAuthoringStepHarness } from '../project-authoring-step/project-authoring-step.harness'; + +export class ProjectAuthoringLessonHarness extends ComponentHarness { + static hostSelector = 'project-authoring-lesson'; + getExpandButton = this.locatorForOptional( + MatButtonHarness.with({ selector: '[matTooltip="Click to expand"]' }) + ); + getCollapseButton = this.locatorForOptional( + MatButtonHarness.with({ selector: '[matTooltip="Click to collapse"]' }) + ); + getSteps = this.locatorForAll(ProjectAuthoringStepHarness); + + async isExpanded(): Promise { + return (await this.getExpandButton()) == null; + } + + async isCollapsed(): Promise { + return (await this.getCollapseButton()) == null; + } +} diff --git a/src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html b/src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html index 5e6e50bc39c..04632d4b5ba 100644 --- a/src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html +++ b/src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html @@ -18,6 +18,9 @@ fxLayoutAlign="start center" fxLayoutGap="10px" (click)="setCurrentNode(step.id)" + matTooltip="Click to enter step" + matTooltipPosition="above" + i18n-matTooltip >

diff --git a/src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.harness.ts b/src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.harness.ts new file mode 100644 index 00000000000..e680d56f682 --- /dev/null +++ b/src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.harness.ts @@ -0,0 +1,5 @@ +import { ComponentHarness } from '@angular/cdk/testing'; + +export class ProjectAuthoringStepHarness extends ComponentHarness { + static hostSelector = 'project-authoring-step'; +} diff --git a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html index a7bf008f457..50d20e5cfc0 100644 --- a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html +++ b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html @@ -54,6 +54,25 @@ > delete +

+ +
@@ -62,6 +81,8 @@ (selectNodeEvent)="selectNode($event)" [showPosition]="true" [projectId]="projectId" + [expanded]="lessonIdToExpanded()[lesson.id]" + (onExpandedChanged)="onExpandedChanged($event)" >
@@ -73,6 +94,8 @@
Unused Lessons
(selectNodeEvent)="selectNode($event)" [showPosition]="false" [projectId]="projectId" + [expanded]="lessonIdToExpanded()[inactiveGroupNode.id]" + (onExpandedChanged)="onExpandedChanged($event)" >
diff --git a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.scss b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.scss index 952359386b0..73ae3676ec9 100644 --- a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.scss +++ b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.scss @@ -8,7 +8,6 @@ .all-nodes-div { margin-top: 20px; - margin-left: 20px; } .componentHeader { diff --git a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.spec.ts b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.spec.ts index ba220142239..97291d69ee6 100644 --- a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.spec.ts +++ b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.spec.ts @@ -19,28 +19,48 @@ import { FormsModule } from '@angular/forms'; import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import * as demoProjectJSON_import from '../../../../app/services/sampleData/curriculum/Demo.project.json'; +import { copy } from '../../common/object/object'; +import { ProjectAuthoringLessonComponent } from '../project-authoring-lesson/project-authoring-lesson.component'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { NodeIconAndTitleComponent } from '../choose-node-location/node-icon-and-title/node-icon-and-title.component'; +import { NodeIconComponent } from '../../vle/node-icon/node-icon.component'; +import { ProjectAuthoringStepComponent } from '../project-authoring-step/project-authoring-step.component'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { ProjectAuthoringHarness } from './project-authoring.harness'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonHarness } from '@angular/material/button/testing'; -describe('ProjectAuthoringComponent', () => { - let component: ProjectAuthoringComponent; - let fixture: ComponentFixture; - let projectService: TeacherProjectService; +let component: ProjectAuthoringComponent; +let fixture: ComponentFixture; +let harness: ProjectAuthoringHarness; +let projectService: TeacherProjectService; +describe('ProjectAuthoringComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ ConcurrentAuthorsMessageComponent, NodeAuthoringComponent, + NodeIconComponent, + NodeIconAndTitleComponent, ProjectAuthoringComponent, + ProjectAuthoringLessonComponent, + ProjectAuthoringStepComponent, TeacherNodeIconComponent ], imports: [ BrowserAnimationsModule, FormsModule, HttpClientTestingModule, - MatInputModule, + MatButtonModule, + MatCheckboxModule, MatDialogModule, MatFormFieldModule, MatIconModule, + MatInputModule, + MatTooltipModule, RouterTestingModule, StudentTeacherCommonServicesModule ], @@ -55,17 +75,65 @@ describe('ProjectAuthoringComponent', () => { ] }).compileComponents(); projectService = TestBed.inject(TeacherProjectService); - spyOn(projectService, 'parseProject').and.callFake(() => {}); - spyOn(projectService, 'getFlattenedProjectAsNodeIds').and.returnValue(['node1']); - spyOn(projectService, 'getNodeById').and.returnValue({ title: 'Step 1' }); - spyOn(projectService, 'getInactiveNodes').and.returnValue([]); + projectService.setProject(copy(demoProjectJSON_import)); window.history.pushState({}, '', ''); fixture = TestBed.createComponent(ProjectAuthoringComponent); component = fixture.componentInstance; fixture.detectChanges(); + harness = await TestbedHarnessEnvironment.harnessForFixture(fixture, ProjectAuthoringHarness); }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + collapseAllButtonClicked(); + expandAllButtonClicked(); }); + +function collapseAllButtonClicked() { + describe('all lessons are expanded', () => { + describe('collapse all button is clicked', () => { + let expandAllButton: MatButtonHarness; + let collapseAllButton: MatButtonHarness; + beforeEach(async () => { + expandAllButton = await harness.getExpandAllButton(); + collapseAllButton = await harness.getCollapseAllButton(); + await collapseAllButton.click(); + }); + it('all lessons are collapsed', async () => { + for (const lesson of await harness.getLessons()) { + expect(await lesson.isCollapsed()).toBe(true); + } + }); + it('expand all button is enabled', async () => { + expect(await collapseAllButton.isDisabled()).toBe(true); + }); + it('collapse all button is disabled', async () => { + expect(await expandAllButton.isDisabled()).toBe(false); + }); + }); + }); +} + +function expandAllButtonClicked() { + describe('all lessons are collapsed', () => { + describe('expand all button is clicked', () => { + let expandAllButton: MatButtonHarness; + let collapseAllButton: MatButtonHarness; + beforeEach(async () => { + expandAllButton = await harness.getExpandAllButton(); + collapseAllButton = await harness.getCollapseAllButton(); + await collapseAllButton.click(); + await expandAllButton.click(); + }); + it('all lessons are expanded', async () => { + for (const lesson of await harness.getLessons()) { + expect(await lesson.isExpanded()).toBe(true); + } + }); + it('collapse all button is enabled', async () => { + expect(await collapseAllButton.isDisabled()).toBe(false); + }); + it('expand all button is disabled', async () => { + expect(await expandAllButton.isDisabled()).toBe(true); + }); + }); + }); +} diff --git a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts index 0d62385ec73..b9981fde22d 100644 --- a/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts +++ b/src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, Signal } from '@angular/core'; +import { Component, Input, OnInit, Signal, WritableSignal, computed, signal } from '@angular/core'; import { DeleteNodeService } from '../../services/deleteNodeService'; import { TeacherProjectService } from '../../services/teacherProjectService'; import { TeacherDataService } from '../../services/teacherDataService'; @@ -8,18 +8,26 @@ import { temporarilyHighlightElement } from '../../common/dom/dom'; import { ActivatedRoute, Router } from '@angular/router'; import { SelectNodeEvent } from '../domain/select-node-event'; import { NodeTypeSelected } from '../domain/node-type-selected'; +import { ExpandEvent } from '../domain/expand-event'; @Component({ selector: 'project-authoring', templateUrl: './project-authoring.component.html', styleUrls: ['./project-authoring.component.scss'] }) -export class ProjectAuthoringComponent { +export class ProjectAuthoringComponent implements OnInit { + protected allLessonsCollapsed: Signal = computed(() => + this.isAllLessonsExpandedValue(false) + ); + protected allLessonsExpanded: Signal = computed(() => + this.isAllLessonsExpandedValue(true) + ); protected inactiveGroupNodes: any[]; private inactiveNodes: any[]; protected inactiveStepNodes: any[]; protected items: any; protected lessons: any[] = []; + protected lessonIdToExpanded: WritableSignal<{ [key: string]: boolean }> = signal({}); protected nodeIdToChecked: any = {}; protected nodeTypeSelected: Signal; @Input('unitId') protected projectId?: number; @@ -44,6 +52,7 @@ export class ProjectAuthoringComponent { this.refreshProject(); }) ); + this.expandAllLessons(); } ngOnDestroy(): void { @@ -81,6 +90,7 @@ export class ProjectAuthoringComponent { : $localize`Are you sure you want to delete the ${selectedNodeIds.length} selected items?`; if (confirm(confirmMessage)) { selectedNodeIds.forEach((nodeId) => this.deleteNodeService.deleteNode(nodeId)); + this.removeLessonIdToExpandedEntries(selectedNodeIds); this.projectService.saveProject(); this.refreshProject(); } @@ -101,6 +111,14 @@ export class ProjectAuthoringComponent { return selectedNodeIds; } + private removeLessonIdToExpandedEntries(nodeIds: string[]): void { + this.lessonIdToExpanded.mutate((value) => { + nodeIds.forEach((nodeId) => { + delete value[nodeId]; + }); + }); + } + private unselectAllItems(): void { this.items.forEach((item: any) => { item.checked = false; @@ -111,6 +129,7 @@ export class ProjectAuthoringComponent { this.inactiveStepNodes.forEach((inactiveStepNode: any) => { inactiveStepNode.checked = false; }); + this.nodeIdToChecked = {}; this.projectService.setNodeTypeSelected(null); } @@ -147,6 +166,7 @@ export class ProjectAuthoringComponent { */ protected selectNode({ id, checked }: SelectNodeEvent): void { this.nodeIdToChecked[id] = checked; + this.updateNodeTypeSelected(); } protected hasSelectedNodes(): boolean { @@ -159,4 +179,61 @@ export class ProjectAuthoringComponent { this.getSelectedNodeIds().every((nodeId) => this.projectService.isApplicationNode(nodeId)) ); } + + private isAllLessonsExpandedValue(expanded: boolean): boolean { + return ( + this.lessons.every((lesson) => this.lessonIdToExpanded()[lesson.id] === expanded) && + this.inactiveGroupNodes.every( + (inactiveGroupNode) => this.lessonIdToExpanded()[inactiveGroupNode.id] === expanded + ) + ); + } + + protected expandAllLessons(): void { + this.setAllLessonsExpandedValue(true); + } + + protected collapseAllLessons(): void { + this.setAllLessonsExpandedValue(false); + this.lessons.forEach((lesson) => this.unselectChildren(lesson)); + this.updateNodeTypeSelected(); + } + + private setAllLessonsExpandedValue(expanded: boolean): void { + this.lessonIdToExpanded.mutate((value) => { + for (const lesson of this.lessons) { + value[lesson.id] = expanded; + } + for (const inactiveGroupNode of this.inactiveGroupNodes) { + value[inactiveGroupNode.id] = expanded; + } + }); + } + + protected onExpandedChanged(event: ExpandEvent): void { + this.lessonIdToExpanded.mutate((value) => { + value[event.id] = event.expanded; + }); + const lesson = this.lessons + .concat(this.inactiveGroupNodes) + .find((lesson: any) => lesson.id === event.id); + this.unselectChildren(lesson); + this.updateNodeTypeSelected(); + } + + private unselectChildren(lesson: any): void { + lesson.ids.forEach((childId: string) => (this.nodeIdToChecked[childId] = false)); + } + + private updateNodeTypeSelected(): void { + let nodeTypeSelected = null; + Object.entries(this.nodeIdToChecked).forEach(([nodeId, checked]) => { + if (checked) { + nodeTypeSelected = this.projectService.isGroupNode(nodeId) + ? NodeTypeSelected.lesson + : NodeTypeSelected.step; + } + }); + this.projectService.setNodeTypeSelected(nodeTypeSelected); + } } diff --git a/src/assets/wise5/authoringTool/project-authoring/project-authoring.harness.ts b/src/assets/wise5/authoringTool/project-authoring/project-authoring.harness.ts new file mode 100644 index 00000000000..40a66c6d72a --- /dev/null +++ b/src/assets/wise5/authoringTool/project-authoring/project-authoring.harness.ts @@ -0,0 +1,10 @@ +import { ComponentHarness } from '@angular/cdk/testing'; +import { MatButtonHarness } from '@angular/material/button/testing'; +import { ProjectAuthoringLessonHarness } from '../project-authoring-lesson/project-authoring-lesson.harness'; + +export class ProjectAuthoringHarness extends ComponentHarness { + static hostSelector = 'project-authoring'; + getExpandAllButton = this.locatorFor(MatButtonHarness.with({ text: '+ Expand All' })); + getCollapseAllButton = this.locatorFor(MatButtonHarness.with({ text: '- Collapse All' })); + getLessons = this.locatorForAll(ProjectAuthoringLessonHarness); +} diff --git a/src/assets/wise5/authoringTool/tsconfig.json b/src/assets/wise5/authoringTool/tsconfig.json index f55890fff66..5c18d0d290c 100644 --- a/src/assets/wise5/authoringTool/tsconfig.json +++ b/src/assets/wise5/authoringTool/tsconfig.json @@ -8,6 +8,7 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, + "resolveJsonModule": true, "target": "es5", "typeRoots": ["node_modules/@types"], "lib": ["es2017", "dom"] diff --git a/src/messages.xlf b/src/messages.xlf index ad178806e6d..79fed75a2db 100644 --- a/src/messages.xlf +++ b/src/messages.xlf @@ -9197,7 +9197,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 68 + 89 @@ -9762,7 +9762,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 69 + 90 @@ -9777,7 +9777,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 79 + 102 @@ -9792,7 +9792,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 80 + 103 @@ -12195,7 +12195,28 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Select lesson src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html - 6 + 7 + + + + Click to enter lesson + + src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html + 15 + + + + Click to expand + + src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html + 30 + + + + Click to collapse + + src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html + 41 @@ -12205,13 +12226,20 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.12 + + Click to enter step + + src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html + 21 + + Branch point with paths based on src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html - 28,30 + 31,33 @@ -12220,14 +12248,14 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html - 38,40 + 41,43 Has Rubric src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.html - 47 + 50 @@ -12251,18 +12279,32 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.29 + + + Expand All + + src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html + 64,66 + + + + - Collapse All + + src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html + 73,75 + + Are you sure you want to delete the selected item? src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts - 80 + 89 Are you sure you want to delete the selected items? src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts - 81 + 90