Compare commits
	
		
			80 Commits
		
	
	
		
			mct6339
			...
			omm-r5.1.0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d42b2dd023 | ||
| 
						 | 
					59ae7cddc5 | ||
| 
						 | 
					321c7a3af5 | ||
| 
						 | 
					609cf72bd1 | ||
| 
						 | 
					a447b0ada8 | ||
| 
						 | 
					5788f4cc69 | ||
| 
						 | 
					f94b4e53c7 | ||
| 
						 | 
					faf71f1e67 | ||
| 
						 | 
					23310f85ae | ||
| 
						 | 
					d80819634b | ||
| 
						 | 
					483b62c152 | ||
| 
						 | 
					1254279635 | ||
| 
						 | 
					c768a71656 | ||
| 
						 | 
					678a92bd29 | ||
| 
						 | 
					34b488944a | ||
| 
						 | 
					4d1dd2f51d | ||
| 
						 | 
					080f7b8f4b | ||
| 
						 | 
					483f2feac8 | ||
| 
						 | 
					7ec2c4475b | ||
| 
						 | 
					8f59b16465 | ||
| 
						 | 
					36cfb1d515 | ||
| 
						 | 
					2ff7132e90 | ||
| 
						 | 
					d0ca398e01 | ||
| 
						 | 
					59278e8a06 | ||
| 
						 | 
					c8377f392b | ||
| 
						 | 
					29df748f2b | ||
| 
						 | 
					665ba6dae1 | ||
| 
						 | 
					f39f8df4e2 | ||
| 
						 | 
					4aa572d489 | ||
| 
						 | 
					0b24c4f2c5 | ||
| 
						 | 
					e4657f79cd | ||
| 
						 | 
					f2059406e0 | ||
| 
						 | 
					3e3dc7dd83 | ||
| 
						 | 
					50742c4f82 | ||
| 
						 | 
					2f04add2a3 | ||
| 
						 | 
					0ce5060246 | ||
| 
						 | 
					00353cdccf | ||
| 
						 | 
					a1ac209d74 | ||
| 
						 | 
					bdd8477b54 | ||
| 
						 | 
					f690f36bfb | ||
| 
						 | 
					e174f075df | ||
| 
						 | 
					8cf12db104 | ||
| 
						 | 
					453b1f3009 | ||
| 
						 | 
					201c669328 | ||
| 
						 | 
					1b7fb9b952 | ||
| 
						 | 
					a3c5450205 | ||
| 
						 | 
					8831b75c5d | ||
| 
						 | 
					8fe0472af2 | ||
| 
						 | 
					6cb5c47f3a | ||
| 
						 | 
					eff0cc96b9 | ||
| 
						 | 
					6ac7f24c63 | ||
| 
						 | 
					39463c515f | ||
| 
						 | 
					25c0dab346 | ||
| 
						 | 
					3714958627 | ||
| 
						 | 
					270a3d4f49 | ||
| 
						 | 
					1dc137f95e | ||
| 
						 | 
					ff3a20e446 | ||
| 
						 | 
					0b3e0e7efd | ||
| 
						 | 
					22cc28d733 | ||
| 
						 | 
					006fa0bcc7 | ||
| 
						 | 
					817d8da3e4 | ||
| 
						 | 
					8df81f0ea9 | ||
| 
						 | 
					1f30706d27 | ||
| 
						 | 
					600890c4a6 | ||
| 
						 | 
					b5002e166a | ||
| 
						 | 
					39cff51db0 | ||
| 
						 | 
					73734d99ea | ||
| 
						 | 
					1d4cf1ff06 | ||
| 
						 | 
					f388d9a548 | ||
| 
						 | 
					8040b275fc | ||
| 
						 | 
					0dd12bce85 | ||
| 
						 | 
					9c9e0442f1 | ||
| 
						 | 
					d49f057698 | ||
| 
						 | 
					c74ad1279c | ||
| 
						 | 
					470a451956 | ||
| 
						 | 
					fa6cbb6f4d | ||
| 
						 | 
					52c00cfaef | ||
| 
						 | 
					96d723a424 | ||
| 
						 | 
					fb4b80862e | ||
| 
						 | 
					bb2c8cfa63 | 
@@ -23,5 +23,5 @@ module.exports = merge(common, {
 | 
			
		||||
            __OPENMCT_ROOT_RELATIVE__: '""'
 | 
			
		||||
        })
 | 
			
		||||
    ],
 | 
			
		||||
    devtool: "source-map"
 | 
			
		||||
    devtool: "eval-source-map"
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
# Open MCT License
 | 
			
		||||
 | 
			
		||||
Open MCT, Copyright (c) 2014-2022, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.
 | 
			
		||||
Open MCT, Copyright (c) 2014-2023, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.
 | 
			
		||||
 | 
			
		||||
Open MCT is licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.  You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
#*****************************************************************************
 | 
			
		||||
#* Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
#* Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
#* as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
#* Administration. All rights reserved.
 | 
			
		||||
