Compare commits
3 Commits
docs-relea
...
hex-values
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6633c0557a | ||
|
|
e449fd0eda | ||
|
|
7d25c967a5 |
@@ -15,5 +15,5 @@ export default merge(common, {
|
||||
__OPENMCT_ROOT_RELATIVE__: '""'
|
||||
})
|
||||
],
|
||||
devtool: 'source-map'
|
||||
devtool: 'eval-source-map'
|
||||
});
|
||||
|
||||
@@ -3,124 +3,28 @@
|
||||
|
||||
This document outlines the process and key considerations for releasing a new version of the NASA Open MCT project as an NPM (Node Package Manager) package.
|
||||
|
||||
## FAQ
|
||||
|
||||
1. When do we publish a new version of Open MCT?
|
||||
- At the end of a working sprint (typically) after all blocking issues have been resolved.
|
||||
2. Where do we publish?
|
||||
- [NPM](https://www.npmjs.com/package/openmct)
|
||||
- [Github Releases](https://github.com/nasa/openmct/releases)
|
||||
2. What do we publish?
|
||||
- What constitutes a "stable" release?
|
||||
- TODO
|
||||
- What constitutes a "latest" release?
|
||||
- The most recently published release.
|
||||
- What constitutes a "nightly" release?
|
||||
- TODO
|
||||
4. What necessitates a patch release?
|
||||
-
|
||||
|
||||
## 1. Pre-requisites
|
||||
|
||||
Before releasing a new version of Open MCT, ensure that all dependencies are updated, and
|
||||
comprehensive testing is performed.
|
||||
Before releasing a new version of the NASA Open MCT NPM package, ensure all dependencies are updated, and comprehensive tests are performed. This ensures compatibility and performance of the Open MCT within the Node.js ecosystem.
|
||||
|
||||
## 2. Versioning
|
||||
|
||||
Open MCT follows [Semantic Versioning 2.0.0 (SemVer)](https://semver.org) that consists of three
|
||||
major components: `MAJOR.MINOR.PATCH` (i.e. `1.2.3`).
|
||||
|
||||
Major releases are necessitated by fundamental framework changes that are expected to be incompatible
|
||||
with previous releases.
|
||||
|
||||
Minor releases are necessitated by non-backwards-compatible application, API changes, or new
|
||||
features or enhancements.
|
||||
|
||||
Patch releases are created for backporting fixes to blocking bugs that were discovered _after_
|
||||
the release of a major or minor version. They are not to introduce new features, enhancements, or
|
||||
dependency changes.
|
||||
Versioning is a critical step for package release. The Open MCT team follows [Semantic Versioning (SemVer)](https://semver.org) that consists of three major components: MAJOR.MINOR.PATCH. These ensure a structured process for updating, bug fixes, backward compatibility, and software progress.
|
||||
|
||||
## 3. Changelog Maintenance
|
||||
|
||||
Changelogs can be found in the GitHub releases section of the repository and are auto-generated
|
||||
using [GitHub's feature](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes).
|
||||
A comprehensive changelog file, `CHANGELOG.md`, documents any changes, adding a high level of transparencies for anyone desiring to look into the status of new and past progress. It includes the summation of any major new enhancements, changes, bug fixes, and the credits to the users responsible for each unique progress.
|
||||
|
||||
## 4. Pull Request Labeling
|
||||
## 4. Notable Changes Labels on GitHub PRs
|
||||
|
||||
Generation of release notes is automated by the use of labels on pull requests. The following
|
||||
labels are used to categorize pull requests:
|
||||
For the Open MCT package, we leverage GitHub's Pull Request (PR) mechanisms extensively, with three important PR labels dedicated to signifying 'notable_changes':
|
||||
|
||||
### `type:bug`
|
||||
- **Breaking Change** Highlights the integration of changes that are suspected to break, or without a doubt will break, backward compatibility. These should signal to users the upgrade might be seamless only if dependency and integration factors are properly managed, if not, one should expect to manage atypical technical snags.
|
||||
- **API change** Signifies when a contribution makes any complete or under layer changes to the communication or its supporting access processes. This label flags required see-through insight on how the web-based control panel sees and manipulates any value and or network logs.
|
||||
- **Default Behavior Change:** In the incident an update either adjusts a form to or integrates a not previously kept setting or plugin. i.e. autoscale is enabled by default when working with plots.
|
||||
|
||||
Pull requests are to be labeled with `type:bug` if they contain changes that intend to fix a bug.
|
||||
## 6. Community & Contributions
|
||||
|
||||
### `type:enhancement`
|
||||
A flat community and the rounded center are kept in continuous celebration, with the given station open for two open-specifying dialogues, research, and all-for development probing. State the ownership for a handed looped, a welcome for even structure-core and architectural draft and impend.
|
||||
|
||||
Pull requests are to be labeled with `type:enhancement` if they contain changes that intend to
|
||||
enhance existing functionality of Open MCT.
|
||||
|
||||
### `type:feature`
|
||||
|
||||
Pull requests are to be labeled with `type:feature` if they contain changes that intend to introduce
|
||||
new functionality to Open MCT.
|
||||
|
||||
### `type:maintenance`
|
||||
|
||||
Pull requests are to be labeled with `type:maintenance` if they contain changes that introduce
|
||||
new tests, documentation, or other maintenance-related changes.
|
||||
|
||||
### `performance`
|
||||
|
||||
Pull requests are to be labeled with `performance` if they contain changes that are intended to
|
||||
improve the performance of Open MCT.
|
||||
|
||||
### `notable_change`
|
||||
|
||||
Pull requests are to be labeled with `notable_change` if they contain changes that fit any of the
|
||||
following criteria:
|
||||
|
||||
- **Breaking Change**
|
||||
- Highlights the integration of changes that are suspected to break, or without a doubt will
|
||||
break, backwards compatibility. These should signal to users the upgrade might be seamless only
|
||||
if dependency and integration factors are properly managed, if not, one should expect to manage
|
||||
atypical technical snags.
|
||||
- **API Change**
|
||||
- Signifies any change to the Open MCT API such as the addition of new methods, or the
|
||||
modification or deprecation of existing methods. API changes may or may not constitute a
|
||||
breaking change.
|
||||
- **Default Behavior Change**
|
||||
- Any change to the default behavior of Open MCT, such as the default configuration of a plugin,
|
||||
or the default behavior of a user interface component or feature (i.e.: autoscale being enabled
|
||||
by default on plots).
|
||||
|
||||
## 5. Community & Contributions
|
||||
|
||||
Open MCT is an open-source project and contributions are welcome. As such, it is important to
|
||||
acknowledge the contributions of the community and contributors. Pull requests by contributors
|
||||
will be labeled with `source:community` to signify that the contribution was made by a member of
|
||||
the community.
|
||||
|
||||
## 6. Release Process
|
||||
|
||||
Currently, the release process is manual and requires the following steps:
|
||||
|
||||
1. Clone a fresh copy of the repository.
|
||||
- `git clone git@github.com:nasa/openmct.git`
|
||||
2. Check out the appropriate release branch.
|
||||
- `git checkout release/1.2.3`
|
||||
3. Ensure that the `package.json` file is updated with the correct version number and does not
|
||||
contain the `-next` suffix (which implies a pre-release).
|
||||
4. Create a tag for the release if it does not already exist.
|
||||
- `git tag v1.2.3`
|
||||
5. Push the tag to the repository.
|
||||
- `git push origin v1.2.3`
|
||||
6. Run `npm install` to install dependencies.
|
||||
7. Publish the release to NPM (You will need to be logged in to an NPM account with the appropriate permissions).
|
||||
- `npm publish`
|
||||
8. Create a release on GitHub.
|
||||
- Navigate to the Releases page on the Open MCT repository.
|
||||
- Click [draft a new release.](https://github.com/nasa/openmct/releases/new)
|
||||
- Choose the tag that was just created for the release.
|
||||
- For "Previous tag", choose the tag that was most recently released.
|
||||
- Click "Generate release notes" to auto-generate release notes.
|
||||
- Click "Publish release" to publish the release.
|
||||
Thank you for your collaboration and commitment to moving the project onto a text big club.
|
||||
|
||||
@@ -298,7 +298,7 @@ test.describe('Basic Condition Set Use', () => {
|
||||
}) => {
|
||||
const exampleTelemetry = await createExampleTelemetryObject(page);
|
||||
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
await page.goto(conditionSet.url);
|
||||
// Change the object to edit mode
|
||||
await page.getByLabel('Edit Object').click();
|
||||
@@ -378,4 +378,83 @@ test.describe('Basic Condition Set Use', () => {
|
||||
await page.goto(conditionSet.url);
|
||||
await expect(outputValue).toHaveText('---');
|
||||
});
|
||||
|
||||
test('ConditionSet has correct outputs when test data is enabled', async ({ page }) => {
|
||||
const exampleTelemetry = await createExampleTelemetryObject(page);
|
||||
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
await page.goto(conditionSet.url);
|
||||
// Change the object to edit mode
|
||||
await page.getByLabel('Edit Object').click();
|
||||
|
||||
// Create two conditions
|
||||
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');
|
||||
|
||||
// Add Telemetry to ConditionSet
|
||||
const sineWaveGeneratorTreeItem = page
|
||||
.getByRole('tree', {
|
||||
name: 'Main Tree'
|
||||
})
|
||||
.getByRole('treeitem', {
|
||||
name: exampleTelemetry.name
|
||||
});
|
||||
const conditionCollection = page.locator('#conditionCollection');
|
||||
await sineWaveGeneratorTreeItem.dragTo(conditionCollection);
|
||||
|
||||
// Modify First Criterion
|
||||
const firstCriterionTelemetry = page.locator(
|
||||
'[aria-label="Criterion Telemetry Selection"] >> nth=0'
|
||||
);
|
||||
firstCriterionTelemetry.selectOption({ label: exampleTelemetry.name });
|
||||
const firstCriterionMetadata = page.locator(
|
||||
'[aria-label="Criterion Metadata Selection"] >> nth=0'
|
||||
);
|
||||
firstCriterionMetadata.selectOption({ label: 'Sine' });
|
||||
const firstCriterionComparison = page.locator(
|
||||
'[aria-label="Criterion Comparison Selection"] >> nth=0'
|
||||
);
|
||||
firstCriterionComparison.selectOption({ label: 'is greater than or equal to' });
|
||||
const firstCriterionInput = page.locator('[aria-label="Criterion Input"] >> nth=0');
|
||||
await firstCriterionInput.fill('0');
|
||||
|
||||
// Modify Second Criterion
|
||||
const secondCriterionTelemetry = page.locator(
|
||||
'[aria-label="Criterion Telemetry Selection"] >> nth=1'
|
||||
);
|
||||
await secondCriterionTelemetry.selectOption({ label: exampleTelemetry.name });
|
||||
|
||||
const secondCriterionMetadata = page.locator(
|
||||
'[aria-label="Criterion Metadata Selection"] >> nth=1'
|
||||
);
|
||||
await secondCriterionMetadata.selectOption({ label: 'Sine' });
|
||||
|
||||
const secondCriterionComparison = page.locator(
|
||||
'[aria-label="Criterion Comparison Selection"] >> nth=1'
|
||||
);
|
||||
await secondCriterionComparison.selectOption({ label: 'is less than' });
|
||||
|
||||
const secondCriterionInput = page.locator('[aria-label="Criterion Input"] >> nth=1');
|
||||
await secondCriterionInput.fill('0');
|
||||
|
||||
// Enable test data
|
||||
await page.getByLabel('Apply Test Data').nth(1).click();
|
||||
const testDataTelemetry = page.locator('[aria-label="Test Data Telemetry Selection"] >> nth=0');
|
||||
await testDataTelemetry.selectOption({ label: exampleTelemetry.name });
|
||||
|
||||
const testDataMetadata = page.locator('[aria-label="Test Data Metadata Selection"] >> nth=0');
|
||||
await testDataMetadata.selectOption({ label: 'Sine' });
|
||||
|
||||
const testInput = page.locator('[aria-label="Test Data Input"] >> nth=0');
|
||||
await testInput.fill('0');
|
||||
|
||||
// Validate that the condition set is evaluating and outputting
|
||||
// the correct value when the underlying telemetry subscription is active.
|
||||
let outputValue = page.locator('[aria-label="Current Output Value"]');
|
||||
await expect(outputValue).toHaveText('false');
|
||||
|
||||
await page.goto(exampleTelemetry.url);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -308,7 +308,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await page
|
||||
.getByRole('treeitem', { name: overlayPlot.name })
|
||||
@@ -332,7 +332,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await nbUtils.enterTextEntry(page, 'Entry to drop into');
|
||||
await page
|
||||
@@ -377,7 +377,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await nbUtils.enterTextEntry(page, `This should be a link: ${TEST_LINK} is it?`);
|
||||
|
||||
@@ -404,7 +404,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await nbUtils.enterTextEntry(page, `This should NOT be a link: ${TEST_LINK} is it?`);
|
||||
|
||||
@@ -421,7 +421,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await nbUtils.enterTextEntry(page, `This should NOT be a link: ${TEST_LINK} is it?`);
|
||||
|
||||
@@ -438,7 +438,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await nbUtils.enterTextEntry(page, `This should be a link: ${INVALID_TEST_LINK} is it?`);
|
||||
|
||||
@@ -455,7 +455,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await nbUtils.enterTextEntry(page, `This should be a link: ${TEST_LINK} is it?`);
|
||||
|
||||
@@ -483,7 +483,7 @@ test.describe('Notebook entry tests', () => {
|
||||
await page.goto(notebookObject.url);
|
||||
|
||||
// Reveal the notebook in the tree
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
await nbUtils.enterTextEntry(
|
||||
page,
|
||||
|
||||
@@ -191,7 +191,7 @@ test.describe('Recent Objects', () => {
|
||||
|
||||
// Navigate to the clock and reveal it in the tree
|
||||
await page.goto(clock.url);
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
// Right click the clock and create an alias using the "link" context menu action
|
||||
const clockTreeItem = page
|
||||
|
||||
@@ -40,7 +40,7 @@ test.describe('Main Tree', () => {
|
||||
type: 'Folder'
|
||||
});
|
||||
|
||||
await page.getByTitle('Show selected item in tree').click();
|
||||
await page.getByLabel('Show selected item in tree').click();
|
||||
|
||||
const clock = await createDomainObjectWithDefaults(page, {
|
||||
type: 'Clock',
|
||||
|
||||
@@ -93,4 +93,14 @@ test.describe('Visual - Display Layout', () => {
|
||||
await page.getByLabel('Parent Layout Layout', { exact: true }).click();
|
||||
await percySnapshot(page, `Parent outer layout selected (theme: '${theme}')`);
|
||||
});
|
||||
|
||||
test('Toolbar does not overflow into inspector', async ({ page, theme }) => {
|
||||
test.info().annotations.push({
|
||||
type: 'issue',
|
||||
description: 'https://github.com/nasa/openmct/issues/7036'
|
||||
});
|
||||
await page.getByLabel('Expand Inspect Pane').click();
|
||||
await page.getByLabel('Resize Inspect Pane').dragTo(page.getByLabel('X:'));
|
||||
await percySnapshot(page, `Toolbar does not overflow into inspector (theme: '${theme}')`);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
<div class="c-cs__header-label c-section__label">Test Data</div>
|
||||
</div>
|
||||
<div v-if="expanded" class="c-cs__content">
|
||||
<div class="c-cs__test-data__controls c-cdef__controls" :disabled="!telemetry.length">
|
||||
<div :class="['c-cs__test-data__controls c-cdef__controls', { disabled: !telemetry.length }]">
|
||||
<label class="c-toggle-switch">
|
||||
<input type="checkbox" :checked="isApplied" @change="applyTestData" />
|
||||
<span class="c-toggle-switch__slider"></span>
|
||||
<span class="c-toggle-switch__slider" aria-label="Apply Test Data"></span>
|
||||
<span class="c-toggle-switch__label">Apply Test Data</span>
|
||||
</label>
|
||||
</div>
|
||||
@@ -47,7 +47,11 @@
|
||||
<span class="c-cs-test__label">Set</span>
|
||||
<span class="c-cs-test__controls">
|
||||
<span class="c-cdef__control">
|
||||
<select v-model="testInput.telemetry" @change="updateMetadata(testInput)">
|
||||
<select
|
||||
v-model="testInput.telemetry"
|
||||
aria-label="Test Data Telemetry Selection"
|
||||
@change="updateMetadata(testInput)"
|
||||
>
|
||||
<option value="">- Select Telemetry -</option>
|
||||
<option
|
||||
v-for="(telemetryOption, index) in telemetry"
|
||||
@@ -59,7 +63,11 @@
|
||||
</select>
|
||||
</span>
|
||||
<span v-if="testInput.telemetry" class="c-cdef__control">
|
||||
<select v-model="testInput.metadata" @change="updateTestData">
|
||||
<select
|
||||
v-model="testInput.metadata"
|
||||
aria-label="Test Data Metadata Selection"
|
||||
@change="updateTestData"
|
||||
>
|
||||
<option value="">- Select Field -</option>
|
||||
<option
|
||||
v-for="(option, index) in telemetryMetadataOptions[getId(testInput.telemetry)]"
|
||||
@@ -76,6 +84,7 @@
|
||||
placeholder="Enter test input"
|
||||
type="text"
|
||||
class="c-cdef__control__input"
|
||||
aria-label="Test Data Input"
|
||||
@change="updateTestData"
|
||||
/>
|
||||
</span>
|
||||
|
||||
@@ -21,7 +21,13 @@
|
||||
-->
|
||||
<template>
|
||||
<div class="l-pane" :class="paneClasses">
|
||||
<div v-if="handle" class="l-pane__handle" @mousedown.prevent="startResizing"></div>
|
||||
<div
|
||||
v-if="handle"
|
||||
class="l-pane__handle"
|
||||
:aria-label="handleLabel"
|
||||
:aria-grabbed="resizing"
|
||||
@mousedown.prevent="startResizing"
|
||||
></div>
|
||||
<div class="l-pane__header">
|
||||
<span v-if="label" class="l-pane__label">{{ label }}</span>
|
||||
<slot name="controls"></slot>
|
||||
@@ -88,6 +94,9 @@ export default {
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
handleLabel() {
|
||||
return `Resize ${this.label} Pane`;
|
||||
},
|
||||
isCollapsable() {
|
||||
return this.hideParam?.length > 0;
|
||||
},
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
transition: opacity 150ms ease;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
overflow: hidden;
|
||||
overflow: hidden; // Prevents toolbar from extending into Inspector
|
||||
|
||||
> * {
|
||||
min-width: 0 !important;
|
||||
@@ -93,6 +93,7 @@
|
||||
&__contents {
|
||||
flex: 1 1 100%;
|
||||
opacity: 1;
|
||||
overflow: hidden;
|
||||
pointer-events: inherit;
|
||||
transition: opacity 250ms ease 250ms;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user