mirror of
https://github.com/nasa/openmct.git
synced 2024-12-18 20:57:53 +00:00
Fault management (#5212)
* Implements Fault Management Co-authored-by: Rukmini Bose <rukmini.bose15@gmail.com> Co-authored-by: Andrew Henry <akhenry@gmail.com> Co-authored-by: Jamie V <jamie.j.vigliotta@nasa.gov>
This commit is contained in:
parent
aa0fc70e54
commit
05e3303828
83
example/faultManagment/exampleFaultSource.js
Normal file
83
example/faultManagment/exampleFaultSource.js
Normal file
@ -0,0 +1,83 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
export default function () {
|
||||
return function install(openmct) {
|
||||
openmct.install(openmct.plugins.FaultManagement());
|
||||
|
||||
openmct.faults.addProvider({
|
||||
request(domainObject, options) {
|
||||
const faults = JSON.parse(localStorage.getItem('faults'));
|
||||
|
||||
return Promise.resolve(faults.alarms);
|
||||
},
|
||||
subscribe(domainObject, callback) {
|
||||
const faultsData = JSON.parse(localStorage.getItem('faults')).alarms;
|
||||
|
||||
function getRandomIndex(start, end) {
|
||||
return Math.floor(start + (Math.random() * (end - start + 1)));
|
||||
}
|
||||
|
||||
let id = setInterval(() => {
|
||||
const index = getRandomIndex(0, faultsData.length - 1);
|
||||
const randomFaultData = faultsData[index];
|
||||
const randomFault = randomFaultData.fault;
|
||||
randomFault.currentValueInfo.value = Math.random();
|
||||
callback({
|
||||
fault: randomFault,
|
||||
type: 'alarms'
|
||||
});
|
||||
}, 300);
|
||||
|
||||
return () => {
|
||||
clearInterval(id);
|
||||
};
|
||||
},
|
||||
supportsRequest(domainObject) {
|
||||
const faults = localStorage.getItem('faults');
|
||||
|
||||
return faults && domainObject.type === 'faultManagement';
|
||||
},
|
||||
supportsSubscribe(domainObject) {
|
||||
const faults = localStorage.getItem('faults');
|
||||
|
||||
return faults && domainObject.type === 'faultManagement';
|
||||
},
|
||||
acknowledgeFault(fault, { comment = '' }) {
|
||||
console.log('acknowledgeFault', fault);
|
||||
console.log('comment', comment);
|
||||
|
||||
return Promise.resolve({
|
||||
success: true
|
||||
});
|
||||
},
|
||||
shelveFault(fault, shelveData) {
|
||||
console.log('shelveFault', fault);
|
||||
console.log('shelveData', shelveData);
|
||||
|
||||
return Promise.resolve({
|
||||
success: true
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
47
example/faultManagment/pluginSpec.js
Normal file
47
example/faultManagment/pluginSpec.js
Normal file
@ -0,0 +1,47 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 {
|
||||
createOpenMct,
|
||||
resetApplicationState
|
||||
} from '../../src/utils/testing';
|
||||
|
||||
describe("The Example Fault Source Plugin", () => {
|
||||
let openmct;
|
||||
|
||||
beforeEach(() => {
|
||||
openmct = createOpenMct();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
return resetApplicationState(openmct);
|
||||
});
|
||||
|
||||
it('is not installed by default', () => {
|
||||
expect(openmct.faults.provider).toBeUndefined();
|
||||
});
|
||||
|
||||
it('can be installed', () => {
|
||||
openmct.install(openmct.plugins.example.ExampleFaultSource());
|
||||
expect(openmct.faults.provider).not.toBeUndefined();
|
||||
});
|
||||
});
|
@ -75,7 +75,6 @@
|
||||
const TWO_HOURS = ONE_HOUR * 2;
|
||||
const ONE_DAY = ONE_HOUR * 24;
|
||||
|
||||
|
||||
openmct.install(openmct.plugins.LocalStorage());
|
||||
|
||||
openmct.install(openmct.plugins.example.Generator());
|
||||
@ -192,7 +191,7 @@
|
||||
openmct.install(openmct.plugins.ObjectMigration());
|
||||
openmct.install(openmct.plugins.ClearData(
|
||||
['table', 'telemetry.plot.overlay', 'telemetry.plot.stacked', 'example.imagery'],
|
||||
{indicator: true}
|
||||
{ indicator: true }
|
||||
));
|
||||
openmct.install(openmct.plugins.Clock({ enableClockIndicator: true }));
|
||||
openmct.install(openmct.plugins.Timer());
|
||||
|
@ -238,6 +238,7 @@ define([
|
||||
this.priority = api.PriorityAPI;
|
||||
|
||||
this.router = new ApplicationRouter(this);
|
||||
this.faults = new api.FaultManagementAPI.default(this);
|
||||
this.forms = new api.FormsAPI.default(this);
|
||||
|
||||
this.branding = BrandingAPI.default;
|
||||
|
@ -24,6 +24,7 @@ define([
|
||||
'./actions/ActionsAPI',
|
||||
'./composition/CompositionAPI',
|
||||
'./Editor',
|
||||
'./faultmanagement/FaultManagementAPI',
|
||||
'./forms/FormsAPI',
|
||||
'./indicators/IndicatorAPI',
|
||||
'./menu/MenuAPI',
|
||||
@ -40,6 +41,7 @@ define([
|
||||
ActionsAPI,
|
||||
CompositionAPI,
|
||||
EditorAPI,
|
||||
FaultManagementAPI,
|
||||
FormsAPI,
|
||||
IndicatorAPI,
|
||||
MenuAPI,
|
||||
@ -57,6 +59,7 @@ define([
|
||||
ActionsAPI: ActionsAPI.default,
|
||||
CompositionAPI: CompositionAPI,
|
||||
EditorAPI: EditorAPI,
|
||||
FaultManagementAPI: FaultManagementAPI,
|
||||
FormsAPI: FormsAPI,
|
||||
IndicatorAPI: IndicatorAPI.default,
|
||||
MenuAPI: MenuAPI.default,
|
||||
|
106
src/api/faultmanagement/FaultManagementAPI.js
Normal file
106
src/api/faultmanagement/FaultManagementAPI.js
Normal file
@ -0,0 +1,106 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
export default class FaultManagementAPI {
|
||||
constructor(openmct) {
|
||||
this.openmct = openmct;
|
||||
}
|
||||
|
||||
addProvider(provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
supportsActions() {
|
||||
return this.provider?.acknowledgeFault !== undefined && this.provider?.shelveFault !== undefined;
|
||||
}
|
||||
|
||||
request(domainObject) {
|
||||
if (!this.provider?.supportsRequest(domainObject)) {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
return this.provider.request(domainObject);
|
||||
}
|
||||
|
||||
subscribe(domainObject, callback) {
|
||||
if (!this.provider?.supportsSubscribe(domainObject)) {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
return this.provider.subscribe(domainObject, callback);
|
||||
}
|
||||
|
||||
acknowledgeFault(fault, ackData) {
|
||||
return this.provider.acknowledgeFault(fault, ackData);
|
||||
}
|
||||
|
||||
shelveFault(fault, shelveData) {
|
||||
return this.provider.shelveFault(fault, shelveData);
|
||||
}
|
||||
}
|
||||
|
||||
/** @typedef {object} Fault
|
||||
* @property {string} type
|
||||
* @property {object} fault
|
||||
* @property {boolean} fault.acknowledged
|
||||
* @property {object} fault.currentValueInfo
|
||||
* @property {number} fault.currentValueInfo.value
|
||||
* @property {string} fault.currentValueInfo.rangeCondition
|
||||
* @property {string} fault.currentValueInfo.monitoringResult
|
||||
* @property {string} fault.id
|
||||
* @property {string} fault.name
|
||||
* @property {string} fault.namespace
|
||||
* @property {number} fault.seqNum
|
||||
* @property {string} fault.severity
|
||||
* @property {boolean} fault.shelved
|
||||
* @property {string} fault.shortDescription
|
||||
* @property {string} fault.triggerTime
|
||||
* @property {object} fault.triggerValueInfo
|
||||
* @property {number} fault.triggerValueInfo.value
|
||||
* @property {string} fault.triggerValueInfo.rangeCondition
|
||||
* @property {string} fault.triggerValueInfo.monitoringResult
|
||||
* @example
|
||||
* {
|
||||
* "type": "",
|
||||
* "fault": {
|
||||
* "acknowledged": true,
|
||||
* "currentValueInfo": {
|
||||
* "value": 0,
|
||||
* "rangeCondition": "",
|
||||
* "monitoringResult": ""
|
||||
* },
|
||||
* "id": "",
|
||||
* "name": "",
|
||||
* "namespace": "",
|
||||
* "seqNum": 0,
|
||||
* "severity": "",
|
||||
* "shelved": true,
|
||||
* "shortDescription": "",
|
||||
* "triggerTime": "",
|
||||
* "triggerValueInfo": {
|
||||
* "value": 0,
|
||||
* "rangeCondition": "",
|
||||
* "monitoringResult": ""
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*/
|
144
src/api/faultmanagement/FaultManagementAPISpec.js
Normal file
144
src/api/faultmanagement/FaultManagementAPISpec.js
Normal file
@ -0,0 +1,144 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 {
|
||||
createOpenMct,
|
||||
resetApplicationState
|
||||
} from '../../utils/testing';
|
||||
|
||||
const faultName = 'super duper fault';
|
||||
const aFault = {
|
||||
type: '',
|
||||
fault: {
|
||||
acknowledged: true,
|
||||
currentValueInfo: {
|
||||
value: 0,
|
||||
rangeCondition: '',
|
||||
monitoringResult: ''
|
||||
},
|
||||
id: '',
|
||||
name: faultName,
|
||||
namespace: '',
|
||||
seqNum: 0,
|
||||
severity: '',
|
||||
shelved: true,
|
||||
shortDescription: '',
|
||||
triggerTime: '',
|
||||
triggerValueInfo: {
|
||||
value: 0,
|
||||
rangeCondition: '',
|
||||
monitoringResult: ''
|
||||
}
|
||||
}
|
||||
};
|
||||
const faultDomainObject = {
|
||||
name: 'it is not your fault',
|
||||
type: 'faultManagement',
|
||||
identifier: {
|
||||
key: 'nobodies',
|
||||
namespace: 'fault'
|
||||
}
|
||||
};
|
||||
const aComment = 'THIS is my fault.';
|
||||
const faultManagementProvider = {
|
||||
request() {
|
||||
return Promise.resolve([aFault]);
|
||||
},
|
||||
subscribe(domainObject, callback) {
|
||||
return () => {};
|
||||
},
|
||||
supportsRequest(domainObject) {
|
||||
return domainObject.type === 'faultManagement';
|
||||
},
|
||||
supportsSubscribe(domainObject) {
|
||||
return domainObject.type === 'faultManagement';
|
||||
},
|
||||
acknowledgeFault(fault, { comment = '' }) {
|
||||
return Promise.resolve({
|
||||
success: true
|
||||
});
|
||||
},
|
||||
shelveFault(fault, shelveData) {
|
||||
return Promise.resolve({
|
||||
success: true
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
describe('The Fault Management API', () => {
|
||||
let openmct;
|
||||
|
||||
beforeEach(() => {
|
||||
openmct = createOpenMct();
|
||||
openmct.install(openmct.plugins.FaultManagement());
|
||||
// openmct.install(openmct.plugins.example.ExampleFaultSource());
|
||||
openmct.faults.addProvider(faultManagementProvider);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
return resetApplicationState(openmct);
|
||||
});
|
||||
|
||||
it('allows you to request a fault', async () => {
|
||||
spyOn(faultManagementProvider, 'supportsRequest').and.callThrough();
|
||||
|
||||
let faultResponse = await openmct.faults.request(faultDomainObject);
|
||||
|
||||
expect(faultManagementProvider.supportsRequest).toHaveBeenCalledWith(faultDomainObject);
|
||||
expect(faultResponse[0].fault.name).toEqual(faultName);
|
||||
});
|
||||
|
||||
it('allows you to subscribe to a fault', () => {
|
||||
spyOn(faultManagementProvider, 'subscribe').and.callThrough();
|
||||
spyOn(faultManagementProvider, 'supportsSubscribe').and.callThrough();
|
||||
|
||||
let unsubscribe = openmct.faults.subscribe(faultDomainObject, () => {});
|
||||
|
||||
expect(unsubscribe).toEqual(jasmine.any(Function));
|
||||
expect(faultManagementProvider.supportsSubscribe).toHaveBeenCalledWith(faultDomainObject);
|
||||
expect(faultManagementProvider.subscribe).toHaveBeenCalledOnceWith(faultDomainObject, jasmine.any(Function));
|
||||
|
||||
});
|
||||
|
||||
it('will tell you if the fault management provider supports actions', () => {
|
||||
expect(openmct.faults.supportsActions()).toBeTrue();
|
||||
});
|
||||
|
||||
it('will allow you to acknowledge a fault', async () => {
|
||||
spyOn(faultManagementProvider, 'acknowledgeFault').and.callThrough();
|
||||
|
||||
let ackResponse = await openmct.faults.acknowledgeFault(aFault, aComment);
|
||||
|
||||
expect(faultManagementProvider.acknowledgeFault).toHaveBeenCalledWith(aFault, aComment);
|
||||
expect(ackResponse.success).toBeTrue();
|
||||
});
|
||||
|
||||
it('will allow you to shelve a fault', async () => {
|
||||
spyOn(faultManagementProvider, 'shelveFault').and.callThrough();
|
||||
|
||||
let shelveResponse = await openmct.faults.shelveFault(aFault, aComment);
|
||||
|
||||
expect(faultManagementProvider.shelveFault).toHaveBeenCalledWith(aFault, aComment);
|
||||
expect(shelveResponse.success).toBeTrue();
|
||||
});
|
||||
|
||||
});
|
@ -36,7 +36,7 @@
|
||||
<li
|
||||
v-for="action in options.actions"
|
||||
:key="action.name"
|
||||
:class="action.cssClass"
|
||||
:class="[action.cssClass, action.isDisabled ? 'disabled' : '']"
|
||||
:title="action.description"
|
||||
:data-testid="action.testId || false"
|
||||
@click="action.onItemClicked"
|
||||
|
129
src/plugins/faultManagement/FaultManagementInspector.vue
Normal file
129
src/plugins/faultManagement/FaultManagementInspector.vue
Normal file
@ -0,0 +1,129 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div
|
||||
v-if="isShowDetails"
|
||||
class="c-inspector__properties c-inspect-properties"
|
||||
>
|
||||
<div class="c-inspect-properties__header">Fault Details</div>
|
||||
<ul
|
||||
class="c-inspect-properties__section"
|
||||
>
|
||||
<DetailText :detail="sourceDetails" />
|
||||
<DetailText :detail="occuredDetails" />
|
||||
<DetailText :detail="criticalityDetails" />
|
||||
<DetailText :detail="descriptionDetails" />
|
||||
</ul>
|
||||
|
||||
<div class="c-inspect-properties__header">Telemetry</div>
|
||||
<ul
|
||||
class="c-inspect-properties__section"
|
||||
>
|
||||
<DetailText :detail="systemDetails" />
|
||||
<DetailText :detail="tripValueDetails" />
|
||||
<DetailText :detail="currentValueDetails" />
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import DetailText from '@/ui/inspector/details/DetailText.vue';
|
||||
|
||||
export default {
|
||||
name: 'FaultManagementInspector',
|
||||
components: {
|
||||
DetailText
|
||||
},
|
||||
inject: ['openmct'],
|
||||
data() {
|
||||
return {
|
||||
isShowDetails: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
criticalityDetails() {
|
||||
return {
|
||||
name: 'Criticality',
|
||||
value: this.selectedFault?.severity
|
||||
};
|
||||
},
|
||||
currentValueDetails() {
|
||||
return {
|
||||
name: 'Live value',
|
||||
value: this.selectedFault?.currentValueInfo?.value
|
||||
};
|
||||
},
|
||||
descriptionDetails() {
|
||||
return {
|
||||
name: 'Description',
|
||||
value: this.selectedFault?.shortDescription
|
||||
};
|
||||
},
|
||||
occuredDetails() {
|
||||
return {
|
||||
name: 'Occured',
|
||||
value: this.selectedFault?.triggerTime
|
||||
};
|
||||
},
|
||||
sourceDetails() {
|
||||
return {
|
||||
name: 'Source',
|
||||
value: this.selectedFault?.name
|
||||
};
|
||||
},
|
||||
systemDetails() {
|
||||
return {
|
||||
name: 'System',
|
||||
value: this.selectedFault?.namespace
|
||||
};
|
||||
},
|
||||
tripValueDetails() {
|
||||
return {
|
||||
name: 'Trip Value',
|
||||
value: this.selectedFault?.triggerValueInfo?.value
|
||||
};
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.updateSelectedFaults();
|
||||
},
|
||||
methods: {
|
||||
updateSelectedFaults() {
|
||||
const selection = this.openmct.selection.get();
|
||||
this.isShowDetails = false;
|
||||
|
||||
if (selection.length === 0 || selection[0].length < 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
const selectedFaults = selection[0][1].context.selectedFaults;
|
||||
if (selectedFaults.length !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.isShowDetails = true;
|
||||
this.selectedFault = selectedFaults[0];
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
@ -0,0 +1,71 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 FaultManagementInspector from './FaultManagementInspector.vue';
|
||||
|
||||
import Vue from 'vue';
|
||||
|
||||
import { FAULT_MANAGEMENT_INSPECTOR, FAULT_MANAGEMENT_TYPE } from './constants';
|
||||
|
||||
export default function FaultManagementInspectorViewProvider(openmct) {
|
||||
return {
|
||||
openmct: openmct,
|
||||
key: FAULT_MANAGEMENT_INSPECTOR,
|
||||
name: 'FAULT_MANAGEMENT_TYPE',
|
||||
canView: (selection) => {
|
||||
if (selection.length !== 1 || selection[0].length === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let object = selection[0][0].context.item;
|
||||
|
||||
return object && object.type === FAULT_MANAGEMENT_TYPE;
|
||||
},
|
||||
view: (selection) => {
|
||||
let component;
|
||||
|
||||
return {
|
||||
show: function (element) {
|
||||
component = new Vue({
|
||||
el: element,
|
||||
components: {
|
||||
FaultManagementInspector
|
||||
},
|
||||
provide: {
|
||||
openmct
|
||||
},
|
||||
template: '<FaultManagementInspector></FaultManagementInspector>'
|
||||
});
|
||||
},
|
||||
destroy: function () {
|
||||
if (component) {
|
||||
component.$destroy();
|
||||
component = undefined;
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
priority: () => {
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
}
|
103
src/plugins/faultManagement/FaultManagementListHeader.vue
Normal file
103
src/plugins/faultManagement/FaultManagementListHeader.vue
Normal file
@ -0,0 +1,103 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div class="c-fault-mgmt__list-header c-fault-mgmt__list">
|
||||
<div class="c-fault-mgmt__checkbox">
|
||||
<input
|
||||
type="checkbox"
|
||||
:checked="isSelectAll"
|
||||
@input="selectAll"
|
||||
>
|
||||
</div>
|
||||
<div class="c-fault-mgmt__list-content">
|
||||
<div class="c-fault-mgmt__list-header-results"> {{ totalFaultsCount }} Results </div>
|
||||
<div class="c-fault-mgmt__list-content-right">
|
||||
<div class="c-fault-mgmt__list-header-tripVal c-fault-mgmt__list-trigVal">Trip Value</div>
|
||||
<div class="c-fault-mgmt__list-header-liveVal c-fault-mgmt__list-curVal">Live Value</div>
|
||||
<div class="c-fault-mgmt__list-header-trigTime c-fault-mgmt__list-trigTime">Trigger Time</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c-fault-mgmt__list-action-wrapper">
|
||||
<div class="c-fault-mgmt__list-header-sortButton c-fault-mgmt__list-action-button">
|
||||
<SelectField
|
||||
class="c-fault-mgmt-viewButton"
|
||||
title="Sort By"
|
||||
:model="model"
|
||||
@onChange="onChange"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import SelectField from '@/api/forms/components/controls/SelectField.vue';
|
||||
|
||||
import { SORT_ITEMS } from './constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
SelectField
|
||||
},
|
||||
inject: ['openmct', 'domainObject'],
|
||||
props: {
|
||||
selectedFaults: {
|
||||
type: Array,
|
||||
default() {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
totalFaultsCount: {
|
||||
type: Number,
|
||||
default() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
model: {}
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
isSelectAll() {
|
||||
return this.totalFaultsCount > 0 && this.selectedFaults.length === this.totalFaultsCount;
|
||||
}
|
||||
},
|
||||
beforeMount() {
|
||||
const options = Object.values(SORT_ITEMS);
|
||||
this.model = {
|
||||
options,
|
||||
value: options[0].value
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
onChange(data) {
|
||||
this.$emit('sortChanged', data);
|
||||
},
|
||||
selectAll(e) {
|
||||
this.$emit('selectAll', e.target.checked);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
191
src/plugins/faultManagement/FaultManagementListItem.vue
Normal file
191
src/plugins/faultManagement/FaultManagementListItem.vue
Normal file
@ -0,0 +1,191 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="c-fault-mgmt__list data-selectable"
|
||||
:class="[
|
||||
{'is-selected': isSelected},
|
||||
{'is-unacknowledged': !fault.acknowledged},
|
||||
{'is-shelved': fault.shelved}
|
||||
]"
|
||||
>
|
||||
<div class="c-fault-mgmt__checkbox">
|
||||
<input
|
||||
type="checkbox"
|
||||
:checked="isSelected"
|
||||
@input="toggleSelected"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
class="c-fault-mgmt__list-severity"
|
||||
:title="fault.severity"
|
||||
:class="[
|
||||
'is-severity-' + fault.severity
|
||||
]"
|
||||
>
|
||||
</div>
|
||||
<div class="c-fault-mgmt__list-content">
|
||||
<div class="c-fault-mgmt__list-pathname">
|
||||
<div class="c-fault-mgmt__list-path">{{ fault.namespace }}</div>
|
||||
<div class="c-fault-mgmt__list-faultname">{{ fault.name }}</div>
|
||||
</div>
|
||||
<div class="c-fault-mgmt__list-content-right">
|
||||
<div
|
||||
class="c-fault-mgmt__list-trigVal"
|
||||
:class="tripValueClassname"
|
||||
title="Trip Value"
|
||||
>{{ fault.triggerValueInfo.value }}</div>
|
||||
<div
|
||||
class="c-fault-mgmt__list-curVal"
|
||||
:class="liveValueClassname"
|
||||
title="Live Value"
|
||||
>
|
||||
{{ fault.currentValueInfo.value }}
|
||||
</div>
|
||||
<div
|
||||
class="c-fault-mgmt__list-trigTime"
|
||||
>{{ fault.triggerTime }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c-fault-mgmt__list-action-wrapper">
|
||||
<button
|
||||
class="c-fault-mgmt__list-action-button l-browse-bar__actions c-icon-button icon-3-dots"
|
||||
title="Disposition Actions"
|
||||
@click="showActionMenu"
|
||||
></button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
const RANGE_CONDITION_CLASS = {
|
||||
'LOW': 'is-limit--lwr',
|
||||
'HIGH': 'is-limit--upr'
|
||||
};
|
||||
|
||||
const SEVERITY_CLASS = {
|
||||
'CRITICAL': 'is-limit--red',
|
||||
'WARNING': 'is-limit--yellow',
|
||||
'WATCH': 'is-limit--cyan'
|
||||
};
|
||||
|
||||
export default {
|
||||
inject: ['openmct', 'domainObject'],
|
||||
props: {
|
||||
fault: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
isSelected: {
|
||||
type: Boolean,
|
||||
default: () => {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
liveValueClassname() {
|
||||
const currentValueInfo = this.fault?.currentValueInfo;
|
||||
if (!currentValueInfo || currentValueInfo.monitoringResult === 'IN_LIMITS') {
|
||||
return '';
|
||||
}
|
||||
|
||||
let classname = RANGE_CONDITION_CLASS[currentValueInfo.rangeCondition] || '';
|
||||
classname += ' ';
|
||||
classname += SEVERITY_CLASS[currentValueInfo.monitoringResult] || '';
|
||||
|
||||
return classname.trim();
|
||||
},
|
||||
name() {
|
||||
return `${this.fault?.name}/${this.fault?.namespace}`;
|
||||
},
|
||||
severity() {
|
||||
return this.fault?.severity?.toLowerCase();
|
||||
},
|
||||
triggerTime() {
|
||||
return this.fault?.triggerTime;
|
||||
},
|
||||
triggerValue() {
|
||||
return this.fault?.triggerValueInfo?.value;
|
||||
},
|
||||
tripValueClassname() {
|
||||
const triggerValueInfo = this.fault?.triggerValueInfo;
|
||||
if (!triggerValueInfo || triggerValueInfo.monitoringResult === 'IN_LIMITS') {
|
||||
return '';
|
||||
}
|
||||
|
||||
let classname = RANGE_CONDITION_CLASS[triggerValueInfo.rangeCondition] || '';
|
||||
classname += ' ';
|
||||
classname += SEVERITY_CLASS[triggerValueInfo.monitoringResult] || '';
|
||||
|
||||
return classname.trim();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
showActionMenu(event) {
|
||||
event.stopPropagation();
|
||||
|
||||
const menuItems = [
|
||||
{
|
||||
cssClass: 'icon-bell',
|
||||
isDisabled: this.fault.acknowledged,
|
||||
name: 'Acknowledge',
|
||||
description: '',
|
||||
onItemClicked: (e) => {
|
||||
this.$emit('acknowledgeSelected', [this.fault]);
|
||||
}
|
||||
},
|
||||
{
|
||||
cssClass: 'icon-timer',
|
||||
name: 'Shelve',
|
||||
description: '',
|
||||
onItemClicked: () => {
|
||||
this.$emit('shelveSelected', [this.fault], { shelved: true });
|
||||
}
|
||||
},
|
||||
{
|
||||
cssClass: 'icon-timer',
|
||||
isDisabled: Boolean(!this.fault.shelved),
|
||||
name: 'Unshelve',
|
||||
description: '',
|
||||
onItemClicked: () => {
|
||||
this.$emit('shelveSelected', [this.fault], { shelved: false });
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
this.openmct.menus.showMenu(event.x, event.y, menuItems);
|
||||
},
|
||||
toggleSelected(event) {
|
||||
const faultData = {
|
||||
fault: this.fault,
|
||||
selected: event.target.checked
|
||||
};
|
||||
|
||||
this.$emit('toggleSelected', faultData);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
299
src/plugins/faultManagement/FaultManagementListView.vue
Normal file
299
src/plugins/faultManagement/FaultManagementListView.vue
Normal file
@ -0,0 +1,299 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div class="c-faults-list-view">
|
||||
<FaultManagementSearch
|
||||
:search-term="searchTerm"
|
||||
@filterChanged="updateFilter"
|
||||
@updateSearchTerm="updateSearchTerm"
|
||||
/>
|
||||
|
||||
<FaultManagementToolbar
|
||||
v-if="showToolbar"
|
||||
:selected-faults="selectedFaults"
|
||||
@acknowledgeSelected="toggleAcknowledgeSelected"
|
||||
@shelveSelected="toggleShelveSelected"
|
||||
/>
|
||||
|
||||
<FaultManagementListHeader
|
||||
class="header"
|
||||
:selected-faults="Object.values(selectedFaults)"
|
||||
:total-faults-count="filteredFaultsList.length"
|
||||
@selectAll="selectAll"
|
||||
@sortChanged="sortChanged"
|
||||
/>
|
||||
|
||||
<template v-if="filteredFaultsList.length > 0">
|
||||
<FaultManagementListItem
|
||||
v-for="fault of filteredFaultsList"
|
||||
:key="fault.id"
|
||||
:fault="fault"
|
||||
:is-selected="isSelected(fault)"
|
||||
@toggleSelected="toggleSelected"
|
||||
@acknowledgeSelected="toggleAcknowledgeSelected"
|
||||
@shelveSelected="toggleShelveSelected"
|
||||
/>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import FaultManagementListHeader from './FaultManagementListHeader.vue';
|
||||
import FaultManagementListItem from './FaultManagementListItem.vue';
|
||||
import FaultManagementSearch from './FaultManagementSearch.vue';
|
||||
import FaultManagementToolbar from './FaultManagementToolbar.vue';
|
||||
|
||||
import { FAULT_MANAGEMENT_SHELVE_DURATIONS_IN_MS, FILTER_ITEMS, SORT_ITEMS } from './constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
FaultManagementListHeader,
|
||||
FaultManagementListItem,
|
||||
FaultManagementSearch,
|
||||
FaultManagementToolbar
|
||||
},
|
||||
inject: ['openmct', 'domainObject'],
|
||||
props: {
|
||||
faultsList: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
filterIndex: 0,
|
||||
searchTerm: '',
|
||||
selectedFaults: {},
|
||||
sortBy: Object.values(SORT_ITEMS)[0].value
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
filteredFaultsList() {
|
||||
const filterName = FILTER_ITEMS[this.filterIndex];
|
||||
let list = this.faultsList.filter(fault => !fault.shelved);
|
||||
if (filterName === 'Acknowledged') {
|
||||
list = this.faultsList.filter(fault => fault.acknowledged);
|
||||
}
|
||||
|
||||
if (filterName === 'Unacknowledged') {
|
||||
list = this.faultsList.filter(fault => !fault.acknowledged);
|
||||
}
|
||||
|
||||
if (filterName === 'Shelved') {
|
||||
list = this.faultsList.filter(fault => fault.shelved);
|
||||
}
|
||||
|
||||
if (this.searchTerm.length > 0) {
|
||||
list = list.filter(this.filterUsingSearchTerm);
|
||||
}
|
||||
|
||||
list.sort(SORT_ITEMS[this.sortBy].sortFunction);
|
||||
|
||||
return list;
|
||||
},
|
||||
showToolbar() {
|
||||
return this.openmct.faults.supportsActions();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
filterUsingSearchTerm(fault) {
|
||||
if (fault?.id?.toString().toLowerCase().includes(this.searchTerm)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (fault?.triggerValueInfo?.toString().toLowerCase().includes(this.searchTerm)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (fault?.currentValueInfo?.toString().toLowerCase().includes(this.searchTerm)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (fault?.triggerTime.toString().toLowerCase().includes(this.searchTerm)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (fault?.severity.toString().toLowerCase().includes(this.searchTerm)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
isSelected(fault) {
|
||||
return Boolean(this.selectedFaults[fault.id]);
|
||||
},
|
||||
selectAll(toggle = false) {
|
||||
this.faultsList.forEach(fault => {
|
||||
const faultData = {
|
||||
fault,
|
||||
selected: toggle
|
||||
};
|
||||
this.toggleSelected(faultData);
|
||||
});
|
||||
},
|
||||
sortChanged(sort) {
|
||||
this.sortBy = sort.value;
|
||||
},
|
||||
toggleSelected({ fault, selected = false}) {
|
||||
if (selected) {
|
||||
this.$set(this.selectedFaults, fault.id, fault);
|
||||
} else {
|
||||
this.$delete(this.selectedFaults, fault.id);
|
||||
}
|
||||
|
||||
const selectedFaults = Object.values(this.selectedFaults);
|
||||
this.openmct.selection.select(
|
||||
[
|
||||
{
|
||||
element: this.$el,
|
||||
context: {
|
||||
item: this.openmct.router.path[0]
|
||||
}
|
||||
},
|
||||
{
|
||||
element: this.$el,
|
||||
context: {
|
||||
selectedFaults
|
||||
}
|
||||
}
|
||||
],
|
||||
false);
|
||||
},
|
||||
toggleAcknowledgeSelected(faults = Object.values(this.selectedFaults)) {
|
||||
let title = '';
|
||||
if (faults.length > 1) {
|
||||
title = `Acknowledge ${faults.length} selected faults`;
|
||||
} else {
|
||||
title = `Acknowledge fault: ${faults[0].name}`;
|
||||
}
|
||||
|
||||
const formStructure = {
|
||||
title,
|
||||
sections: [
|
||||
{
|
||||
rows: [
|
||||
{
|
||||
key: 'comment',
|
||||
control: 'textarea',
|
||||
name: 'Comment',
|
||||
pattern: '\\S+',
|
||||
required: false,
|
||||
cssClass: 'l-input-lg',
|
||||
value: ''
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
buttons: {
|
||||
submit: {
|
||||
label: 'Acknowledge'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.openmct.forms.showForm(formStructure)
|
||||
.then(data => {
|
||||
Object.values(faults)
|
||||
.forEach(selectedFault => {
|
||||
this.openmct.faults.acknowledgeFault(selectedFault, data);
|
||||
});
|
||||
});
|
||||
|
||||
this.selectedFaults = {};
|
||||
},
|
||||
async toggleShelveSelected(faults = Object.values(this.selectedFaults), shelveData = {}) {
|
||||
const { shelved = true } = shelveData;
|
||||
if (shelved) {
|
||||
let title = faults.length > 1
|
||||
? `Shelve ${faults.length} selected faults`
|
||||
: `Shelve fault: ${faults[0].name}`
|
||||
;
|
||||
|
||||
const formStructure = {
|
||||
title,
|
||||
sections: [
|
||||
{
|
||||
rows: [
|
||||
{
|
||||
key: 'comment',
|
||||
control: 'textarea',
|
||||
name: 'Comment',
|
||||
pattern: '\\S+',
|
||||
required: false,
|
||||
cssClass: 'l-input-lg',
|
||||
value: ''
|
||||
},
|
||||
{
|
||||
key: 'shelveDuration',
|
||||
control: 'select',
|
||||
name: 'Shelve Duration',
|
||||
options: FAULT_MANAGEMENT_SHELVE_DURATIONS_IN_MS,
|
||||
required: false,
|
||||
cssClass: 'l-input-lg',
|
||||
value: FAULT_MANAGEMENT_SHELVE_DURATIONS_IN_MS[0].value
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
buttons: {
|
||||
submit: {
|
||||
label: 'Shelve'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let data;
|
||||
try {
|
||||
data = await this.openmct.forms.showForm(formStructure);
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
|
||||
shelveData.comment = data.comment || '';
|
||||
shelveData.shelveDuration = data.shelveDuration !== undefined
|
||||
? data.shelveDuration
|
||||
: FAULT_MANAGEMENT_SHELVE_DURATIONS_IN_MS[0].value;
|
||||
} else {
|
||||
shelveData = {
|
||||
shelved: false
|
||||
};
|
||||
}
|
||||
|
||||
Object.values(faults)
|
||||
.forEach(selectedFault => {
|
||||
this.openmct.faults.shelveFault(selectedFault, shelveData);
|
||||
});
|
||||
|
||||
this.selectedFaults = {};
|
||||
},
|
||||
updateFilter(filter) {
|
||||
this.selectAll();
|
||||
|
||||
this.filterIndex = filter.model.options.findIndex(option => option.value === filter.value);
|
||||
},
|
||||
updateSearchTerm(term = '') {
|
||||
this.searchTerm = term.toLowerCase();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
56
src/plugins/faultManagement/FaultManagementObjectProvider.js
Normal file
56
src/plugins/faultManagement/FaultManagementObjectProvider.js
Normal file
@ -0,0 +1,56 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 { FAULT_MANAGEMENT_TYPE, FAULT_MANAGEMENT_VIEW, FAULT_MANAGEMENT_NAMESPACE } from './constants';
|
||||
|
||||
export default class FaultManagementObjectProvider {
|
||||
constructor(openmct) {
|
||||
this.openmct = openmct;
|
||||
this.namespace = FAULT_MANAGEMENT_NAMESPACE;
|
||||
this.key = FAULT_MANAGEMENT_VIEW;
|
||||
this.objects = {};
|
||||
|
||||
this.createFaultManagementRootObject();
|
||||
}
|
||||
|
||||
createFaultManagementRootObject() {
|
||||
this.rootObject = {
|
||||
identifier: {
|
||||
key: this.key,
|
||||
namespace: this.namespace
|
||||
},
|
||||
name: 'Fault Management',
|
||||
type: FAULT_MANAGEMENT_TYPE,
|
||||
location: 'ROOT'
|
||||
};
|
||||
|
||||
this.openmct.objects.addRoot(this.rootObject.identifier);
|
||||
}
|
||||
|
||||
get(identifier) {
|
||||
if (identifier.key === FAULT_MANAGEMENT_VIEW) {
|
||||
return Promise.resolve(this.rootObject);
|
||||
}
|
||||
|
||||
return Promise.reject();
|
||||
}
|
||||
}
|
42
src/plugins/faultManagement/FaultManagementPlugin.js
Normal file
42
src/plugins/faultManagement/FaultManagementPlugin.js
Normal file
@ -0,0 +1,42 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 FaultManagementViewProvider from './FaultManagementViewProvider';
|
||||
import FaultManagementObjectProvider from './FaultManagementObjectProvider';
|
||||
import FaultManagementInspectorViewProvider from './FaultManagementInspectorViewProvider';
|
||||
|
||||
import { FAULT_MANAGEMENT_TYPE, FAULT_MANAGEMENT_NAMESPACE } from './constants';
|
||||
|
||||
export default function FaultManagementPlugin() {
|
||||
return function (openmct) {
|
||||
openmct.types.addType(FAULT_MANAGEMENT_TYPE, {
|
||||
name: 'Fault Management',
|
||||
creatable: false,
|
||||
description: 'Fault Management View',
|
||||
cssClass: 'icon-telemetry'
|
||||
});
|
||||
|
||||
openmct.objectViews.addProvider(new FaultManagementViewProvider(openmct));
|
||||
openmct.inspectorViews.addProvider(new FaultManagementInspectorViewProvider(openmct));
|
||||
openmct.objects.addProvider(FAULT_MANAGEMENT_NAMESPACE, new FaultManagementObjectProvider(openmct));
|
||||
};
|
||||
}
|
90
src/plugins/faultManagement/FaultManagementSearch.vue
Normal file
90
src/plugins/faultManagement/FaultManagementSearch.vue
Normal file
@ -0,0 +1,90 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div class="c-fault-mgmt__search-row">
|
||||
<Search
|
||||
class="c-fault-mgmt-search"
|
||||
:value="searchTerm"
|
||||
@input="updateSearchTerm"
|
||||
@clear="updateSearchTerm"
|
||||
/>
|
||||
|
||||
<SelectField
|
||||
class="c-fault-mgmt-viewButton"
|
||||
title="View Filter"
|
||||
:model="model"
|
||||
@onChange="onChange"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import SelectField from '@/api/forms/components/controls/SelectField.vue';
|
||||
import Search from '@/ui/components/search.vue';
|
||||
|
||||
import { FILTER_ITEMS } from './constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
SelectField,
|
||||
Search
|
||||
},
|
||||
inject: ['openmct', 'domainObject'],
|
||||
props: {
|
||||
searchTerm: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
items: []
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
model() {
|
||||
return {
|
||||
options: this.items,
|
||||
value: this.items[0] ? this.items[0].value : FILTER_ITEMS[0].toLowerCase()
|
||||
};
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.items = FILTER_ITEMS
|
||||
.map(item => {
|
||||
return {
|
||||
name: item,
|
||||
value: item.toLowerCase()
|
||||
};
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
onChange(data) {
|
||||
this.$emit('filterChanged', data);
|
||||
},
|
||||
updateSearchTerm(searchTerm) {
|
||||
this.$emit('updateSearchTerm', searchTerm);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
102
src/plugins/faultManagement/FaultManagementToolbar.vue
Normal file
102
src/plugins/faultManagement/FaultManagementToolbar.vue
Normal file
@ -0,0 +1,102 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div class="c-fault-mgmt__toolbar">
|
||||
<button
|
||||
class="c-icon-button icon-bell"
|
||||
title="Acknowledge selected faults"
|
||||
:disabled="disableAcknowledge"
|
||||
@click="acknowledgeSelected"
|
||||
>
|
||||
<div
|
||||
title="Acknowledge selected faults"
|
||||
class="c-icon-button__label"
|
||||
>
|
||||
Acknowledge
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="c-icon-button icon-timer"
|
||||
title="Shelve selected faults"
|
||||
:disabled="disableShelve"
|
||||
@click="shelveSelected"
|
||||
>
|
||||
<div
|
||||
title="Shelve selected items"
|
||||
class="c-icon-button__label"
|
||||
>
|
||||
Shelve
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
inject: ['openmct', 'domainObject'],
|
||||
props: {
|
||||
selectedFaults: {
|
||||
type: Object,
|
||||
default() {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
disableAcknowledge: true,
|
||||
disableShelve: true
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
selectedFaults(newSelectedFaults) {
|
||||
const selectedfaults = Object.values(newSelectedFaults);
|
||||
|
||||
let disableAcknowledge = true;
|
||||
let disableShelve = true;
|
||||
|
||||
selectedfaults.forEach(fault => {
|
||||
if (!fault.shelved) {
|
||||
disableShelve = false;
|
||||
}
|
||||
|
||||
if (!fault.acknowledged) {
|
||||
disableAcknowledge = false;
|
||||
}
|
||||
});
|
||||
|
||||
this.disableAcknowledge = disableAcknowledge;
|
||||
this.disableShelve = disableShelve;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
acknowledgeSelected() {
|
||||
this.$emit('acknowledgeSelected');
|
||||
},
|
||||
shelveSelected() {
|
||||
this.$emit('shelveSelected');
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
77
src/plugins/faultManagement/FaultManagementView.vue
Normal file
77
src/plugins/faultManagement/FaultManagementView.vue
Normal file
@ -0,0 +1,77 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div class="c-fault-mgmt">
|
||||
<FaultManagementListView
|
||||
:faults-list="faultsList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import FaultManagementListView from './FaultManagementListView.vue';
|
||||
import { FAULT_MANAGEMENT_ALARMS, FAULT_MANAGEMENT_GLOBAL_ALARMS } from './constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
FaultManagementListView
|
||||
},
|
||||
inject: ['openmct', 'domainObject'],
|
||||
data() {
|
||||
return {
|
||||
faultsList: []
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.updateFaultList();
|
||||
|
||||
this.unsubscribe = this.openmct.faults
|
||||
.subscribe(this.domainObject, this.updateFault);
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (this.unsubscribe) {
|
||||
this.unsubscribe();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
updateFault({ fault, type }) {
|
||||
if (type === FAULT_MANAGEMENT_GLOBAL_ALARMS) {
|
||||
this.updateFaultList();
|
||||
} else if (type === FAULT_MANAGEMENT_ALARMS) {
|
||||
this.faultsList.forEach((faultValue, i) => {
|
||||
if (fault.id === faultValue.id) {
|
||||
this.$set(this.faultsList, i, fault);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
updateFaultList() {
|
||||
this.openmct.faults
|
||||
.request(this.domainObject)
|
||||
.then(faultsData => {
|
||||
this.faultsList = faultsData.map(fd => fd.fault);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
69
src/plugins/faultManagement/FaultManagementViewProvider.js
Normal file
69
src/plugins/faultManagement/FaultManagementViewProvider.js
Normal file
@ -0,0 +1,69 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 FaultManagementView from './FaultManagementView.vue';
|
||||
import { FAULT_MANAGEMENT_TYPE, FAULT_MANAGEMENT_VIEW } from './constants';
|
||||
import Vue from 'vue';
|
||||
|
||||
export default class FaultManagementViewProvider {
|
||||
constructor(openmct) {
|
||||
this.openmct = openmct;
|
||||
this.key = FAULT_MANAGEMENT_VIEW;
|
||||
}
|
||||
|
||||
canView(domainObject) {
|
||||
return domainObject.type === FAULT_MANAGEMENT_TYPE;
|
||||
}
|
||||
|
||||
canEdit(domainObject) {
|
||||
return false;
|
||||
}
|
||||
|
||||
view(domainObject) {
|
||||
let component;
|
||||
const openmct = this.openmct;
|
||||
|
||||
return {
|
||||
show: (element) => {
|
||||
component = new Vue({
|
||||
el: element,
|
||||
components: {
|
||||
FaultManagementView
|
||||
},
|
||||
provide: {
|
||||
openmct,
|
||||
domainObject
|
||||
},
|
||||
template: '<FaultManagementView></FaultManagementView>'
|
||||
});
|
||||
},
|
||||
destroy: () => {
|
||||
if (!component) {
|
||||
return;
|
||||
}
|
||||
|
||||
component.$destroy();
|
||||
component = undefined;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
122
src/plugins/faultManagement/constants.js
Normal file
122
src/plugins/faultManagement/constants.js
Normal file
@ -0,0 +1,122 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 FAULT_SEVERITY = {
|
||||
'CRITICAL': {
|
||||
name: 'CRITICAL',
|
||||
value: 'critical',
|
||||
priority: 0
|
||||
},
|
||||
'WARNING': {
|
||||
name: 'WARNING',
|
||||
value: 'warning',
|
||||
priority: 1
|
||||
},
|
||||
'WATCH': {
|
||||
name: 'WATCH',
|
||||
value: 'watch',
|
||||
priority: 2
|
||||
}
|
||||
};
|
||||
|
||||
export const FAULT_MANAGEMENT_TYPE = 'faultManagement';
|
||||
export const FAULT_MANAGEMENT_INSPECTOR = 'faultManagementInspector';
|
||||
export const FAULT_MANAGEMENT_ALARMS = 'alarms';
|
||||
export const FAULT_MANAGEMENT_GLOBAL_ALARMS = 'global-alarm-status';
|
||||
export const FAULT_MANAGEMENT_SHELVE_DURATIONS_IN_MS = [
|
||||
{
|
||||
name: '5 Minutes',
|
||||
value: 300000
|
||||
},
|
||||
{
|
||||
name: '10 Minutes',
|
||||
value: 600000
|
||||
},
|
||||
{
|
||||
name: '15 Minutes',
|
||||
value: 900000
|
||||
},
|
||||
{
|
||||
name: 'Indefinite',
|
||||
value: 0
|
||||
}
|
||||
];
|
||||
export const FAULT_MANAGEMENT_VIEW = 'faultManagement.view';
|
||||
export const FAULT_MANAGEMENT_NAMESPACE = 'faults.taxonomy';
|
||||
export const FILTER_ITEMS = [
|
||||
'Standard View',
|
||||
'Acknowledged',
|
||||
'Unacknowledged',
|
||||
'Shelved'
|
||||
];
|
||||
export const SORT_ITEMS = {
|
||||
'newest-first': {
|
||||
name: 'Newest First',
|
||||
value: 'newest-first',
|
||||
sortFunction: (a, b) => {
|
||||
if (b.triggerTime > a.triggerTime) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (a.triggerTime > b.triggerTime) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
'oldest-first': {
|
||||
name: 'Oldest First',
|
||||
value: 'oldest-first',
|
||||
sortFunction: (a, b) => {
|
||||
if (a.triggerTime > b.triggerTime) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (a.triggerTime < b.triggerTime) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
'severity': {
|
||||
name: 'Severity',
|
||||
value: 'severity',
|
||||
sortFunction: (a, b) => {
|
||||
const diff = FAULT_SEVERITY[a.severity].priority - FAULT_SEVERITY[b.severity].priority;
|
||||
if (diff !== 0) {
|
||||
return diff;
|
||||
}
|
||||
|
||||
if (b.triggerTime > a.triggerTime) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (a.triggerTime > b.triggerTime) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
};
|
234
src/plugins/faultManagement/fault-manager.scss
Normal file
234
src/plugins/faultManagement/fault-manager.scss
Normal file
@ -0,0 +1,234 @@
|
||||
/*****************************************************************************
|
||||
* 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 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.
|
||||
*****************************************************************************/
|
||||
|
||||
/*********************************************** FAULT PROPERTIES */
|
||||
.is-severity-critical{
|
||||
@include glyphBefore($glyph-icon-alert-triangle);
|
||||
color: $colorStatusError;
|
||||
}
|
||||
|
||||
.is-severity-warning{
|
||||
@include glyphBefore($glyph-icon-alert-rect);
|
||||
color: $colorStatusAlert;
|
||||
}
|
||||
|
||||
.is-severity-watch{
|
||||
@include glyphBefore($glyph-icon-info);
|
||||
color: $colorCommand;
|
||||
}
|
||||
|
||||
.is-unacknowledged{
|
||||
.c-fault-mgmt__list-severity{
|
||||
@include pulse($animName: severityAnim, $dur: 200ms);
|
||||
}
|
||||
}
|
||||
|
||||
.is-selected {
|
||||
background: $colorSelectedBg;
|
||||
}
|
||||
|
||||
.is-shelved{
|
||||
.c-fault-mgmt__list-content{
|
||||
opacity: 50% !important;
|
||||
font-style: italic;
|
||||
}
|
||||
.c-fault-mgmt__list-severity{
|
||||
@include pulse($animName: shelvedAnim, $dur: 0ms);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*********************************************** SEARCH */
|
||||
.c-fault-mgmt__search-row{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
> * + * {
|
||||
margin-left: 10px;
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.c-fault-mgmt-search{
|
||||
width: 95%;
|
||||
}
|
||||
|
||||
/*********************************************** TOOLBAR */
|
||||
.c-fault-mgmt__toolbar{
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
> * {
|
||||
font-size: 1.25em;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************** LIST VIEW */
|
||||
.c-faults-list-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
> * + * {
|
||||
margin-top: $interiorMargin;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*********************************************** FAULT ITEM */
|
||||
.c-fault-mgmt__list{
|
||||
background: rgba($colorBodyFg, 0.1);
|
||||
margin-bottom: 5px;
|
||||
padding: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
> * {
|
||||
margin-left: $interiorMargin;
|
||||
}
|
||||
|
||||
&-severity{
|
||||
font-size: 2em;
|
||||
margin-left: $interiorMarginLg;
|
||||
}
|
||||
|
||||
&-pathname{
|
||||
flex-wrap: wrap;
|
||||
flex: 1 1 auto;
|
||||
|
||||
}
|
||||
&-path{
|
||||
font-size: .75em;
|
||||
}
|
||||
|
||||
&-faultname{
|
||||
font-weight: bold;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
&-content{
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex: 1 1 auto;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&-content-right{
|
||||
margin-left: auto;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
&-trigVal, &-curVal, &-trigTime{
|
||||
@include ellipsize;
|
||||
border-radius: $controlCr;
|
||||
padding: $interiorMargin;
|
||||
width: 80px;
|
||||
margin-right: $interiorMarginLg;
|
||||
|
||||
}
|
||||
|
||||
&-trigVal {
|
||||
@include isLimit();
|
||||
background: rgba($colorBodyFg, 0.25);
|
||||
}
|
||||
|
||||
&-curVal {
|
||||
@include isLimit();
|
||||
background: rgba($colorBodyFg, 0.25);
|
||||
&-alert{
|
||||
background: $colorWarningHi;
|
||||
}
|
||||
}
|
||||
|
||||
&-trigTime{
|
||||
width: auto;
|
||||
}
|
||||
|
||||
&-action-wrapper{
|
||||
display: flex;
|
||||
align-content: right;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
&-action-button{
|
||||
flex: 0 0 auto;
|
||||
margin-left: auto;
|
||||
justify-content: right;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************** LIST HEADER */
|
||||
.c-fault-mgmt__list-header{
|
||||
display: flex;
|
||||
background: rgba($colorBodyFg, .23);
|
||||
border-radius: $controlCr;
|
||||
|
||||
&-tripVal, &-liveVal, &-trigTime{
|
||||
background: none;
|
||||
}
|
||||
|
||||
&-trigTime{
|
||||
width: 160px;
|
||||
}
|
||||
&-sortButton{
|
||||
flex: 0 0 auto;
|
||||
margin-left: auto;
|
||||
justify-content: right;
|
||||
display: flex;
|
||||
align-content: right;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.is-severity-critical{
|
||||
@include glyphBefore($glyph-icon-alert-triangle);
|
||||
color: $colorStatusError;
|
||||
}
|
||||
|
||||
.is-severity-warning{
|
||||
@include glyphBefore($glyph-icon-alert-rect);
|
||||
color: $colorStatusAlert;
|
||||
}
|
||||
|
||||
.is-severity-watch{
|
||||
@include glyphBefore($glyph-icon-info);
|
||||
color: $colorCommand;
|
||||
}
|
||||
|
||||
.is-unacknowledged{
|
||||
.c-fault-mgmt__list-severity{
|
||||
@include pulse($animName: severityAnim, $dur: 200ms);
|
||||
}
|
||||
}
|
||||
|
||||
.is-selected {
|
||||
background: $colorSelectedBg;
|
||||
}
|
||||
|
||||
.is-shelved{
|
||||
.c-fault-mgmt__list-content{
|
||||
opacity: 60% !important;
|
||||
font-style: italic;
|
||||
}
|
||||
.c-fault-mgmt__list-severity{
|
||||
@include pulse($animName: shelvedAnim, $dur: 0ms);
|
||||
}
|
||||
}
|
52
src/plugins/faultManagement/pluginSpec.js
Normal file
52
src/plugins/faultManagement/pluginSpec.js
Normal file
@ -0,0 +1,52 @@
|
||||
/*****************************************************************************
|
||||
* 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 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 {
|
||||
createOpenMct,
|
||||
resetApplicationState
|
||||
} from '../../utils/testing';
|
||||
import { FAULT_MANAGEMENT_TYPE } from './constants';
|
||||
|
||||
describe("The Fault Management Plugin", () => {
|
||||
let openmct;
|
||||
|
||||
beforeEach(() => {
|
||||
openmct = createOpenMct();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
return resetApplicationState(openmct);
|
||||
});
|
||||
|
||||
it('is not installed by default', () => {
|
||||
let typeDef = openmct.types.get(FAULT_MANAGEMENT_TYPE).definition;
|
||||
|
||||
expect(typeDef.name).toBe('Unknown Type');
|
||||
});
|
||||
|
||||
it('can be installed', () => {
|
||||
openmct.install(openmct.plugins.FaultManagement());
|
||||
let typeDef = openmct.types.get(FAULT_MANAGEMENT_TYPE).definition;
|
||||
|
||||
expect(typeDef.name).toBe('Fault Management');
|
||||
});
|
||||
});
|
@ -32,6 +32,7 @@ define([
|
||||
'./autoflow/AutoflowTabularPlugin',
|
||||
'./timeConductor/plugin',
|
||||
'../../example/imagery/plugin',
|
||||
'../../example/faultManagment/exampleFaultSource',
|
||||
'./imagery/plugin',
|
||||
'./summaryWidget/plugin',
|
||||
'./URLIndicatorPlugin/URLIndicatorPlugin',
|
||||
@ -81,6 +82,7 @@ define([
|
||||
'./operatorStatus/plugin',
|
||||
'./gauge/GaugePlugin',
|
||||
'./timelist/plugin',
|
||||
'./faultManagement/FaultManagementPlugin',
|
||||
'../../example/exampleTags/plugin'
|
||||
], function (
|
||||
_,
|
||||
@ -94,6 +96,7 @@ define([
|
||||
AutoflowPlugin,
|
||||
TimeConductorPlugin,
|
||||
ExampleImagery,
|
||||
ExampleFaultSource,
|
||||
ImageryPlugin,
|
||||
SummaryWidget,
|
||||
URLIndicatorPlugin,
|
||||
@ -143,6 +146,7 @@ define([
|
||||
OperatorStatus,
|
||||
GaugePlugin,
|
||||
TimeList,
|
||||
FaultManagementPlugin,
|
||||
ExampleTags
|
||||
) {
|
||||
const plugins = {};
|
||||
@ -150,6 +154,7 @@ define([
|
||||
plugins.example = {};
|
||||
plugins.example.ExampleUser = ExampleUser.default;
|
||||
plugins.example.ExampleImagery = ExampleImagery.default;
|
||||
plugins.example.ExampleFaultSource = ExampleFaultSource.default;
|
||||
plugins.example.EventGeneratorPlugin = EventGeneratorPlugin.default;
|
||||
plugins.example.ExampleTags = ExampleTags.default;
|
||||
plugins.example.Generator = () => GeneratorPlugin;
|
||||
@ -189,6 +194,7 @@ define([
|
||||
plugins.Notebook = Notebook.NotebookPlugin;
|
||||
plugins.RestrictedNotebook = Notebook.RestrictedNotebookPlugin;
|
||||
plugins.DisplayLayout = DisplayLayoutPlugin.default;
|
||||
plugins.FaultManagement = FaultManagementPlugin.default;
|
||||
plugins.FormActions = FormActions;
|
||||
plugins.FolderView = FolderView;
|
||||
plugins.Tabs = Tabs;
|
||||
|
@ -55,6 +55,7 @@
|
||||
@import "./notebook.scss";
|
||||
@import "../plugins/notebook/components/sidebar.scss";
|
||||
@import "../plugins/gauge/gauge.scss";
|
||||
@import "../plugins/faultManagement/fault-manager.scss";
|
||||
@import "../plugins/operatorStatus/operator-status";
|
||||
|
||||
#splash-screen {
|
||||
|
@ -21,7 +21,10 @@
|
||||
*****************************************************************************/
|
||||
|
||||
<template>
|
||||
<div class="c-inspect-properties c-inspect-properties--location">
|
||||
<div
|
||||
v-if="originalPath.length"
|
||||
class="c-inspect-properties c-inspect-properties--location"
|
||||
>
|
||||
<div
|
||||
class="c-inspect-properties__header"
|
||||
title="The location of this linked object."
|
||||
|
Loading…
Reference in New Issue
Block a user