#*
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<!--
 | 
			
		||||
 Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 Administration. All rights reserved.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -159,24 +159,26 @@ async function expandTreePaneItemByName(page, name) {
 | 
			
		||||
 * @returns {Promise<CreatedObjectInfo>} An object containing information about the newly created domain object.
 | 
			
		||||
 */
 | 
			
		||||
async function createPlanFromJSON(page, { name, json, parent = 'mine' }) {
 | 
			
		||||
    if (!name) {
 | 
			
		||||
        name = `Plan:${genUuid()}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const parentUrl = await getHashUrlToDomainObject(page, parent);
 | 
			
		||||
 | 
			
		||||
    // Navigate to the parent object. This is necessary to create the object
 | 
			
		||||
    // in the correct location, such as a folder, layout, or plot.
 | 
			
		||||
    await page.goto(`${parentUrl}?hideTree=true`);
 | 
			
		||||
 | 
			
		||||
    //Click the Create button
 | 
			
		||||
    // Click the Create button
 | 
			
		||||
    await page.click('button:has-text("Create")');
 | 
			
		||||
 | 
			
		||||
    // Click 'Plan' menu option
 | 
			
		||||
    await page.click(`li:text("Plan")`);
 | 
			
		||||
 | 
			
		||||
    // Modify the name input field of the domain object to accept 'name'
 | 
			
		||||
    if (name) {
 | 
			
		||||
        const nameInput = page.locator('form[name="mctForm"] .first input[type="text"]');
 | 
			
		||||
        await nameInput.fill("");
 | 
			
		||||
        await nameInput.fill(name);
 | 
			
		||||
    }
 | 
			
		||||
    const nameInput = page.locator('form[name="mctForm"] .first input[type="text"]');
 | 
			
		||||
    await nameInput.fill("");
 | 
			
		||||
    await nameInput.fill(name);
 | 
			
		||||
 | 
			
		||||
    // Upload buffer from memory
 | 
			
		||||
    await page.locator('input#fileElem').setInputFiles({
 | 
			
		||||
@@ -194,7 +196,7 @@ async function createPlanFromJSON(page, { name, json, parent = 'mine' }) {
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    // Wait until the URL is updated
 | 
			
		||||
    await page.waitForURL(`**/mine/*`);
 | 
			
		||||
    await page.waitForURL(`**/${parent}/*`);
 | 
			
		||||
    const uuid = await getFocusedObjectUuid(page);
 | 
			
		||||
    const objectUrl = await getHashUrlToDomainObject(page, uuid);
 | 
			
		||||
 | 
			
		||||
@@ -383,6 +385,25 @@ async function setEndOffset(page, offset) {
 | 
			
		||||
    await setTimeConductorOffset(page, offset, endOffsetButton);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Selects an inspector tab based on the provided tab name
 | 
			
		||||
 *
 | 
			
		||||
 * @param {import('@playwright/test').Page} page
 | 
			
		||||
 * @param {String} name the name of the tab
 | 
			
		||||
 */
 | 
			
		||||
async function selectInspectorTab(page, name) {
 | 
			
		||||
    const inspectorTabs = page.getByRole('tablist');
 | 
			
		||||
    const inspectorTab = inspectorTabs.getByTitle(name);
 | 
			
		||||
    const inspectorTabClass = await inspectorTab.getAttribute('class');
 | 
			
		||||
    const isSelectedInspectorTab = inspectorTabClass.includes('is-current');
 | 
			
		||||
 | 
			
		||||
    // do not click a tab that is already selected or it will timeout your test
 | 
			
		||||
    // do to a { pointer-events: none; } on selected tabs
 | 
			
		||||
    if (!isSelectedInspectorTab) {
 | 
			
		||||
        await inspectorTab.click();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line no-undef
 | 
			
		||||
module.exports = {
 | 
			
		||||
    createDomainObjectWithDefaults,
 | 
			
		||||
@@ -396,5 +417,6 @@ module.exports = {
 | 
			
		||||
    setFixedTimeMode,
 | 
			
		||||
    setRealTimeMode,
 | 
			
		||||
    setStartOffset,
 | 
			
		||||
    setEndOffset
 | 
			
		||||
    setEndOffset,
 | 
			
		||||
    selectInspectorTab
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* eslint-disable no-undef */
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -32,9 +32,8 @@ async function enterTextEntry(page, text) {
 | 
			
		||||
    await page.locator(NOTEBOOK_DROP_AREA).click();
 | 
			
		||||
 | 
			
		||||
    // enter text
 | 
			
		||||
    await page.locator('div.c-ne__text').click();
 | 
			
		||||
    await page.locator('div.c-ne__text').fill(text);
 | 
			
		||||
    await page.locator('div.c-ne__text').press('Enter');
 | 
			
		||||
    await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').fill(text);
 | 
			
		||||
    await commitEntry(page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -51,6 +50,15 @@ async function dragAndDropEmbed(page, notebookObject) {
 | 
			
		||||
    await page.click('button[title="Show selected item in tree"]');
 | 
			
		||||
    // Drag and drop the SWG into the notebook
 | 
			
		||||
    await page.dragAndDrop(`text=${swg.name}`, NOTEBOOK_DROP_AREA);
 | 
			
		||||
    await commitEntry(page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
 * @param {import('@playwright/test').Page} page
 | 
			
		||||
 */
 | 
			
		||||
async function commitEntry(page) {
 | 
			
		||||
    await page.locator('.c-ne__save-button > button').click();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line no-undef
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										92
									
								
								e2e/helper/planningUtils.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								e2e/helper/planningUtils.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT includes source code licensed under additional open source
 | 
			
		||||
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 | 
			
		||||
 * this source code distribution or the Licensing information page available
 | 
			
		||||
 * at runtime from the About dialog for additional information.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
import { expect } from '../pluginFixtures';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Asserts that the number of activities in the plan view matches the number of
 | 
			
		||||
 * activities in the plan data within the specified time bounds. Performs an assertion
 | 
			
		||||
 * for each activity in the plan data per group, using the earliest activity's
 | 
			
		||||
 * start time as the start bound and the current activity's end time as the end bound.
 | 
			
		||||
 * @param {import('@playwright/test').Page} page the page
 | 
			
		||||
 * @param {object} plan The raw plan json to assert against
 | 
			
		||||
 * @param {string} objectUrl The URL of the object to assert against (plan or gantt chart)
 | 
			
		||||
 */
 | 
			
		||||
export async function assertPlanActivities(page, plan, objectUrl) {
 | 
			
		||||
    const groups = Object.keys(plan);
 | 
			
		||||
    for (const group of groups) {
 | 
			
		||||
        for (let i = 0; i < plan[group].length; i++) {
 | 
			
		||||
            // Set the startBound to the start time of the first activity in the group
 | 
			
		||||
            const startBound = plan[group][0].start;
 | 
			
		||||
            // Set the endBound to the end time of the current activity
 | 
			
		||||
            let endBound = plan[group][i].end;
 | 
			
		||||
            if (endBound === startBound) {
 | 
			
		||||
                // Prevent oddities with setting start and end bound equal
 | 
			
		||||
                // via URL params
 | 
			
		||||
                endBound += 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Switch to fixed time mode with all plan events within the bounds
 | 
			
		||||
            await page.goto(`${objectUrl}?tc.mode=fixed&tc.startBound=${startBound}&tc.endBound=${endBound}&tc.timeSystem=utc&view=plan.view`);
 | 
			
		||||
 | 
			
		||||
            // Assert that the number of activities in the plan view matches the number of
 | 
			
		||||
            // activities in the plan data within the specified time bounds
 | 
			
		||||
            const eventCount = await page.locator('.activity-bounds').count();
 | 
			
		||||
            expect(eventCount).toEqual(Object.values(plan)
 | 
			
		||||
                .flat()
 | 
			
		||||
                .filter(event =>
 | 
			
		||||
                    activitiesWithinTimeBounds(event.start, event.end, startBound, endBound)).length);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns true if the activities time bounds overlap, false otherwise.
 | 
			
		||||
* @param {number} start1 the start time of the first activity
 | 
			
		||||
* @param {number} end1 the end time of the first activity
 | 
			
		||||
* @param {number} start2 the start time of the second activity
 | 
			
		||||
* @param {number} end2 the end time of the second activity
 | 
			
		||||
* @returns {boolean} true if the activities overlap, false otherwise
 | 
			
		||||
*/
 | 
			
		||||
function activitiesWithinTimeBounds(start1, end1, start2, end2) {
 | 
			
		||||
    return (start1 >= start2 && start1 <= end2)
 | 
			
		||||
         || (end1 >= start2 && end1 <= end2)
 | 
			
		||||
         || (start2 >= start1 && start2 <= end1)
 | 
			
		||||
         || (end2 >= start1 && end2 <= end1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Navigate to the plan view, switch to fixed time mode,
 | 
			
		||||
 * and set the bounds to span all activities.
 | 
			
		||||
 * @param {import('@playwright/test').Page} page
 | 
			
		||||
 * @param {object} planJson
 | 
			
		||||
 * @param {string} planObjectUrl
 | 
			
		||||
 */
 | 
			
		||||
export async function setBoundsToSpanAllActivities(page, planJson, planObjectUrl) {
 | 
			
		||||
    const activities = Object.values(planJson).flat();
 | 
			
		||||
    // Get the earliest start value
 | 
			
		||||
    const start = Math.min(...activities.map(activity => activity.start));
 | 
			
		||||
    // Get the latest end value
 | 
			
		||||
    const end = Math.max(...activities.map(activity => activity.end));
 | 
			
		||||
    // Set the start and end bounds to the earliest start and latest end
 | 
			
		||||
    await page.goto(`${planObjectUrl}?tc.mode=fixed&tc.startBound=${start}&tc.endBound=${end}&tc.timeSystem=utc&view=plan.view`);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* eslint-disable no-undef */
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1080
									
								
								e2e/test-data/examplePlans/ExamplePlan_Large.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1080
									
								
								e2e/test-data/examplePlans/ExamplePlan_Large.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										44
									
								
								e2e/test-data/examplePlans/ExamplePlan_Small1.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								e2e/test-data/examplePlans/ExamplePlan_Small1.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
{
 | 
			
		||||
  "Group 1": [
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Past event 1",
 | 
			
		||||
          "start": 1660320408000,
 | 
			
		||||
          "end": 1660343797000,
 | 
			
		||||
          "type": "Group 1",
 | 
			
		||||
          "color": "orange",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Past event 2",
 | 
			
		||||
          "start": 1660406808000,
 | 
			
		||||
          "end": 1660429160000,
 | 
			
		||||
          "type": "Group 1",
 | 
			
		||||
          "color": "orange",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Past event 3",
 | 
			
		||||
          "start": 1660493208000,
 | 
			
		||||
          "end": 1660503981000,
 | 
			
		||||
          "type": "Group 1",
 | 
			
		||||
          "color": "orange",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Past event 4",
 | 
			
		||||
          "start": 1660579608000,
 | 
			
		||||
          "end": 1660624108000,
 | 
			
		||||
          "type": "Group 1",
 | 
			
		||||
          "color": "orange",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Past event 5",
 | 
			
		||||
          "start": 1660666008000,
 | 
			
		||||
          "end": 1660681529000,
 | 
			
		||||
          "type": "Group 1",
 | 
			
		||||
          "color": "orange",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								e2e/test-data/examplePlans/ExamplePlan_Small2.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								e2e/test-data/examplePlans/ExamplePlan_Small2.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
{
 | 
			
		||||
  "Group 1": [
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Group 1 event 1",
 | 
			
		||||
          "start": 1650320408000,
 | 
			
		||||
          "end": 1660343797000,
 | 
			
		||||
          "type": "Group 1",
 | 
			
		||||
          "color": "orange",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Group 1 event 2",
 | 
			
		||||
          "start": 1660005808000,
 | 
			
		||||
          "end": 1660429160000,
 | 
			
		||||
          "type": "Group 1",
 | 
			
		||||
          "color": "yellow",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      }
 | 
			
		||||
  ],
 | 
			
		||||
  "Group 2": [
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Group 2 event 1",
 | 
			
		||||
          "start": 1660320408000,
 | 
			
		||||
          "end": 1660420408000,
 | 
			
		||||
          "type": "Group 2",
 | 
			
		||||
          "color": "green",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
          "name": "Group 2 event 2",
 | 
			
		||||
          "start": 1660406808000,
 | 
			
		||||
          "end": 1690429160000,
 | 
			
		||||
          "type": "Group 2",
 | 
			
		||||
          "color": "blue",
 | 
			
		||||
          "textColor": "white"
 | 
			
		||||
      }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										85
									
								
								e2e/tests/functional/planning/ganttChart.e2e.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								e2e/tests/functional/planning/ganttChart.e2e.spec.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT includes source code licensed under additional open source
 | 
			
		||||
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 | 
			
		||||
 * this source code distribution or the Licensing information page available
 | 
			
		||||
 * at runtime from the About dialog for additional information.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
const { test, expect } = require('../../../pluginFixtures');
 | 
			
		||||
const { createPlanFromJSON, createDomainObjectWithDefaults, selectInspectorTab } = require('../../../appActions');
 | 
			
		||||
const testPlan1 = require('../../../test-data/examplePlans/ExamplePlan_Small1.json');
 | 
			
		||||
const testPlan2 = require('../../../test-data/examplePlans/ExamplePlan_Small2.json');
 | 
			
		||||
const { assertPlanActivities, setBoundsToSpanAllActivities } = require('../../../helper/planningUtils');
 | 
			
		||||
const { getPreciseDuration } = require('../../../../src/utils/duration');
 | 
			
		||||
 | 
			
		||||
test.describe("Gantt Chart", () => {
 | 
			
		||||
    let ganttChart;
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
        ganttChart = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Gantt Chart'
 | 
			
		||||
        });
 | 
			
		||||
        await createPlanFromJSON(page, {
 | 
			
		||||
            json: testPlan1,
 | 
			
		||||
            parent: ganttChart.uuid
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test("Displays all plan events", async ({ page }) => {
 | 
			
		||||
        await page.goto(ganttChart.url);
 | 
			
		||||
 | 
			
		||||
        await assertPlanActivities(page, testPlan1, ganttChart.url);
 | 
			
		||||
    });
 | 
			
		||||
    test("Replaces a plan with a new plan", async ({ page }) => {
 | 
			
		||||
        await assertPlanActivities(page, testPlan1, ganttChart.url);
 | 
			
		||||
        await createPlanFromJSON(page, {
 | 
			
		||||
            json: testPlan2,
 | 
			
		||||
            parent: ganttChart.uuid
 | 
			
		||||
        });
 | 
			
		||||
        const replaceModal = page.getByRole('dialog').filter({ hasText: "This action will replace the current Plan. Do you want to continue?" });
 | 
			
		||||
        await expect(replaceModal).toBeVisible();
 | 
			
		||||
        await page.getByRole('button', { name: 'OK' }).click();
 | 
			
		||||
 | 
			
		||||
        await assertPlanActivities(page, testPlan2, ganttChart.url);
 | 
			
		||||
    });
 | 
			
		||||
    test("Can select a single activity and display its details in the inspector", async ({ page }) => {
 | 
			
		||||
        test.slow();
 | 
			
		||||
        await page.goto(ganttChart.url);
 | 
			
		||||
 | 
			
		||||
        await setBoundsToSpanAllActivities(page, testPlan1, ganttChart.url);
 | 
			
		||||
 | 
			
		||||
        const activities = Object.values(testPlan1).flat();
 | 
			
		||||
        const activity = activities[0];
 | 
			
		||||
        await page.locator('g').filter({ hasText: new RegExp(activity.name) }).click();
 | 
			
		||||
        await selectInspectorTab(page, 'Activity');
 | 
			
		||||
 | 
			
		||||
        const startDateTime = await page.locator('.c-inspect-properties__label:has-text("Start DateTime")+.c-inspect-properties__value').innerText();
 | 
			
		||||
        const endDateTime = await page.locator('.c-inspect-properties__label:has-text("End DateTime")+.c-inspect-properties__value').innerText();
 | 
			
		||||
        const duration = await page.locator('.c-inspect-properties__label:has-text("duration")+.c-inspect-properties__value').innerText();
 | 
			
		||||
 | 
			
		||||
        const expectedStartDate = new Date(activity.start).toISOString();
 | 
			
		||||
        const actualStartDate = new Date(startDateTime).toISOString();
 | 
			
		||||
        const expectedEndDate = new Date(activity.end).toISOString();
 | 
			
		||||
        const actualEndDate = new Date(endDateTime).toISOString();
 | 
			
		||||
        const expectedDuration = getPreciseDuration(activity.end - activity.start);
 | 
			
		||||
        const actualDuration = duration;
 | 
			
		||||
 | 
			
		||||
        expect(expectedStartDate).toEqual(actualStartDate);
 | 
			
		||||
        expect(expectedEndDate).toEqual(actualEndDate);
 | 
			
		||||
        expect(expectedDuration).toEqual(actualDuration);
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -19,69 +19,21 @@
 | 
			
		||||
 * this source code distribution or the Licensing information page available
 | 
			
		||||
 * at runtime from the About dialog for additional information.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
const { test, expect } = require('../../../pluginFixtures');
 | 
			
		||||
const { test } = require('../../../pluginFixtures');
 | 
			
		||||
const { createPlanFromJSON } = require('../../../appActions');
 | 
			
		||||
 | 
			
		||||
const testPlan = {
 | 
			
		||||
    "TEST_GROUP": [
 | 
			
		||||
        {
 | 
			
		||||
            "name": "Past event 1",
 | 
			
		||||
            "start": 1660320408000,
 | 
			
		||||
            "end": 1660343797000,
 | 
			
		||||
            "type": "TEST-GROUP",
 | 
			
		||||
            "color": "orange",
 | 
			
		||||
            "textColor": "white"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "Past event 2",
 | 
			
		||||
            "start": 1660406808000,
 | 
			
		||||
            "end": 1660429160000,
 | 
			
		||||
            "type": "TEST-GROUP",
 | 
			
		||||
            "color": "orange",
 | 
			
		||||
            "textColor": "white"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "Past event 3",
 | 
			
		||||
            "start": 1660493208000,
 | 
			
		||||
            "end": 1660503981000,
 | 
			
		||||
            "type": "TEST-GROUP",
 | 
			
		||||
            "color": "orange",
 | 
			
		||||
            "textColor": "white"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "Past event 4",
 | 
			
		||||
            "start": 1660579608000,
 | 
			
		||||
            "end": 1660624108000,
 | 
			
		||||
            "type": "TEST-GROUP",
 | 
			
		||||
            "color": "orange",
 | 
			
		||||
            "textColor": "white"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "Past event 5",
 | 
			
		||||
            "start": 1660666008000,
 | 
			
		||||
            "end": 1660681529000,
 | 
			
		||||
            "type": "TEST-GROUP",
 | 
			
		||||
            "color": "orange",
 | 
			
		||||
            "textColor": "white"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
};
 | 
			
		||||
const testPlan1 = require('../../../test-data/examplePlans/ExamplePlan_Small1.json');
 | 
			
		||||
const { assertPlanActivities } = require('../../../helper/planningUtils');
 | 
			
		||||
 | 
			
		||||
test.describe("Plan", () => {
 | 
			
		||||
    test("Create a Plan and display all plan events @unstable", async ({ page }) => {
 | 
			
		||||
    let plan;
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
 | 
			
		||||
        const plan = await createPlanFromJSON(page, {
 | 
			
		||||
            name: 'Test Plan',
 | 
			
		||||
            json: testPlan
 | 
			
		||||
        plan = await createPlanFromJSON(page, {
 | 
			
		||||
            json: testPlan1
 | 
			
		||||
        });
 | 
			
		||||
        const startBound = testPlan.TEST_GROUP[0].start;
 | 
			
		||||
        const endBound = testPlan.TEST_GROUP[testPlan.TEST_GROUP.length - 1].end;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
        // Switch to fixed time mode with all plan events within the bounds
 | 
			
		||||
        await page.goto(`${plan.url}?tc.mode=fixed&tc.startBound=${startBound}&tc.endBound=${endBound}&tc.timeSystem=utc&view=plan.view`);
 | 
			
		||||
        const eventCount = await page.locator('.activity-bounds').count();
 | 
			
		||||
        expect(eventCount).toEqual(testPlan.TEST_GROUP.length);
 | 
			
		||||
    test("Displays all plan events", async ({ page }) => {
 | 
			
		||||
        await assertPlanActivities(page, testPlan1, plan.url);
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -52,10 +52,9 @@ test.describe.serial('Condition Set CRUD Operations on @localStorage', () => {
 | 
			
		||||
 | 
			
		||||
        //Set object identifier from url
 | 
			
		||||
        conditionSetUrl = page.url();
 | 
			
		||||
        console.log('conditionSetUrl ' + conditionSetUrl);
 | 
			
		||||
 | 
			
		||||
        getConditionSetIdentifierFromUrl = conditionSetUrl.split('/').pop().split('?')[0];
 | 
			
		||||
        console.debug('getConditionSetIdentifierFromUrl ' + getConditionSetIdentifierFromUrl);
 | 
			
		||||
        console.debug(`getConditionSetIdentifierFromUrl: ${getConditionSetIdentifierFromUrl}`);
 | 
			
		||||
        await page.close();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@@ -181,10 +180,11 @@ test.describe.serial('Condition Set CRUD Operations on @localStorage', () => {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test.describe('Basic Condition Set Use', () => {
 | 
			
		||||
    test('Can add a condition', async ({ page }) => {
 | 
			
		||||
        //Navigate to baseURL
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        // Open a browser, navigate to the main page, and wait until all network events to resolve
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
    test('Can add a condition', async ({ page }) => {
 | 
			
		||||
        // Create a new condition set
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Condition Set',
 | 
			
		||||
@@ -199,4 +199,127 @@ test.describe('Basic Condition Set Use', () => {
 | 
			
		||||
        const numOfUnnamedConditions = await page.locator('text=Unnamed Condition').count();
 | 
			
		||||
        expect(numOfUnnamedConditions).toEqual(1);
 | 
			
		||||
    });
 | 
			
		||||
    test('ConditionSet should display appropriate view options', async ({ page }) => {
 | 
			
		||||
        test.info().annotations.push({
 | 
			
		||||
            type: 'issue',
 | 
			
		||||
            description: 'https://github.com/nasa/openmct/issues/5924'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Sine Wave Generator',
 | 
			
		||||
            name: "Alpha Sine Wave Generator"
 | 
			
		||||
        });
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Sine Wave Generator',
 | 
			
		||||
            name: "Beta Sine Wave Generator"
 | 
			
		||||
        });
 | 
			
		||||
        const conditionSet1 = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Condition Set',
 | 
			
		||||
            name: "Test Condition Set"
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Change the object to edit mode
 | 
			
		||||
        await page.locator('[title="Edit"]').click();
 | 
			
		||||
 | 
			
		||||
        // Expand the 'My Items' folder in the left tree
 | 
			
		||||
        await page.goto(conditionSet1.url);
 | 
			
		||||
        page.click('button[title="Show selected item in tree"]');
 | 
			
		||||
        // Add the Alpha & Beta Sine Wave Generator to the Condition Set and save changes
 | 
			
		||||
        const treePane = page.getByRole('tree', {
 | 
			
		||||
            name: 'Main Tree'
 | 
			
		||||
        });
 | 
			
		||||
        const alphaGeneratorTreeItem = treePane.getByRole('treeitem', { name: "Alpha Sine Wave Generator"});
 | 
			
		||||
        const betaGeneratorTreeItem = treePane.getByRole('treeitem', { name: "Beta Sine Wave Generator"});
 | 
			
		||||
        const conditionCollection = page.locator('#conditionCollection');
 | 
			
		||||
 | 
			
		||||
        await alphaGeneratorTreeItem.dragTo(conditionCollection);
 | 
			
		||||
        await betaGeneratorTreeItem.dragTo(conditionCollection);
 | 
			
		||||
 | 
			
		||||
        const saveButtonLocator = page.locator('button[title="Save"]');
 | 
			
		||||
        await saveButtonLocator.click();
 | 
			
		||||
        await page.getByRole('listitem', { name: 'Save and Finish Editing' }).click();
 | 
			
		||||
        await page.click('button[title="Change the current view"]');
 | 
			
		||||
 | 
			
		||||
        await expect(page.getByRole('menuitem', { name: /Lad Table/ })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('menuitem', { name: /Conditions View/ })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('menuitem', { name: /Plot/ })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('menuitem', { name: /Telemetry Table/ })).toBeVisible();
 | 
			
		||||
    });
 | 
			
		||||
    test('ConditionSet should output blank instead of the default value', async ({ page }) => {
 | 
			
		||||
        //Navigate to baseURL
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
 | 
			
		||||
        //Click the Create button
 | 
			
		||||
        await page.click('button:has-text("Create")');
 | 
			
		||||
 | 
			
		||||
        // Click the object specified by 'type'
 | 
			
		||||
        await page.click(`li[role='menuitem']:text("Sine Wave Generator")`);
 | 
			
		||||
        await page.getByRole('spinbutton', { name: 'Loading Delay (ms)' }).fill('8000');
 | 
			
		||||
        const nameInput = page.locator('form[name="mctForm"] .first input[type="text"]');
 | 
			
		||||
        await nameInput.fill("Delayed Sine Wave Generator");
 | 
			
		||||
 | 
			
		||||
        // Click OK button and wait for Navigate event
 | 
			
		||||
        await Promise.all([
 | 
			
		||||
            page.waitForLoadState(),
 | 
			
		||||
            page.click('[aria-label="Save"]'),
 | 
			
		||||
            // Wait for Save Banner to appear
 | 
			
		||||
            page.waitForSelector('.c-message-banner__message')
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        // Create a new condition set
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Condition Set',
 | 
			
		||||
            name: "Test Blank Output of Condition Set"
 | 
			
		||||
        });
 | 
			
		||||
        // Change the object to edit mode
 | 
			
		||||
        await page.locator('[title="Edit"]').click();
 | 
			
		||||
 | 
			
		||||
        // Click Add Condition button twice
 | 
			
		||||
        await page.locator('#addCondition').click();
 | 
			
		||||
        await page.locator('#addCondition').click();
 | 
			
		||||
        await page.locator('#conditionCollection').getByRole('textbox').nth(0).fill('First Condition');
 | 
			
		||||
        await page.locator('#conditionCollection').getByRole('textbox').nth(1).fill('Second Condition');
 | 
			
		||||
 | 
			
		||||
        // Expand the 'My Items' folder in the left tree
 | 
			
		||||
        await page.locator('.c-tree__item__view-control.c-disclosure-triangle').first().click();
 | 
			
		||||
        // Add the Sine Wave Generator to the Condition Set and save changes
 | 
			
		||||
        const treePane = page.getByRole('tree', {
 | 
			
		||||
            name: 'Main Tree'
 | 
			
		||||
        });
 | 
			
		||||
        const sineWaveGeneratorTreeItem = treePane.getByRole('treeitem', { name: "Delayed Sine Wave Generator"});
 | 
			
		||||
        const conditionCollection = await page.locator('#conditionCollection');
 | 
			
		||||
 | 
			
		||||
        await sineWaveGeneratorTreeItem.dragTo(conditionCollection);
 | 
			
		||||
 | 
			
		||||
        const firstCriterionTelemetry = await page.locator('[aria-label="Criterion Telemetry Selection"] >> nth=0');
 | 
			
		||||
        firstCriterionTelemetry.selectOption({ label: 'Delayed Sine Wave Generator' });
 | 
			
		||||
 | 
			
		||||
        const secondCriterionTelemetry = await page.locator('[aria-label="Criterion Telemetry Selection"] >> nth=1');
 | 
			
		||||
        secondCriterionTelemetry.selectOption({ label: 'Delayed Sine Wave Generator' });
 | 
			
		||||
 | 
			
		||||
        const firstCriterionMetadata = await page.locator('[aria-label="Criterion Metadata Selection"] >> nth=0');
 | 
			
		||||
        firstCriterionMetadata.selectOption({ label: 'Sine' });
 | 
			
		||||
 | 
			
		||||
        const secondCriterionMetadata = await page.locator('[aria-label="Criterion Metadata Selection"] >> nth=1');
 | 
			
		||||
        secondCriterionMetadata.selectOption({ label: 'Sine' });
 | 
			
		||||
 | 
			
		||||
        const firstCriterionComparison = await page.locator('[aria-label="Criterion Comparison Selection"] >> nth=0');
 | 
			
		||||
        firstCriterionComparison.selectOption({ label: 'is greater than or equal to' });
 | 
			
		||||
 | 
			
		||||
        const secondCriterionComparison = await page.locator('[aria-label="Criterion Comparison Selection"] >> nth=1');
 | 
			
		||||
        secondCriterionComparison.selectOption({ label: 'is less than' });
 | 
			
		||||
 | 
			
		||||
        const firstCriterionInput = await page.locator('[aria-label="Criterion Input"] >> nth=0');
 | 
			
		||||
        await firstCriterionInput.fill("0");
 | 
			
		||||
 | 
			
		||||
        const secondCriterionInput = await page.locator('[aria-label="Criterion Input"] >> nth=1');
 | 
			
		||||
        await secondCriterionInput.fill("0");
 | 
			
		||||
 | 
			
		||||
        const saveButtonLocator = page.locator('button[title="Save"]');
 | 
			
		||||
        await saveButtonLocator.click();
 | 
			
		||||
        await page.getByRole('listitem', { name: 'Save and Finish Editing' }).click();
 | 
			
		||||
 | 
			
		||||
        const outputValue = await page.locator('[aria-label="Current Output Value"]');
 | 
			
		||||
        await expect(outputValue).toHaveText('---');
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -29,8 +29,8 @@ const { waitForAnimations } = require('../../../../baseFixtures');
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
 | 
			
		||||
const backgroundImageSelector = '.c-imagery__main-image__background-image';
 | 
			
		||||
const panHotkey = process.platform === 'linux' ? ['Control', 'Alt'] : ['Alt'];
 | 
			
		||||
const expectedAltText = process.platform === 'linux' ? 'Ctrl+Alt drag to pan' : 'Alt drag to pan';
 | 
			
		||||
const panHotkey = process.platform === 'linux' ? ['Shift', 'Alt'] : ['Alt'];
 | 
			
		||||
const expectedAltText = process.platform === 'linux' ? 'Shift+Alt drag to pan' : 'Alt drag to pan';
 | 
			
		||||
const thumbnailUrlParamsRegexp = /\?w=100&h=100/;
 | 
			
		||||
 | 
			
		||||
//The following block of tests verifies the basic functionality of example imagery and serves as a template for Imagery objects embedded in other objects.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -21,7 +21,120 @@
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults, setStartOffset, setFixedTimeMode, setRealTimeMode } = require('../../../../appActions');
 | 
			
		||||
const { createDomainObjectWithDefaults, setStartOffset, setFixedTimeMode, setRealTimeMode, selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
 | 
			
		||||
test.describe('Testing LAD table configuration', () => {
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
 | 
			
		||||
        // Create LAD table
 | 
			
		||||
        const ladTable = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'LAD Table',
 | 
			
		||||
            name: "Test LAD Table"
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Create Sine Wave Generator
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Sine Wave Generator',
 | 
			
		||||
            name: "Test Sine Wave Generator",
 | 
			
		||||
            parent: ladTable.uuid
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await page.goto(ladTable.url);
 | 
			
		||||
    });
 | 
			
		||||
    test('in edit mode, LAD Tables provide ability to hide columns', async ({ page }) => {
 | 
			
		||||
        // Edit LAD table
 | 
			
		||||
        await page.locator('[title="Edit"]').click();
 | 
			
		||||
 | 
			
		||||
        // // Expand the 'My Items' folder in the left tree
 | 
			
		||||
        // await page.locator('.c-tree__item__view-control.c-disclosure-triangle').click();
 | 
			
		||||
        // // Add the Sine Wave Generator to the LAD table and save changes
 | 
			
		||||
        // await page.dragAndDrop('role=treeitem[name=/Test Sine Wave Generator/]', '.c-lad-table-wrapper');
 | 
			
		||||
        // select configuration tab in inspector
 | 
			
		||||
        await selectInspectorTab(page, 'LAD Table Configuration');
 | 
			
		||||
 | 
			
		||||
        // make sure headers are visible initially
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        // hide timestamp column
 | 
			
		||||
        await page.getByLabel('Timestamp').uncheck();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        // hide units & type column
 | 
			
		||||
        await page.getByLabel('Units').uncheck();
 | 
			
		||||
        await page.getByLabel('Type').uncheck();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
 | 
			
		||||
 | 
			
		||||
        // save and reload and verify they columns are still hidden
 | 
			
		||||
        await page.locator('button[title="Save"]').click();
 | 
			
		||||
        await page.locator('text=Save and Finish Editing').click();
 | 
			
		||||
        await page.reload();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
 | 
			
		||||
 | 
			
		||||
        // Edit LAD table
 | 
			
		||||
        await page.locator('[title="Edit"]').click();
 | 
			
		||||
        await selectInspectorTab(page, 'LAD Table Configuration');
 | 
			
		||||
 | 
			
		||||
        // show timestamp column
 | 
			
		||||
        await page.getByLabel('Timestamp').check();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        // save and reload and make sure only timestamp is still visible
 | 
			
		||||
        await page.locator('button[title="Save"]').click();
 | 
			
		||||
        await page.locator('text=Save and Finish Editing').click();
 | 
			
		||||
        await page.reload();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        // Edit LAD table
 | 
			
		||||
        await page.locator('[title="Edit"]').click();
 | 
			
		||||
        await selectInspectorTab(page, 'LAD Table Configuration');
 | 
			
		||||
 | 
			
		||||
        // show units and type columns
 | 
			
		||||
        await page.getByLabel('Units').check();
 | 
			
		||||
        await page.getByLabel('Type').check();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        // save and reload and make sure all columns are still visible
 | 
			
		||||
        await page.locator('button[title="Save"]').click();
 | 
			
		||||
        await page.locator('text=Save and Finish Editing').click();
 | 
			
		||||
        await page.reload();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
 | 
			
		||||
        await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('LAD Tables don\'t allow selection of rows but does show context click menus', async ({ page }) => {
 | 
			
		||||
        const cell = await page.locator('.js-first-data');
 | 
			
		||||
        const userSelectable = await cell.evaluate((el) => {
 | 
			
		||||
            return window.getComputedStyle(el).getPropertyValue('user-select');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        expect(userSelectable).toBe('none');
 | 
			
		||||
        // Right-click on the LAD table row
 | 
			
		||||
        await cell.click({
 | 
			
		||||
            button: 'right'
 | 
			
		||||
        });
 | 
			
		||||
        const menuOptions = page.locator('.c-menu ul');
 | 
			
		||||
        await expect.soft(menuOptions).toContainText('View Full Datum');
 | 
			
		||||
        await expect.soft(menuOptions).toContainText('View Historical Data');
 | 
			
		||||
        await expect.soft(menuOptions).toContainText('Remove');
 | 
			
		||||
        // await page.locator('li[title="Remove this object from its containing object."]').click();
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test.describe('Testing LAD table @unstable', () => {
 | 
			
		||||
    let sineWaveObject;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -131,13 +131,13 @@ test.describe('Notebook Tests with CouchDB @couchdb', () => {
 | 
			
		||||
        // This happens for 3 tags so 12 requests
 | 
			
		||||
        addingNotebookElementsRequests = [];
 | 
			
		||||
        await page.hover('[aria-label="Tag"]:has-text("Driving")');
 | 
			
		||||
        await page.locator('[aria-label="Tag"]:has-text("Driving") ~ .c-completed-tag-deletion').click();
 | 
			
		||||
        await page.locator('[aria-label="Remove tag Driving"]').click();
 | 
			
		||||
        await page.waitForSelector('[aria-label="Tag"]:has-text("Driving")', {state: 'hidden'});
 | 
			
		||||
        await page.hover('[aria-label="Tag"]:has-text("Drilling")');
 | 
			
		||||
        await page.locator('[aria-label="Tag"]:has-text("Drilling") ~ .c-completed-tag-deletion').click();
 | 
			
		||||
        await page.locator('[aria-label="Remove tag Drilling"]').click();
 | 
			
		||||
        await page.waitForSelector('[aria-label="Tag"]:has-text("Drilling")', {state: 'hidden'});
 | 
			
		||||
        page.hover('[aria-label="Tag"]:has-text("Science")');
 | 
			
		||||
        await page.locator('[aria-label="Tag"]:has-text("Science") ~ .c-completed-tag-deletion').click();
 | 
			
		||||
        await page.locator('[aria-label="Remove tag Science"]').click();
 | 
			
		||||
        await page.waitForSelector('[aria-label="Tag"]:has-text("Science")', {state: 'hidden'});
 | 
			
		||||
        page.waitForLoadState('networkidle');
 | 
			
		||||
        expect(filterNonFetchRequests(addingNotebookElementsRequests).length).toBeLessThanOrEqual(12);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -25,7 +25,8 @@ This test suite is dedicated to tests which verify form functionality.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
 | 
			
		||||
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
const nbUtils = require('../../../../helper/notebookUtils');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * Creates a notebook object and adds an entry.
 | 
			
		||||
@@ -39,12 +40,7 @@ async function createNotebookAndEntry(page, iterations = 1) {
 | 
			
		||||
    const notebook = createDomainObjectWithDefaults(page, { type: 'Notebook' });
 | 
			
		||||
 | 
			
		||||
    for (let iteration = 0; iteration < iterations; iteration++) {
 | 
			
		||||
        // Create an entry
 | 
			
		||||
        await page.locator('text=To start a new entry, click here or drag and drop any object').click();
 | 
			
		||||
        const entryLocator = `[aria-label="Notebook Entry Input"] >> nth = ${iteration}`;
 | 
			
		||||
        await page.locator(entryLocator).click();
 | 
			
		||||
        await page.locator(entryLocator).fill(`Entry ${iteration}`);
 | 
			
		||||
        await page.locator(entryLocator).press('Enter');
 | 
			
		||||
        await nbUtils.enterTextEntry(page, `Entry ${iteration}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return notebook;
 | 
			
		||||
@@ -57,7 +53,7 @@ async function createNotebookAndEntry(page, iterations = 1) {
 | 
			
		||||
  */
 | 
			
		||||
async function createNotebookEntryAndTags(page, iterations = 1) {
 | 
			
		||||
    const notebook = await createNotebookAndEntry(page, iterations);
 | 
			
		||||
    await page.locator('text=Annotations').click();
 | 
			
		||||
    await selectInspectorTab(page, 'Annotations');
 | 
			
		||||
 | 
			
		||||
    for (let iteration = 0; iteration < iterations; iteration++) {
 | 
			
		||||
        // Hover and click "Add Tag" button
 | 
			
		||||
@@ -88,7 +84,10 @@ test.describe('Tagging in Notebooks @addInit', () => {
 | 
			
		||||
    test('Can load tags', async ({ page }) => {
 | 
			
		||||
        await createNotebookAndEntry(page);
 | 
			
		||||
 | 
			
		||||
        await page.locator('text=Annotations').click();
 | 
			
		||||
        // TODO can be removed with fix for https://github.com/nasa/openmct/issues/6411
 | 
			
		||||
        await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').click();
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Annotations');
 | 
			
		||||
 | 
			
		||||
        await page.locator('button:has-text("Add Tag")').click();
 | 
			
		||||
 | 
			
		||||
@@ -111,6 +110,30 @@ test.describe('Tagging in Notebooks @addInit', () => {
 | 
			
		||||
        await expect(page.locator('[aria-label="Autocomplete Options"]')).not.toContainText("Driving");
 | 
			
		||||
        await expect(page.locator('[aria-label="Autocomplete Options"]')).toContainText("Drilling");
 | 
			
		||||
    });
 | 
			
		||||
    test('Can cancel adding tags', async ({ page }) => {
 | 
			
		||||
        await createNotebookAndEntry(page);
 | 
			
		||||
 | 
			
		||||
        // TODO can be removed with fix for https://github.com/nasa/openmct/issues/6411
 | 
			
		||||
        await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').click();
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Annotations');
 | 
			
		||||
 | 
			
		||||
        // Test canceling adding a tag after we click "Type to select tag"
 | 
			
		||||
        await page.locator('button:has-text("Add Tag")').click();
 | 
			
		||||
 | 
			
		||||
        await page.locator('[placeholder="Type to select tag"]').click();
 | 
			
		||||
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
 | 
			
		||||
 | 
			
		||||
        await expect(page.locator('button:has-text("Add Tag")')).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        // Test canceling adding a tag after we just click "Add Tag"
 | 
			
		||||
        await page.locator('button:has-text("Add Tag")').click();
 | 
			
		||||
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
 | 
			
		||||
 | 
			
		||||
        await expect(page.locator('button:has-text("Add Tag")')).toBeVisible();
 | 
			
		||||
    });
 | 
			
		||||
    test('Can search for tags and preview works properly', async ({ page }) => {
 | 
			
		||||
        await createNotebookEntryAndTags(page);
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
 | 
			
		||||
@@ -145,7 +168,7 @@ test.describe('Tagging in Notebooks @addInit', () => {
 | 
			
		||||
        await createNotebookEntryAndTags(page);
 | 
			
		||||
        // Delete Driving
 | 
			
		||||
        await page.hover('[aria-label="Tag"]:has-text("Driving")');
 | 
			
		||||
        await page.locator('[aria-label="Tag"]:has-text("Driving") ~ .c-completed-tag-deletion').click();
 | 
			
		||||
        await page.locator('[aria-label="Remove tag Driving"]').click();
 | 
			
		||||
 | 
			
		||||
        await expect(page.locator('[aria-label="Tags Inspector"]')).toContainText("Science");
 | 
			
		||||
        await expect(page.locator('[aria-label="Tags Inspector"]')).not.toContainText("Driving");
 | 
			
		||||
@@ -247,8 +270,10 @@ test.describe('Tagging in Notebooks @addInit', () => {
 | 
			
		||||
    test('Can cancel adding a tag', async ({ page }) => {
 | 
			
		||||
        await createNotebookAndEntry(page);
 | 
			
		||||
 | 
			
		||||
        // Click on Annotations tab
 | 
			
		||||
        await page.locator('.c-inspector__tab', { hasText: "Annotations" }).click();
 | 
			
		||||
        // TODO can be removed with fix for https://github.com/nasa/openmct/issues/6411
 | 
			
		||||
        await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').click();
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Annotations');
 | 
			
		||||
 | 
			
		||||
        // Click on the "Add Tag" button
 | 
			
		||||
        await page.locator('button:has-text("Add Tag")').click();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -24,6 +24,7 @@
 | 
			
		||||
Testsuite for plot autoscale.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
test.use({
 | 
			
		||||
    viewport: {
 | 
			
		||||
@@ -50,6 +51,7 @@ test.describe('Autoscale', () => {
 | 
			
		||||
        // enter edit mode
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
        await turnOffAutoscale(page);
 | 
			
		||||
 | 
			
		||||
        await setUserDefinedMinAndMax(page, '-2', '2');
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 17 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 19 KiB  | 
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -26,6 +26,8 @@ necessarily be used for reference when writing new tests in this area.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
 | 
			
		||||
test.describe('Log plot tests', () => {
 | 
			
		||||
    test('Log Plot ticks are functionally correct in regular and log mode and after refresh', async ({ page, openmctConfig }) => {
 | 
			
		||||
        const { myItemsFolderName } = openmctConfig;
 | 
			
		||||
@@ -36,6 +38,7 @@ test.describe('Log plot tests', () => {
 | 
			
		||||
        await makeOverlayPlot(page, myItemsFolderName);
 | 
			
		||||
        await testRegularTicks(page);
 | 
			
		||||
        await enableEditMode(page);
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
        await enableLogMode(page);
 | 
			
		||||
        await testLogTicks(page);
 | 
			
		||||
        await disableLogMode(page);
 | 
			
		||||
@@ -186,6 +189,7 @@ async function enableEditMode(page) {
 | 
			
		||||
 */
 | 
			
		||||
async function enableLogMode(page) {
 | 
			
		||||
    // turn on log mode
 | 
			
		||||
    await expect(page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox')).not.toBeChecked();
 | 
			
		||||
    await page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox').check();
 | 
			
		||||
    // await page.locator('text=Y Axis Label Log mode Auto scale Padding >> input[type="checkbox"]').first().check();
 | 
			
		||||
}
 | 
			
		||||
@@ -195,6 +199,7 @@ async function enableLogMode(page) {
 | 
			
		||||
 */
 | 
			
		||||
async function disableLogMode(page) {
 | 
			
		||||
    // turn off log mode
 | 
			
		||||
    await expect(page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox')).toBeChecked();
 | 
			
		||||
    await page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox').uncheck();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -26,7 +26,7 @@ necessarily be used for reference when writing new tests in this area.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
 | 
			
		||||
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
 | 
			
		||||
test.describe('Overlay Plot', () => {
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
@@ -45,6 +45,8 @@ test.describe('Overlay Plot', () => {
 | 
			
		||||
 | 
			
		||||
        await page.goto(overlayPlot.url);
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
 | 
			
		||||
        // navigate to plot series color palette
 | 
			
		||||
        await page.click('.l-browse-bar__actions__edit');
 | 
			
		||||
        await page.locator('li.c-tree__item.menus-to-left .c-disclosure-triangle').click();
 | 
			
		||||
@@ -60,6 +62,69 @@ test.describe('Overlay Plot', () => {
 | 
			
		||||
        expect(color).toBe('rgb(255, 166, 61)');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Limit lines persist when series is moved to another Y Axis and on refresh', async ({ page }) => {
 | 
			
		||||
        test.info().annotations.push({
 | 
			
		||||
            type: 'issue',
 | 
			
		||||
            description: 'https://github.com/nasa/openmct/issues/6338'
 | 
			
		||||
        });
 | 
			
		||||
        // Create an Overlay Plot with a default SWG
 | 
			
		||||
        const overlayPlot = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Overlay Plot"
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const swgA = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Sine Wave Generator",
 | 
			
		||||
            parent: overlayPlot.uuid
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await page.goto(overlayPlot.url);
 | 
			
		||||
 | 
			
		||||
        // Assert that no limit lines are shown by default
 | 
			
		||||
        await page.waitForSelector('.js-limit-area', { state: 'attached' });
 | 
			
		||||
        expect(await page.locator('.c-plot-limit-line').count()).toBe(0);
 | 
			
		||||
 | 
			
		||||
        // Enter edit mode
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        // Expand the "Sine Wave Generator" plot series options and enable limit lines
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
        await page.getByRole('list', { name: 'Plot Series Properties' }).locator('span').first().click();
 | 
			
		||||
        await page.getByRole('list', { name: 'Plot Series Properties' }).locator('[title="Display limit lines"]~div input').check();
 | 
			
		||||
 | 
			
		||||
        await assertLimitLinesExistAndAreVisible(page);
 | 
			
		||||
 | 
			
		||||
        // Save (exit edit mode)
 | 
			
		||||
        await page.locator('button[title="Save"]').click();
 | 
			
		||||
        await page.locator('li[title="Save and Finish Editing"]').click();
 | 
			
		||||
 | 
			
		||||
        await assertLimitLinesExistAndAreVisible(page);
 | 
			
		||||
 | 
			
		||||
        await page.reload();
 | 
			
		||||
 | 
			
		||||
        await assertLimitLinesExistAndAreVisible(page);
 | 
			
		||||
 | 
			
		||||
        // Enter edit mode
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
 | 
			
		||||
        // Drag Sine Wave Generator series from Y Axis 1 into Y Axis 2
 | 
			
		||||
        await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
 | 
			
		||||
 | 
			
		||||
        await assertLimitLinesExistAndAreVisible(page);
 | 
			
		||||
 | 
			
		||||
        // Save (exit edit mode)
 | 
			
		||||
        await page.locator('button[title="Save"]').click();
 | 
			
		||||
        await page.locator('li[title="Save and Finish Editing"]').click();
 | 
			
		||||
 | 
			
		||||
        await assertLimitLinesExistAndAreVisible(page);
 | 
			
		||||
 | 
			
		||||
        await page.reload();
 | 
			
		||||
 | 
			
		||||
        await assertLimitLinesExistAndAreVisible(page);
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('The elements pool supports dragging series into multiple y-axis buckets', async ({ page }) => {
 | 
			
		||||
        const overlayPlot = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Overlay Plot"
 | 
			
		||||
@@ -89,22 +154,7 @@ test.describe('Overlay Plot', () => {
 | 
			
		||||
        await page.goto(overlayPlot.url);
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        // Expand the elements pool vertically
 | 
			
		||||
        await page.locator('.l-pane.l-pane--vertical-handle-before', {
 | 
			
		||||
            hasText: 'Elements'
 | 
			
		||||
        }).locator('.l-pane__handle').hover();
 | 
			
		||||
        await page.mouse.down();
 | 
			
		||||
        await page.mouse.move(0, 100);
 | 
			
		||||
        await page.mouse.up();
 | 
			
		||||
 | 
			
		||||
        const yAxis1PropertyGroup = page.locator('[aria-label="Y Axis Properties"]');
 | 
			
		||||
        const yAxis2PropertyGroup = page.locator('[aria-label="Y Axis 2 Properties"]');
 | 
			
		||||
        const yAxis3PropertyGroup = page.locator('[aria-label="Y Axis 3 Properties"]');
 | 
			
		||||
 | 
			
		||||
        // Assert that Y Axis 1 property group is visible only
 | 
			
		||||
        await expect(yAxis1PropertyGroup).toBeVisible();
 | 
			
		||||
        await expect(yAxis2PropertyGroup).toBeHidden();
 | 
			
		||||
        await expect(yAxis3PropertyGroup).toBeHidden();
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
 | 
			
		||||
        // Drag swg a, c, e into Y Axis 2
 | 
			
		||||
        await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
 | 
			
		||||
@@ -112,6 +162,12 @@ test.describe('Overlay Plot', () => {
 | 
			
		||||
        await page.locator(`#inspector-elements-tree >> text=${swgE.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
 | 
			
		||||
 | 
			
		||||
        // Assert that Y Axis 1 and Y Axis 2 property groups are visible only
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
 | 
			
		||||
        const yAxis1PropertyGroup = page.locator('[aria-label="Y Axis Properties"]');
 | 
			
		||||
        const yAxis2PropertyGroup = page.locator('[aria-label="Y Axis 2 Properties"]');
 | 
			
		||||
        const yAxis3PropertyGroup = page.locator('[aria-label="Y Axis 3 Properties"]');
 | 
			
		||||
 | 
			
		||||
        await expect(yAxis1PropertyGroup).toBeVisible();
 | 
			
		||||
        await expect(yAxis2PropertyGroup).toBeVisible();
 | 
			
		||||
        await expect(yAxis3PropertyGroup).toBeHidden();
 | 
			
		||||
@@ -120,15 +176,21 @@ test.describe('Overlay Plot', () => {
 | 
			
		||||
        const yAxis2Group = page.getByLabel("Y Axis 2");
 | 
			
		||||
        const yAxis3Group = page.getByLabel("Y Axis 3");
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
 | 
			
		||||
        // Drag swg b into Y Axis 3
 | 
			
		||||
        await page.locator(`#inspector-elements-tree >> text=${swgB.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 3"]'));
 | 
			
		||||
 | 
			
		||||
        // Assert that all Y Axis property groups are visible
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
 | 
			
		||||
        await expect(yAxis1PropertyGroup).toBeVisible();
 | 
			
		||||
        await expect(yAxis2PropertyGroup).toBeVisible();
 | 
			
		||||
        await expect(yAxis3PropertyGroup).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        // Verify that the elements are in the correct buckets and in the correct order
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
 | 
			
		||||
        expect(yAxis1Group.getByRole('listitem', { name: swgD.name })).toBeTruthy();
 | 
			
		||||
        expect(yAxis1Group.getByRole('listitem').nth(0).getByText(swgD.name)).toBeTruthy();
 | 
			
		||||
        expect(yAxis2Group.getByRole('listitem', { name: swgE.name })).toBeTruthy();
 | 
			
		||||
@@ -154,8 +216,10 @@ test.describe('Overlay Plot', () => {
 | 
			
		||||
        await page.goto(overlayPlot.url);
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
 | 
			
		||||
        await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).click();
 | 
			
		||||
        await page.locator('.js-overlay canvas').nth(1);
 | 
			
		||||
 | 
			
		||||
        const plotPixelSize = await getCanvasPixelsWithData(page);
 | 
			
		||||
        expect(plotPixelSize).toBeGreaterThan(0);
 | 
			
		||||
    });
 | 
			
		||||
@@ -198,3 +262,20 @@ async function getCanvasPixelsWithData(page) {
 | 
			
		||||
 | 
			
		||||
    return getTelemValuePromise;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @param {import('@playwright/test').Page} page
 | 
			
		||||
 */
 | 
			
		||||
async function assertLimitLinesExistAndAreVisible(page) {
 | 
			
		||||
    // Wait for plot series data to load
 | 
			
		||||
    await expect(page.locator('.js-series-data-loaded')).toBeVisible();
 | 
			
		||||
    // Wait for limit lines to be created
 | 
			
		||||
    await page.waitForSelector('.js-limit-area', { state: 'attached' });
 | 
			
		||||
    const limitLineCount = await page.locator('.c-plot-limit-line').count();
 | 
			
		||||
    // There should be 10 limit lines created by default
 | 
			
		||||
    expect(await page.locator('.c-plot-limit-line').count()).toBe(10);
 | 
			
		||||
    for (let i = 0; i < limitLineCount; i++) {
 | 
			
		||||
        await expect(page.locator('.c-plot-limit-line').nth(i)).toBeVisible();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -25,6 +25,7 @@ Tests to verify log plot functionality. Note this test suite if very much under
 | 
			
		||||
necessarily be used for reference when writing new tests in this area.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
 | 
			
		||||
test.describe('Legend color in sync with plot color', () => {
 | 
			
		||||
@@ -33,6 +34,8 @@ test.describe('Legend color in sync with plot color', () => {
 | 
			
		||||
 | 
			
		||||
        // navigate to plot series color palette
 | 
			
		||||
        await page.click('.l-browse-bar__actions__edit');
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
 | 
			
		||||
        await page.locator('li.c-tree__item.menus-to-left .c-disclosure-triangle').click();
 | 
			
		||||
        await page.locator('.c-click-swatch--menu').click();
 | 
			
		||||
        await page.locator('.c-palette__item[style="background: rgb(255, 166, 61);"]').click();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
 | 
			
		||||
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
const uuid = require('uuid').v4;
 | 
			
		||||
 | 
			
		||||
test.describe('Scatter Plot', () => {
 | 
			
		||||
@@ -40,8 +40,8 @@ test.describe('Scatter Plot', () => {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Can add and remove telemetry sources', async ({ page }) => {
 | 
			
		||||
        const editButtonLocator = page.locator('button[title="Edit"]');
 | 
			
		||||
        const saveButtonLocator = page.locator('button[title="Save"]');
 | 
			
		||||
        const editButton = page.locator('button[title="Edit"]');
 | 
			
		||||
        const saveButton = page.locator('button[title="Save"]');
 | 
			
		||||
 | 
			
		||||
        // Create a sine wave generator within the scatter plot
 | 
			
		||||
        const swg1 = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
@@ -53,9 +53,10 @@ test.describe('Scatter Plot', () => {
 | 
			
		||||
        // Navigate to the scatter plot and verify that
 | 
			
		||||
        // the SWG appears in the elements pool
 | 
			
		||||
        await page.goto(scatterPlot.url);
 | 
			
		||||
        await editButtonLocator.click();
 | 
			
		||||
        await editButton.click();
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
        await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg1.name}`)).toBeVisible();
 | 
			
		||||
        await saveButtonLocator.click();
 | 
			
		||||
        await saveButton.click();
 | 
			
		||||
        await page.locator('li[title="Save and Finish Editing"]').click();
 | 
			
		||||
 | 
			
		||||
        // Create another sine wave generator within the scatter plot
 | 
			
		||||
@@ -72,10 +73,13 @@ test.describe('Scatter Plot', () => {
 | 
			
		||||
        // Navigate to the scatter plot and verify that the new SWG
 | 
			
		||||
        // appears in the elements pool and the old one is gone
 | 
			
		||||
        await page.goto(scatterPlot.url);
 | 
			
		||||
        await editButtonLocator.click();
 | 
			
		||||
        await editButton.click();
 | 
			
		||||
 | 
			
		||||
        // Click the "Elements" tab
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
        await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg1.name}`)).toBeHidden();
 | 
			
		||||
        await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg2.name}`)).toBeVisible();
 | 
			
		||||
        await saveButtonLocator.click();
 | 
			
		||||
        await saveButton.click();
 | 
			
		||||
 | 
			
		||||
        // Right click on the new SWG in the elements pool and delete it
 | 
			
		||||
        await page.locator(`#inspector-elements-tree >> text=${swg2.name}`).click({
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -26,7 +26,7 @@ necessarily be used for reference when writing new tests in this area.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
 | 
			
		||||
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
 | 
			
		||||
 | 
			
		||||
test.describe('Stacked Plot', () => {
 | 
			
		||||
    let stackedPlot;
 | 
			
		||||
@@ -35,8 +35,9 @@ test.describe('Stacked Plot', () => {
 | 
			
		||||
    let swgC;
 | 
			
		||||
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        //Open a browser, navigate to the main page, and wait until all networkevents to resolve
 | 
			
		||||
        await page.goto('/', { waitUntil: 'networkidle' });
 | 
			
		||||
        // Open a browser, navigate to the main page, and wait until all networkevents to resolve
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
 | 
			
		||||
        stackedPlot = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Stacked Plot"
 | 
			
		||||
        });
 | 
			
		||||
@@ -64,11 +65,7 @@ test.describe('Stacked Plot', () => {
 | 
			
		||||
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        // Expand the elements pool vertically
 | 
			
		||||
        await page.locator('.l-pane__handle').nth(2).hover({ trial: true });
 | 
			
		||||
        await page.mouse.down();
 | 
			
		||||
        await page.mouse.move(0, 100);
 | 
			
		||||
        await page.mouse.up();
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
 | 
			
		||||
        await swgBElementsPoolItem.click({ button: 'right' });
 | 
			
		||||
        await page.getByRole('menuitem').filter({ hasText: /Remove/ }).click();
 | 
			
		||||
@@ -82,9 +79,60 @@ test.describe('Stacked Plot', () => {
 | 
			
		||||
        await expect(swgCElementsPoolItem).toHaveCount(1);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Can reorder Stacked Plot items', async ({ page }) => {
 | 
			
		||||
        const swgAElementsPoolItem = page.locator('#inspector-elements-tree').locator('.c-object-label', { hasText: swgA.name });
 | 
			
		||||
        const swgBElementsPoolItem = page.locator('#inspector-elements-tree').locator('.c-object-label', { hasText: swgB.name });
 | 
			
		||||
        const swgCElementsPoolItem = page.locator('#inspector-elements-tree').locator('.c-object-label', { hasText: swgC.name });
 | 
			
		||||
 | 
			
		||||
        await page.goto(stackedPlot.url);
 | 
			
		||||
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
 | 
			
		||||
        const stackedPlotItem1 = page.locator('.c-plot--stacked-container').nth(0);
 | 
			
		||||
        const stackedPlotItem2 = page.locator('.c-plot--stacked-container').nth(1);
 | 
			
		||||
        const stackedPlotItem3 = page.locator('.c-plot--stacked-container').nth(2);
 | 
			
		||||
 | 
			
		||||
        // assert initial plot order - [swgA, swgB, swgC]
 | 
			
		||||
        await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
 | 
			
		||||
        await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
 | 
			
		||||
        await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
 | 
			
		||||
 | 
			
		||||
        // Drag and drop to reorder - [swgB, swgA, swgC]
 | 
			
		||||
        await swgBElementsPoolItem.dragTo(swgAElementsPoolItem);
 | 
			
		||||
 | 
			
		||||
        // assert plot order after reorder - [swgB, swgA, swgC]
 | 
			
		||||
        await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
 | 
			
		||||
        await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
 | 
			
		||||
        await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
 | 
			
		||||
 | 
			
		||||
        // Drag and drop to reorder - [swgB, swgC, swgA]
 | 
			
		||||
        await swgCElementsPoolItem.dragTo(swgAElementsPoolItem);
 | 
			
		||||
 | 
			
		||||
        // assert plot order after second reorder - [swgB, swgC, swgA]
 | 
			
		||||
        await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
 | 
			
		||||
        await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
 | 
			
		||||
        await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
 | 
			
		||||
 | 
			
		||||
        // collapse inspector
 | 
			
		||||
        await page.locator('.l-shell__pane-inspector .l-pane__collapse-button').click();
 | 
			
		||||
 | 
			
		||||
        // Save (exit edit mode)
 | 
			
		||||
        await page.locator('button[title="Save"]').click();
 | 
			
		||||
        await page.locator('li[title="Save and Finish Editing"]').click();
 | 
			
		||||
 | 
			
		||||
        // assert plot order persists after save - [swgB, swgC, swgA]
 | 
			
		||||
        await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
 | 
			
		||||
        await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
 | 
			
		||||
        await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Selecting a child plot while in browse and edit modes shows its properties in the inspector', async ({ page }) => {
 | 
			
		||||
        await page.goto(stackedPlot.url);
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
 | 
			
		||||
        // Click on the 1st plot
 | 
			
		||||
        await page.locator(`[aria-label="Stacked Plot Item ${swgA.name}"] canvas`).nth(1).click();
 | 
			
		||||
 | 
			
		||||
@@ -112,6 +160,8 @@ test.describe('Stacked Plot', () => {
 | 
			
		||||
        // Go into edit mode
 | 
			
		||||
        await page.click('button[title="Edit"]');
 | 
			
		||||
 | 
			
		||||
        await selectInspectorTab(page, 'Config');
 | 
			
		||||
 | 
			
		||||
        // Click on canvas for the 1st plot
 | 
			
		||||
        await page.locator(`[aria-label="Stacked Plot Item ${swgA.name}"]`).click();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										267
									
								
								e2e/tests/functional/plugins/plot/tagging.e2e.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								e2e/tests/functional/plugins/plot/tagging.e2e.spec.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,267 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT includes source code licensed under additional open source
 | 
			
		||||
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 | 
			
		||||
 * this source code distribution or the Licensing information page available
 | 
			
		||||
 * at runtime from the About dialog for additional information.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Tests to verify plot tagging functionality.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults, setRealTimeMode, setFixedTimeMode } = require('../../../../appActions');
 | 
			
		||||
 | 
			
		||||
test.describe('Plot Tagging', () => {
 | 
			
		||||
    /**
 | 
			
		||||
     * Given a canvas and a set of points, tags the points on the canvas.
 | 
			
		||||
     * @param {import('@playwright/test').Page} page
 | 
			
		||||
     * @param {HTMLCanvasElement} canvas a telemetry item with a plot
 | 
			
		||||
     * @param {Number} xEnd a telemetry item with a plot
 | 
			
		||||
     * @param {Number} yEnd a telemetry item with a plot
 | 
			
		||||
     * @returns {Promise}
 | 
			
		||||
     */
 | 
			
		||||
    async function createTags({page, canvas, xEnd, yEnd}) {
 | 
			
		||||
        await canvas.hover({trial: true});
 | 
			
		||||
 | 
			
		||||
        //Alt+Shift Drag Start to select some points to tag
 | 
			
		||||
        await page.keyboard.down('Alt');
 | 
			
		||||
        await page.keyboard.down('Shift');
 | 
			
		||||
 | 
			
		||||
        await canvas.dragTo(canvas, {
 | 
			
		||||
            sourcePosition: {
 | 
			
		||||
                x: 1,
 | 
			
		||||
                y: 1
 | 
			
		||||
            },
 | 
			
		||||
            targetPosition: {
 | 
			
		||||
                x: xEnd,
 | 
			
		||||
                y: yEnd
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        //Alt Drag End
 | 
			
		||||
        await page.keyboard.up('Alt');
 | 
			
		||||
        await page.keyboard.up('Shift');
 | 
			
		||||
 | 
			
		||||
        //Wait for canvas to stablize.
 | 
			
		||||
        await canvas.hover({trial: true});
 | 
			
		||||
 | 
			
		||||
        // add some tags
 | 
			
		||||
        await page.getByText('Annotations').click();
 | 
			
		||||
        await page.getByRole('button', { name: /Add Tag/ }).click();
 | 
			
		||||
        await page.getByPlaceholder('Type to select tag').click();
 | 
			
		||||
        await page.getByText('Driving').click();
 | 
			
		||||
 | 
			
		||||
        await page.getByRole('button', { name: /Add Tag/ }).click();
 | 
			
		||||
        await page.getByPlaceholder('Type to select tag').click();
 | 
			
		||||
        await page.getByText('Science').click();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given a telemetry item (e.g., a Sine Wave Generator) with a plot, tests that the plot can be tagged.
 | 
			
		||||
     * @param {import('@playwright/test').Page} page
 | 
			
		||||
     * @param {import('../../../../appActions').CreatedObjectInfo} telemetryItem a telemetry item with a plot
 | 
			
		||||
     * @returns {Promise}
 | 
			
		||||
     */
 | 
			
		||||
    async function testTelemetryItem(page, telemetryItem) {
 | 
			
		||||
        // Check that telemetry item also received the tag
 | 
			
		||||
        await page.goto(telemetryItem.url);
 | 
			
		||||
 | 
			
		||||
        await expect(page.getByText('No tags to display for this item')).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        const canvas = page.locator('canvas').nth(1);
 | 
			
		||||
 | 
			
		||||
        //Wait for canvas to stablize.
 | 
			
		||||
        await canvas.hover({trial: true});
 | 
			
		||||
 | 
			
		||||
        // click on the tagged plot point
 | 
			
		||||
        await canvas.click({
 | 
			
		||||
            position: {
 | 
			
		||||
                x: 325,
 | 
			
		||||
                y: 377
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await expect(page.getByText('Science')).toBeVisible();
 | 
			
		||||
        await expect(page.getByText('Driving')).toBeHidden();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given a page, tests that tags are searchable, deletable, and persist across reloads.
 | 
			
		||||
     * @param {import('@playwright/test').Page} page
 | 
			
		||||
     * @returns {Promise}
 | 
			
		||||
     */
 | 
			
		||||
    async function basicTagsTests(page) {
 | 
			
		||||
        // Search for Driving
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
 | 
			
		||||
 | 
			
		||||
        // Clicking elsewhere should cause annotation selection to be cleared
 | 
			
		||||
        await expect(page.getByText('No tags to display for this item')).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('driv');
 | 
			
		||||
        // click on the search result
 | 
			
		||||
        await page.getByRole('searchbox', { name: 'OpenMCT Search' }).getByText(/Sine Wave/).first().click();
 | 
			
		||||
 | 
			
		||||
        // Delete Driving
 | 
			
		||||
        await page.hover('[aria-label="Tag"]:has-text("Driving")');
 | 
			
		||||
        await page.locator('[aria-label="Remove tag Driving"]').click();
 | 
			
		||||
 | 
			
		||||
        // Search for Science
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('sc');
 | 
			
		||||
        await expect(page.locator('[aria-label="Search Result"]').nth(0)).toContainText("Science");
 | 
			
		||||
        await expect(page.locator('[aria-label="Search Result"]').nth(0)).not.toContainText("Drilling");
 | 
			
		||||
 | 
			
		||||
        // Search for Driving
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('driv');
 | 
			
		||||
        await expect(page.getByText('No results found')).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        //Reload Page
 | 
			
		||||
        await Promise.all([
 | 
			
		||||
            page.reload(),
 | 
			
		||||
            page.waitForLoadState('networkidle')
 | 
			
		||||
        ]);
 | 
			
		||||
        // wait for plots to load
 | 
			
		||||
        await expect(page.locator('.js-series-data-loaded')).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        await page.getByText('Annotations').click();
 | 
			
		||||
        await expect(page.getByText('No tags to display for this item')).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        const canvas = page.locator('canvas').nth(1);
 | 
			
		||||
        // click on the tagged plot point
 | 
			
		||||
        await canvas.click({
 | 
			
		||||
            position: {
 | 
			
		||||
                x: 100,
 | 
			
		||||
                y: 100
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await expect(page.getByText('Science')).toBeVisible();
 | 
			
		||||
        await expect(page.getByText('Driving')).toBeHidden();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Tags work with Overlay Plots', async ({ page }) => {
 | 
			
		||||
        //Test.slow decorator is currently broken. Needs to be fixed in https://github.com/nasa/openmct/issues/5374
 | 
			
		||||
        test.slow();
 | 
			
		||||
 | 
			
		||||
        const overlayPlot = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Overlay Plot"
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const alphaSineWave = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Sine Wave Generator",
 | 
			
		||||
            name: "Alpha Sine Wave",
 | 
			
		||||
            parent: overlayPlot.uuid
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Sine Wave Generator",
 | 
			
		||||
            name: "Beta Sine Wave",
 | 
			
		||||
            parent: overlayPlot.uuid
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await page.goto(overlayPlot.url);
 | 
			
		||||
 | 
			
		||||
        let canvas = page.locator('canvas').nth(1);
 | 
			
		||||
 | 
			
		||||
        // Switch to real-time mode
 | 
			
		||||
        // Adding tags should pause the plot
 | 
			
		||||
        await setRealTimeMode(page);
 | 
			
		||||
 | 
			
		||||
        await createTags({
 | 
			
		||||
            page,
 | 
			
		||||
            canvas,
 | 
			
		||||
            xEnd: 700,
 | 
			
		||||
            yEnd: 480
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await setFixedTimeMode(page);
 | 
			
		||||
 | 
			
		||||
        // changing to fixed time mode rebuilds canvas?
 | 
			
		||||
        canvas = page.locator('canvas').nth(1);
 | 
			
		||||
 | 
			
		||||
        await basicTagsTests(page);
 | 
			
		||||
        await testTelemetryItem(page, alphaSineWave);
 | 
			
		||||
 | 
			
		||||
        // set to real time mode
 | 
			
		||||
        await setRealTimeMode(page);
 | 
			
		||||
 | 
			
		||||
        // Search for Science
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('sc');
 | 
			
		||||
        // click on the search result
 | 
			
		||||
        await page.getByRole('searchbox', { name: 'OpenMCT Search' }).getByText('Alpha Sine Wave').first().click();
 | 
			
		||||
        // wait for plots to load
 | 
			
		||||
        await expect(page.locator('.js-series-data-loaded')).toBeVisible();
 | 
			
		||||
        // expect plot to be paused
 | 
			
		||||
        await expect(page.locator('[title="Resume displaying real-time data"]')).toBeVisible();
 | 
			
		||||
 | 
			
		||||
        await setFixedTimeMode(page);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Tags work with Plot View of telemetry items', async ({ page }) => {
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Sine Wave Generator"
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const canvas = page.locator('canvas').nth(1);
 | 
			
		||||
        await createTags({
 | 
			
		||||
            page,
 | 
			
		||||
            canvas,
 | 
			
		||||
            xEnd: 700,
 | 
			
		||||
            yEnd: 480
 | 
			
		||||
        });
 | 
			
		||||
        await basicTagsTests(page);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Tags work with Stacked Plots', async ({ page }) => {
 | 
			
		||||
        const stackedPlot = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Stacked Plot"
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const alphaSineWave = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Sine Wave Generator",
 | 
			
		||||
            name: "Alpha Sine Wave",
 | 
			
		||||
            parent: stackedPlot.uuid
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: "Sine Wave Generator",
 | 
			
		||||
            name: "Beta Sine Wave",
 | 
			
		||||
            parent: stackedPlot.uuid
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await page.goto(stackedPlot.url);
 | 
			
		||||
 | 
			
		||||
        const canvas = page.locator('canvas').nth(1);
 | 
			
		||||
 | 
			
		||||
        await createTags({
 | 
			
		||||
            page,
 | 
			
		||||
            canvas,
 | 
			
		||||
            xEnd: 700,
 | 
			
		||||
            yEnd: 215
 | 
			
		||||
        });
 | 
			
		||||
        await basicTagsTests(page);
 | 
			
		||||
        await testTelemetryItem(page, alphaSineWave);
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -191,7 +191,7 @@ test.describe('Recent Objects', () => {
 | 
			
		||||
        expect(await clockBreadcrumbs.count()).toBe(2);
 | 
			
		||||
        expect(await clockBreadcrumbs.nth(0).innerText()).not.toEqual(await clockBreadcrumbs.nth(1).innerText());
 | 
			
		||||
    });
 | 
			
		||||
    test("Enforces a limit of 20 recent objects", async ({ page }) => {
 | 
			
		||||
    test("Enforces a limit of 20 recent objects and clears the recent objects", async ({ page }) => {
 | 
			
		||||
        // Creating 21 objects takes a while, so increase the timeout
 | 
			
		||||
        test.slow();
 | 
			
		||||
 | 
			
		||||
@@ -242,6 +242,15 @@ test.describe('Recent Objects', () => {
 | 
			
		||||
 | 
			
		||||
        // Assert that the Clock treeitem is no longer highlighted
 | 
			
		||||
        await expect(lastClockTreeItem.locator('.c-tree__item')).not.toHaveClass(/is-targeted-item/);
 | 
			
		||||
 | 
			
		||||
        // Click the aria-label="Clear Recently Viewed" button
 | 
			
		||||
        await page.getByRole('button', { name: 'Clear Recently Viewed' }).click();
 | 
			
		||||
 | 
			
		||||
        // Click on the "OK" button in the confirmation dialog
 | 
			
		||||
        await page.getByRole('button', { name: 'OK' }).click();
 | 
			
		||||
 | 
			
		||||
        // Assert that the list is empty
 | 
			
		||||
        expect(await recentObjectsList.locator('.c-recentobjects-listitem').count()).toBe(0);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function assertInitialRecentObjectsListState() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const { test, expect } = require('../../pluginFixtures');
 | 
			
		||||
const { createDomainObjectWithDefaults } = require('../../appActions');
 | 
			
		||||
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../appActions');
 | 
			
		||||
const { v4: uuid } = require('uuid');
 | 
			
		||||
 | 
			
		||||
test.describe('Grand Search', () => {
 | 
			
		||||
@@ -50,7 +50,7 @@ test.describe('Grand Search', () => {
 | 
			
		||||
        await expect(page.locator('[aria-label="Search Result"] >> nth=2')).toContainText(`Clock C ${myItemsFolderName} Red Folder Blue Folder`);
 | 
			
		||||
        await expect(page.locator('[aria-label="Search Result"] >> nth=3')).toContainText(`Clock D ${myItemsFolderName} Red Folder Blue Folder`);
 | 
			
		||||
        // Click the Elements pool to dismiss the search menu
 | 
			
		||||
        await page.locator('.l-pane__label:has-text("Elements")').click();
 | 
			
		||||
        await selectInspectorTab(page, 'Elements');
 | 
			
		||||
        await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toBeHidden();
 | 
			
		||||
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] [aria-label="Search Input"]').click();
 | 
			
		||||
@@ -63,7 +63,7 @@ test.describe('Grand Search', () => {
 | 
			
		||||
        await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toContainText(`Clock A ${myItemsFolderName} Red Folder Blue Folder`);
 | 
			
		||||
 | 
			
		||||
        // Click [aria-label="OpenMCT Search"] a >> nth=0
 | 
			
		||||
        await page.locator('[aria-label="OpenMCT Search"] a').first().click();
 | 
			
		||||
        await page.locator('[aria-label="Search Result"] >> nth=0').click();
 | 
			
		||||
        await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toBeHidden();
 | 
			
		||||
 | 
			
		||||
        // Fill [aria-label="OpenMCT Search"] input[type="search"]
 | 
			
		||||
@@ -133,6 +133,7 @@ test.describe('Grand Search', () => {
 | 
			
		||||
        const searchResults = page.locator(searchResultSelector);
 | 
			
		||||
 | 
			
		||||
        // Verify that one result is found
 | 
			
		||||
        await expect(searchResults).toBeVisible();
 | 
			
		||||
        expect(await searchResults.count()).toBe(1);
 | 
			
		||||
        await expect(searchResults).toHaveText(folderName);
 | 
			
		||||
    });
 | 
			
		||||
@@ -194,7 +195,7 @@ test.describe('Grand Search', () => {
 | 
			
		||||
        // Wait for search to finish
 | 
			
		||||
        await waitForSearchCompletion(page);
 | 
			
		||||
 | 
			
		||||
        const searchResultDropDown = await page.locator(searchResultDropDownSelector);
 | 
			
		||||
        const searchResultDropDown = page.locator(searchResultDropDownSelector);
 | 
			
		||||
 | 
			
		||||
        // Verify that the search result/s correctly match the search query
 | 
			
		||||
        await expect(searchResultDropDown).toContainText(folderName1);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -26,10 +26,80 @@ const {
 | 
			
		||||
    openObjectTreeContextMenu
 | 
			
		||||
} = require('../../appActions.js');
 | 
			
		||||
 | 
			
		||||
test.describe('Tree operations', () => {
 | 
			
		||||
test.describe('Main Tree', () => {
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Creating a child object within a folder and immediately opening it shows the created object in the tree @couchdb', async ({ page }) => {
 | 
			
		||||
        test.info().annotations.push({
 | 
			
		||||
            type: 'issue',
 | 
			
		||||
            description: 'https://github.com/nasa/openmct/issues/5975'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const folder = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Folder'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await page.getByTitle('Show selected item in tree').click();
 | 
			
		||||
 | 
			
		||||
        const clock = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Clock',
 | 
			
		||||
            parent: folder.uuid
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await expandTreePaneItemByName(page, folder.name);
 | 
			
		||||
        await assertTreeItemIsVisible(page, clock.name);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Creating a child object on one tab and expanding its parent on the other shows the correct composition @2p', async ({ page, openmctConfig }) => {
 | 
			
		||||
        test.info().annotations.push({
 | 
			
		||||
            type: 'issue',
 | 
			
		||||
            description: 'https://github.com/nasa/openmct/issues/6391'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const { myItemsFolderName } = openmctConfig;
 | 
			
		||||
        const page2 = await page.context().newPage();
 | 
			
		||||
 | 
			
		||||
        // Both pages: Go to baseURL
 | 
			
		||||
        await Promise.all([
 | 
			
		||||
            page.goto('./', { waitUntil: 'networkidle' }),
 | 
			
		||||
            page2.goto('./', { waitUntil: 'networkidle' })
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        const page1Folder = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Folder'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await expandTreePaneItemByName(page2, myItemsFolderName);
 | 
			
		||||
        await assertTreeItemIsVisible(page2, page1Folder.name);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Creating a child object on one tab and expanding its parent on the other shows the correct composition @couchdb @2p', async ({ page, openmctConfig }) => {
 | 
			
		||||
        test.info().annotations.push({
 | 
			
		||||
            type: 'issue',
 | 
			
		||||
            description: 'https://github.com/nasa/openmct/issues/6391'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const { myItemsFolderName } = openmctConfig;
 | 
			
		||||
        const page2 = await page.context().newPage();
 | 
			
		||||
 | 
			
		||||
        // Both pages: Go to baseURL
 | 
			
		||||
        await Promise.all([
 | 
			
		||||
            page.goto('./', { waitUntil: 'networkidle' }),
 | 
			
		||||
            page2.goto('./', { waitUntil: 'networkidle' })
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        const page1Folder = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Folder'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await expandTreePaneItemByName(page2, myItemsFolderName);
 | 
			
		||||
        await assertTreeItemIsVisible(page2, page1Folder.name);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('Renaming an object reorders the tree @unstable', async ({ page, openmctConfig }) => {
 | 
			
		||||
        const { myItemsFolderName } = openmctConfig;
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
 | 
			
		||||
        await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Folder',
 | 
			
		||||
@@ -111,17 +181,30 @@ async function getAndAssertTreeItems(page, expected) {
 | 
			
		||||
    expect(allTexts).toEqual(expected);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function assertTreeItemIsVisible(page, name) {
 | 
			
		||||
    const mainTree = page.getByRole('tree', {
 | 
			
		||||
        name: 'Main Tree'
 | 
			
		||||
    });
 | 
			
		||||
    const treeItem = mainTree.getByRole('treeitem', {
 | 
			
		||||
        name
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    await expect(treeItem).toBeVisible();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {import('@playwright/test').Page} page
 | 
			
		||||
 * @param {string} name
 | 
			
		||||
 */
 | 
			
		||||
async function expandTreePaneItemByName(page, name) {
 | 
			
		||||
    const treePane = page.getByRole('tree', {
 | 
			
		||||
    const mainTree = page.getByRole('tree', {
 | 
			
		||||
        name: 'Main Tree'
 | 
			
		||||
    });
 | 
			
		||||
    const treeItem = treePane.locator(`role=treeitem[expanded=false][name=/${name}/]`);
 | 
			
		||||
    const expandTriangle = treeItem.locator('.c-disclosure-triangle');
 | 
			
		||||
    await expandTriangle.click();
 | 
			
		||||
    const treeItem = mainTree.getByRole('treeitem', {
 | 
			
		||||
        name,
 | 
			
		||||
        expanded: false
 | 
			
		||||
    });
 | 
			
		||||
    await treeItem.locator('.c-disclosure-triangle').click();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -138,6 +138,7 @@ test.describe('Performance tests', () => {
 | 
			
		||||
        await page.evaluate(() => window.performance.mark("notebook-search-processed"));
 | 
			
		||||
 | 
			
		||||
        //Clear Search
 | 
			
		||||
        await page.locator('.c-search.c-notebook__search .c-search__input').hover();
 | 
			
		||||
        await page.locator('.c-search.c-notebook__search .c-search__clear-input').click();
 | 
			
		||||
        await page.evaluate(() => window.performance.mark("notebook-search-processed"));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* eslint-disable no-undef */
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,68 +0,0 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT includes source code licensed under additional open source
 | 
			
		||||
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 | 
			
		||||
 * this source code distribution or the Licensing information page available
 | 
			
		||||
 * at runtime from the About dialog for additional information.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This test is dedicated to test the blur behavior of the add tag button.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const { test } = require("../../pluginFixtures");
 | 
			
		||||
const percySnapshot = require('@percy/playwright');
 | 
			
		||||
const { createDomainObjectWithDefaults } = require('../../appActions');
 | 
			
		||||
 | 
			
		||||
test.describe("Visual - Check blur of Add Tag button", () => {
 | 
			
		||||
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        // Open a browser, navigate to the main page, and wait until all network events to resolve
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test("Blur 'Add tag'", async ({ page, theme }) => {
 | 
			
		||||
        createDomainObjectWithDefaults(page, { type: 'Notebook' });
 | 
			
		||||
 | 
			
		||||
        await page.locator('text=To start a new entry, click here or drag and drop any object').click();
 | 
			
		||||
        const entryLocator = `[aria-label="Notebook Entry Input"] >> nth = 0`;
 | 
			
		||||
        await page.locator(entryLocator).click();
 | 
			
		||||
        await page.locator(entryLocator).fill(`Entry 0`);
 | 
			
		||||
        await page.locator(entryLocator).press('Enter');
 | 
			
		||||
 | 
			
		||||
        // Click on Annotations tab
 | 
			
		||||
        await page.locator('.c-inspector__tab', { hasText: "Annotations" }).click();
 | 
			
		||||
 | 
			
		||||
        // Take snapshot of the notebook with the Annotations tab opened
 | 
			
		||||
        await percySnapshot(page, `Notebook Annotation (theme: '${theme}')`);
 | 
			
		||||
 | 
			
		||||
        // Click on the "Add Tag" button
 | 
			
		||||
        await page.locator('button:has-text("Add Tag")').click();
 | 
			
		||||
 | 
			
		||||
        // Take snapshot of the notebook with the AutoComplete field visible
 | 
			
		||||
        await percySnapshot(page, `Notebook Add Tag (theme: '${theme}')`);
 | 
			
		||||
 | 
			
		||||
        // Click inside the AutoComplete field
 | 
			
		||||
        await page.locator('[placeholder="Type to select tag"]').click();
 | 
			
		||||
 | 
			
		||||
        // Click on the "Tags" header (simulating a click outside the autocomplete field)
 | 
			
		||||
        await page.locator('div.c-inspect-properties__header:has-text("Tags")').click();
 | 
			
		||||
 | 
			
		||||
        // Take snapshot of the notebook with the AutoComplete field hidden and with the "Add Tag" button visible
 | 
			
		||||
        await percySnapshot(page, `Notebook Annotation de-select blur (theme: '${theme}')`);
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										52
									
								
								e2e/tests/visual/plan.visual.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								e2e/tests/visual/plan.visual.spec.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 * Open MCT includes source code licensed under additional open source
 | 
			
		||||
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 | 
			
		||||
 * this source code distribution or the Licensing information page available
 | 
			
		||||
 * at runtime from the About dialog for additional information.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
const { test } = require('../../pluginFixtures');
 | 
			
		||||
const { setBoundsToSpanAllActivities } = require('../../helper/planningUtils');
 | 
			
		||||
const { createDomainObjectWithDefaults, createPlanFromJSON } = require('../../appActions');
 | 
			
		||||
const percySnapshot = require('@percy/playwright');
 | 
			
		||||
const examplePlanLarge = require('../../test-data/examplePlans/ExamplePlan_Large.json');
 | 
			
		||||
 | 
			
		||||
test.describe('Visual - Planning', () => {
 | 
			
		||||
    test.beforeEach(async ({ page }) => {
 | 
			
		||||
        await page.goto('./', { waitUntil: 'networkidle' });
 | 
			
		||||
    });
 | 
			
		||||
    test('Plan View', async ({ page, theme }) => {
 | 
			
		||||
        const plan = await createPlanFromJSON(page, {
 | 
			
		||||
            json: examplePlanLarge
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await setBoundsToSpanAllActivities(page, examplePlanLarge, plan.url);
 | 
			
		||||
        await percySnapshot(page, `Plan View (theme: ${theme})`);
 | 
			
		||||
    });
 | 
			
		||||
    test('Gantt Chart View', async ({ page, theme }) => {
 | 
			
		||||
        const ganttChart = await createDomainObjectWithDefaults(page, {
 | 
			
		||||
            type: 'Gantt Chart'
 | 
			
		||||
        });
 | 
			
		||||
        await createPlanFromJSON(page, {
 | 
			
		||||
            json: examplePlanLarge,
 | 
			
		||||
            parent: ganttChart.uuid
 | 
			
		||||
        });
 | 
			
		||||
        await setBoundsToSpanAllActivities(page, examplePlanLarge, ganttChart.url);
 | 
			
		||||
        await percySnapshot(page, `Gantt Chart View (theme: ${theme})`);
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2022, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2023, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user