Skip to content

Commit 714052d

Browse files
authored
refactor: rename panel components (NASA-AMMOS#62)
- Makes use of components more clear - Add e2e tests for panels - Add e2e test results folder to prettier ignore
1 parent ecb1bc9 commit 714052d

16 files changed

+139
-62
lines changed

.prettierignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.svelte-kit/**
2-
static/**
32
build/**
3+
e2e-test-results/**
44
node_modules/**
55
src/css/utilities.css
6+
static/**
67
unit-test-results/**

e2e-tests/fixtures/Plan.ts

+46-18
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,32 @@ import { SchedulingGoals } from './SchedulingGoals.js';
55

66
export class Plan {
77
activitiesNavButton: Locator;
8-
activityFormComponent: Locator;
9-
activityTableComponent: Locator;
10-
activityTypesComponent: Locator;
8+
activityTable: Locator;
119
appError: Locator;
1210
constraintsNavButton: Locator;
11+
gridMenu: Locator;
12+
gridMenuButton: Locator;
13+
gridMenuItem: (name: string) => Locator;
14+
panelActivityForm: Locator;
15+
panelActivityTypes: Locator;
16+
panelConstraintViolations: Locator;
17+
panelConstraints: Locator;
18+
panelExpansion: Locator;
19+
panelScheduling: Locator;
20+
panelSimulation: Locator;
21+
panelTimelineForm: Locator;
22+
panelViewEditor: Locator;
23+
panelViews: Locator;
1324
planTitle: Locator;
1425
scheduleButton: Locator;
15-
schedulingComponent: Locator;
1626
schedulingGoalDifferenceBadge: Locator;
1727
schedulingGoalEnabledCheckbox: Locator;
1828
schedulingGoalListItemSelector: string;
1929
schedulingGoalNewButton: Locator;
2030
schedulingNavButton: Locator;
2131
schedulingStatusSelector: (status: string) => string;
2232
simulationNavButton: Locator;
23-
timelineComponent: Locator;
33+
timeline: Locator;
2434
viewNavButton: Locator;
2535

2636
constructor(public page: Page, public plans: Plans, public schedulingGoals: SchedulingGoals) {
@@ -60,38 +70,56 @@ export class Plan {
6070
await this.page.waitForSelector(this.schedulingStatusSelector('Complete'), { state: 'visible', strict: true });
6171
}
6272

73+
async showPanel(name: string) {
74+
await expect(this.gridMenu).not.toBeVisible();
75+
await this.gridMenuButton.first().click();
76+
await this.gridMenu.waitFor({ state: 'visible' });
77+
await this.gridMenuItem(name).click();
78+
}
79+
6380
async showSchedulingLayout() {
6481
await this.schedulingNavButton.click();
65-
await this.schedulingComponent.waitFor({ state: 'visible' });
66-
await this.timelineComponent.waitFor({ state: 'visible' });
67-
await this.activityTableComponent.waitFor({ state: 'visible' });
68-
await this.activityFormComponent.waitFor({ state: 'visible' });
69-
await expect(this.schedulingComponent).toBeVisible();
70-
await expect(this.timelineComponent).toBeVisible();
71-
await expect(this.activityTableComponent).toBeVisible();
72-
await expect(this.activityFormComponent).toBeVisible();
82+
await this.panelScheduling.waitFor({ state: 'visible' });
83+
await this.timeline.waitFor({ state: 'visible' });
84+
await this.activityTable.waitFor({ state: 'visible' });
85+
await this.panelActivityForm.waitFor({ state: 'visible' });
86+
await expect(this.panelScheduling).toBeVisible();
87+
await expect(this.timeline).toBeVisible();
88+
await expect(this.activityTable).toBeVisible();
89+
await expect(this.panelActivityForm).toBeVisible();
7390
await expect(this.schedulingNavButton).toHaveClass(/selected/);
7491
}
7592

7693
updatePage(page: Page): void {
7794
this.activitiesNavButton = page.locator(`.nav-button:has-text("Activities")`);
78-
this.activityFormComponent = page.locator('[data-component-name="ActivityForm"]');
79-
this.activityTableComponent = page.locator('[data-component-name="ActivityTable"]');
80-
this.activityTypesComponent = page.locator('[data-component-name="ActivityTypes"]');
95+
this.activityTable = page.locator('[data-component-name="ActivityTable"]');
8196
this.appError = page.locator('.app-error');
8297
this.constraintsNavButton = page.locator(`.nav-button:has-text("Constraints")`);
98+
this.gridMenu = page.locator('.grid-menu > .menu > .menu-slot');
99+
this.gridMenuButton = page.locator('.grid-menu');
100+
this.gridMenuItem = (name: string) =>
101+
page.locator(`.grid-menu > .menu > .menu-slot > .menu-item:has-text("${name}")`);
83102
this.page = page;
103+
this.panelActivityForm = page.locator('[data-component-name="ActivityFormPanel"]');
104+
this.panelActivityTypes = page.locator('[data-component-name="ActivityTypesPanel"]');
105+
this.panelConstraintViolations = page.locator('[data-component-name="ConstraintViolationsPanel"]');
106+
this.panelConstraints = page.locator('[data-component-name="ConstraintsPanel"]');
107+
this.panelExpansion = page.locator('[data-component-name="ExpansionPanel"]');
108+
this.panelScheduling = page.locator('[data-component-name="SchedulingPanel"]');
109+
this.panelSimulation = page.locator('[data-component-name="SimulationPanel"]');
110+
this.panelTimelineForm = page.locator('[data-component-name="TimelineFormPanel"]');
111+
this.panelViewEditor = page.locator('[data-component-name="ViewEditorPanel"]');
112+
this.panelViews = page.locator('[data-component-name="ViewsPanel"]');
84113
this.planTitle = page.locator(`.plan-title:has-text("${this.plans.planName}")`);
85114
this.scheduleButton = page.locator('.status-badge > .title:has-text("Schedule")');
86-
this.schedulingComponent = page.locator('[data-component-name="Scheduling"]');
87115
this.schedulingGoalDifferenceBadge = page.locator('.difference-badge');
88116
this.schedulingGoalEnabledCheckbox = page.locator(
89117
`.scheduling-goal:has-text("${this.schedulingGoals.goalName}") >> input[type="checkbox"]`,
90118
);
91119
this.schedulingGoalNewButton = page.locator(`button[name="new-scheduling-goal"]`);
92120
this.schedulingNavButton = page.locator(`.nav-button:has-text("Scheduling")`);
93121
this.simulationNavButton = page.locator(`.nav-button:has-text("Simulation")`);
94-
this.timelineComponent = page.locator('[data-component-name="Timeline"]');
122+
this.timeline = page.locator('[data-component-name="Timeline"]');
95123
this.viewNavButton = page.locator(`.nav-button:has-text("View")`);
96124
}
97125
}

e2e-tests/tests/plan.test.ts

+52-4
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,58 @@ test.describe.serial('Plan', () => {
4040
});
4141

4242
test('Initially the View layout should be displayed', async () => {
43-
await expect(plan.activityFormComponent).toBeVisible();
44-
await expect(plan.activityTableComponent).toBeVisible();
45-
await expect(plan.activityTypesComponent).toBeVisible();
46-
await expect(plan.timelineComponent).toBeVisible();
43+
await expect(plan.panelActivityForm).toBeVisible();
44+
await expect(plan.activityTable).toBeVisible();
45+
await expect(plan.panelActivityTypes).toBeVisible();
46+
await expect(plan.timeline).toBeVisible();
4747
await expect(plan.viewNavButton).toHaveClass(/selected/);
4848
});
49+
50+
test(`Clicking on 'Constraints' in the grid menu should show the constraints panel`, async () => {
51+
await expect(plan.panelConstraints).not.toBeVisible();
52+
await plan.showPanel('Constraints');
53+
await expect(plan.panelConstraints).toBeVisible();
54+
});
55+
56+
test(`Clicking on 'Constraint Violations' in the grid menu should show the constraint violations panel`, async () => {
57+
await expect(plan.panelConstraintViolations).not.toBeVisible();
58+
await plan.showPanel('Constraint Violations');
59+
await expect(plan.panelConstraintViolations).toBeVisible();
60+
});
61+
62+
test(`Clicking on 'Expansion' in the grid menu should show the expansion panel`, async () => {
63+
await expect(plan.panelExpansion).not.toBeVisible();
64+
await plan.showPanel('Expansion');
65+
await expect(plan.panelExpansion).toBeVisible();
66+
});
67+
68+
test(`Clicking on 'Scheduling' in the grid menu should show the scheduling panel`, async () => {
69+
await expect(plan.panelScheduling).not.toBeVisible();
70+
await plan.showPanel('Scheduling');
71+
await expect(plan.panelScheduling).toBeVisible();
72+
});
73+
74+
test(`Clicking on 'Simulation' in the grid menu should show the simulation panel`, async () => {
75+
await expect(plan.panelSimulation).not.toBeVisible();
76+
await plan.showPanel('Simulation');
77+
await expect(plan.panelSimulation).toBeVisible();
78+
});
79+
80+
test(`Clicking on 'Timeline' in the grid menu should show the timeline form panel`, async () => {
81+
await expect(plan.panelTimelineForm).not.toBeVisible();
82+
await plan.showPanel('Timeline');
83+
await expect(plan.panelTimelineForm).toBeVisible();
84+
});
85+
86+
test(`Clicking on 'Views' in the grid menu should show the views panel`, async () => {
87+
await expect(plan.panelViews).not.toBeVisible();
88+
await plan.showPanel('Views');
89+
await expect(plan.panelViews).toBeVisible();
90+
});
91+
92+
test(`Clicking on 'View Editor' in the grid menu should show the view editor panel`, async () => {
93+
await expect(plan.panelViewEditor).not.toBeVisible();
94+
await plan.showPanel('View Editor');
95+
await expect(plan.panelViewEditor).toBeVisible();
96+
});
4997
});

src/components/menus/GridMenu.svelte

+10-10
Original file line numberDiff line numberDiff line change
@@ -20,43 +20,43 @@
2020
<i class="bi bi-chevron-down" style="font-size: 12px;" />
2121

2222
<Menu bind:this={gridMenu}>
23-
<MenuItem on:click={() => updateGridComponent('ActivityTypes')}>
23+
<MenuItem on:click={() => updateGridComponent('ActivityTypesPanel')}>
2424
<i class="bi bi-book" />
2525
Activity Types
2626
</MenuItem>
27-
<MenuItem on:click={() => updateGridComponent('ConstraintsGrid')}>
27+
<MenuItem on:click={() => updateGridComponent('ConstraintsPanel')}>
2828
<i class="bi bi-braces-asterisk" />
2929
Constraints
3030
</MenuItem>
31-
<MenuItem on:click={() => updateGridComponent('ConstraintViolations')}>
31+
<MenuItem on:click={() => updateGridComponent('ConstraintViolationsPanel')}>
3232
<i class="bi bi-file-earmark-excel" />
3333
Constraint Violations
3434
</MenuItem>
35-
<MenuItem on:click={() => updateGridComponent('Expansion')}>
35+
<MenuItem on:click={() => updateGridComponent('ExpansionPanel')}>
3636
<i class="bi bi-code-square" />
3737
Expansion
3838
</MenuItem>
39-
<MenuItem on:click={() => updateGridComponent('Scheduling')}>
39+
<MenuItem on:click={() => updateGridComponent('SchedulingPanel')}>
4040
<i class="bi bi-calendar3" />
4141
Scheduling
4242
</MenuItem>
43-
<MenuItem on:click={() => updateGridComponent('ActivityForm')}>
43+
<MenuItem on:click={() => updateGridComponent('ActivityFormPanel')}>
4444
<i class="si si-activity" />
4545
Selected Activity
4646
</MenuItem>
47-
<MenuItem on:click={() => updateGridComponent('Simulation')}>
47+
<MenuItem on:click={() => updateGridComponent('SimulationPanel')}>
4848
<i class="bi bi-gear-wide-connected" />
4949
Simulation
5050
</MenuItem>
51-
<MenuItem on:click={() => updateGridComponent('TimelineForm')}>
51+
<MenuItem on:click={() => updateGridComponent('TimelineFormPanel')}>
5252
<i class="bi bi-calendar2-range" />
5353
Timeline
5454
</MenuItem>
55-
<MenuItem on:click={() => updateGridComponent('Views')}>
55+
<MenuItem on:click={() => updateGridComponent('ViewsPanel')}>
5656
<i class="bi bi-columns" />
5757
Views
5858
</MenuItem>
59-
<MenuItem on:click={() => updateGridComponent('ViewEditor')}>
59+
<MenuItem on:click={() => updateGridComponent('ViewEditorPanel')}>
6060
<i class="bi bi-code" />
6161
View Editor
6262
</MenuItem>
File renamed without changes.

src/routes/plans/[id].svelte

+20-20
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22
import type { Load } from '@sveltejs/kit';
33
import { keyBy } from 'lodash-es';
44
import { onDestroy, onMount } from 'svelte';
5-
import ActivityForm from '../../components/activity/ActivityForm.svelte';
5+
import ActivityFormPanel from '../../components/activity/ActivityFormPanel.svelte';
66
import ActivityTable from '../../components/activity/ActivityTable.svelte';
7-
import ActivityTypes from '../../components/activity/ActivityTypes.svelte';
7+
import ActivityTypesPanel from '../../components/activity/ActivityTypesPanel.svelte';
88
import Nav from '../../components/app/Nav.svelte';
99
import NavButton from '../../components/app/NavButton.svelte';
10-
import ConstraintsGrid from '../../components/constraints/ConstraintsGrid.svelte';
11-
import ConstraintViolations from '../../components/constraints/ConstraintViolations.svelte';
12-
import Expansion from '../../components/expansion/Expansion.svelte';
13-
import Scheduling from '../../components/scheduling/Scheduling.svelte';
14-
import Simulation from '../../components/simulation/Simulation.svelte';
15-
import TimelineForm from '../../components/timeline/form/TimelineForm.svelte';
10+
import ConstraintsPanel from '../../components/constraints/ConstraintsPanel.svelte';
11+
import ConstraintViolationsPanel from '../../components/constraints/ConstraintViolationsPanel.svelte';
12+
import ExpansionPanel from '../../components/expansion/ExpansionPanel.svelte';
13+
import SchedulingPanel from '../../components/scheduling/SchedulingPanel.svelte';
14+
import SimulationPanel from '../../components/simulation/SimulationPanel.svelte';
15+
import TimelineFormPanel from '../../components/timeline/form/TimelineFormPanel.svelte';
1616
import Timeline from '../../components/timeline/Timeline.svelte';
1717
import CssGrid from '../../components/ui/CssGrid.svelte';
1818
import IFrame from '../../components/ui/IFrame.svelte';
1919
import SplitGrid from '../../components/ui/SplitGrid.svelte';
20-
import ViewEditor from '../../components/view/ViewEditor.svelte';
21-
import Views from '../../components/view/Views.svelte';
20+
import ViewEditorPanel from '../../components/view/ViewEditorPanel.svelte';
21+
import ViewsPanel from '../../components/view/ViewsPanel.svelte';
2222
import { activitiesMap, resetActivityStores } from '../../stores/activities';
2323
import { checkConstraintsStatus, resetConstraintStores } from '../../stores/constraints';
2424
import {
@@ -81,19 +81,19 @@
8181
export let initialView: View | null;
8282
8383
const gridComponentsByName: Record<string, unknown> = {
84-
ActivityForm,
84+
ActivityFormPanel,
8585
ActivityTable,
86-
ActivityTypes,
87-
ConstraintViolations,
88-
ConstraintsGrid,
89-
Expansion,
86+
ActivityTypesPanel,
87+
ConstraintViolationsPanel,
88+
ConstraintsPanel,
89+
ExpansionPanel,
9090
IFrame,
91-
Scheduling,
92-
Simulation,
91+
SchedulingPanel,
92+
SimulationPanel,
9393
Timeline,
94-
TimelineForm,
95-
ViewEditor,
96-
Views,
94+
TimelineFormPanel,
95+
ViewEditorPanel,
96+
ViewsPanel,
9797
};
9898
9999
$: if (initialPlan) {

src/utilities/grid.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
export const activitiesGrid: Grid = {
66
columnSizes: '1fr 3px 3fr 3px 1fr',
77
columns: [
8-
{ componentName: 'ActivityTypes', id: 1, type: 'component' },
8+
{ componentName: 'ActivityTypesPanel', id: 1, type: 'component' },
99
{ id: 2, track: 1, type: 'gutter' },
1010
{
1111
id: 3,
@@ -18,7 +18,7 @@ export const activitiesGrid: Grid = {
1818
type: 'rows',
1919
},
2020
{ id: 7, track: 3, type: 'gutter' },
21-
{ componentName: 'ActivityForm', id: 8, type: 'component' },
21+
{ componentName: 'ActivityFormPanel', id: 8, type: 'component' },
2222
],
2323
gridName: 'Activities',
2424
id: 0,
@@ -28,7 +28,7 @@ export const activitiesGrid: Grid = {
2828
export const constraintsGrid: Grid = {
2929
columnSizes: '1fr 3px 3fr 3px 1fr',
3030
columns: [
31-
{ componentName: 'ConstraintsGrid', id: 1, type: 'component' },
31+
{ componentName: 'ConstraintsPanel', id: 1, type: 'component' },
3232
{ id: 2, track: 1, type: 'gutter' },
3333
{
3434
id: 3,
@@ -45,9 +45,9 @@ export const constraintsGrid: Grid = {
4545
id: 8,
4646
rowSizes: '1fr 3px 1fr',
4747
rows: [
48-
{ componentName: 'ActivityForm', id: 9, type: 'component' },
48+
{ componentName: 'ActivityFormPanel', id: 9, type: 'component' },
4949
{ id: 10, track: 1, type: 'gutter' },
50-
{ componentName: 'ConstraintViolations', id: 11, type: 'component' },
50+
{ componentName: 'ConstraintViolationsPanel', id: 11, type: 'component' },
5151
],
5252
type: 'rows',
5353
},
@@ -60,7 +60,7 @@ export const constraintsGrid: Grid = {
6060
export const schedulingGrid: Grid = {
6161
columnSizes: '1fr 3px 3fr 3px 1fr',
6262
columns: [
63-
{ componentName: 'Scheduling', id: 1, type: 'component' },
63+
{ componentName: 'SchedulingPanel', id: 1, type: 'component' },
6464
{ id: 2, track: 1, type: 'gutter' },
6565
{
6666
id: 3,
@@ -73,7 +73,7 @@ export const schedulingGrid: Grid = {
7373
type: 'rows',
7474
},
7575
{ id: 7, track: 3, type: 'gutter' },
76-
{ componentName: 'ActivityForm', id: 8, type: 'component' },
76+
{ componentName: 'ActivityFormPanel', id: 8, type: 'component' },
7777
],
7878
gridName: 'Scheduling',
7979
id: 0,
@@ -83,7 +83,7 @@ export const schedulingGrid: Grid = {
8383
export const simulationGrid: Grid = {
8484
columnSizes: '1fr 3px 3fr 3px 1fr',
8585
columns: [
86-
{ componentName: 'Simulation', id: 1, type: 'component' },
86+
{ componentName: 'SimulationPanel', id: 1, type: 'component' },
8787
{ id: 2, track: 1, type: 'gutter' },
8888
{
8989
id: 3,
@@ -96,7 +96,7 @@ export const simulationGrid: Grid = {
9696
type: 'rows',
9797
},
9898
{ id: 7, track: 3, type: 'gutter' },
99-
{ componentName: 'ActivityForm', id: 8, type: 'component' },
99+
{ componentName: 'ActivityFormPanel', id: 8, type: 'component' },
100100
],
101101
gridName: 'Simulation',
102102
id: 0,

0 commit comments

Comments
 (0)