aboutsummaryrefslogtreecommitdiffstats
path: root/sdnr/wt/odlux/apps/faultApp
diff options
context:
space:
mode:
Diffstat (limited to 'sdnr/wt/odlux/apps/faultApp')
-rw-r--r--sdnr/wt/odlux/apps/faultApp/src/actions/statusActions.ts26
-rw-r--r--sdnr/wt/odlux/apps/faultApp/src/components/faultStatus.tsx54
-rw-r--r--sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts5
-rw-r--r--sdnr/wt/odlux/apps/faultApp/src/handlers/faultStatusHandler.ts29
-rw-r--r--sdnr/wt/odlux/apps/faultApp/src/index.html12
-rw-r--r--sdnr/wt/odlux/apps/faultApp/src/plugin.tsx19
-rw-r--r--sdnr/wt/odlux/apps/faultApp/src/services/faultStatusService.ts22
-rw-r--r--sdnr/wt/odlux/apps/faultApp/webpack.config.js22
8 files changed, 181 insertions, 8 deletions
diff --git a/sdnr/wt/odlux/apps/faultApp/src/actions/statusActions.ts b/sdnr/wt/odlux/apps/faultApp/src/actions/statusActions.ts
new file mode 100644
index 000000000..48f501ba8
--- /dev/null
+++ b/sdnr/wt/odlux/apps/faultApp/src/actions/statusActions.ts
@@ -0,0 +1,26 @@
+import { FaultApplicationBaseAction } from './notificationActions';
+import { getFaultStateFromDatabase } from '../services/faultStatusService';
+import { Dispatch } from '../../../../framework/src/flux/store';
+
+
+export class SetFaultStatusAction extends FaultApplicationBaseAction {
+ constructor (public criticalFaults: number, public majorFaults: number, public minorFaults: number, public warnings: number) {
+ super();
+ }
+}
+
+
+export const refreshFaultStatusAsyncAction = async (dispatch: Dispatch ) => {
+ const result = await getFaultStateFromDatabase().catch(_=>null);
+ if (result) {
+ const statusAction = new SetFaultStatusAction(
+ result["Critical"] || 0,
+ result["Major"] || 0,
+ result["Minor"] || 0,
+ result["Warning"] || 0
+ );
+ dispatch(statusAction);
+ return;
+ }
+ dispatch(new SetFaultStatusAction(0, 0, 0, 0));
+}
diff --git a/sdnr/wt/odlux/apps/faultApp/src/components/faultStatus.tsx b/sdnr/wt/odlux/apps/faultApp/src/components/faultStatus.tsx
new file mode 100644
index 000000000..e83720f0b
--- /dev/null
+++ b/sdnr/wt/odlux/apps/faultApp/src/components/faultStatus.tsx
@@ -0,0 +1,54 @@
+import * as React from 'react';
+
+import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
+import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; // select app icon
+
+import connect, { Connect } from '../../../../framework/src/flux/connect';
+import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
+
+import Typography from '@material-ui/core/Typography';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+
+const styles = (theme: Theme) => createStyles({
+ icon: {
+ marginLeft: 8,
+ marginRight: 8
+ },
+ critical: {
+ color: "red"
+ },
+ major: {
+ color: "orange"
+ },
+ minor: {
+ color: "#f7f700"
+ },
+ warning: {
+ color: "#428bca"
+ }
+});
+
+const mapProps = (state: IApplicationStoreState) => ({
+ faultStatus: state.fault.faultStatus,
+});
+
+
+type FaultStatusComponentProps = & WithStyles<typeof styles> & Connect<typeof mapProps>;
+
+class FaultStatusComponent extends React.Component<FaultStatusComponentProps> {
+ render(): JSX.Element {
+ const { classes, faultStatus } = this.props;
+
+ return (
+ <Typography variant="body1" color="inherit" >
+ Alarm status: <FontAwesomeIcon className={`${classes.icon} ${classes.critical}`} icon={faExclamationTriangle} /> { faultStatus.critical } |
+ <FontAwesomeIcon className={`${classes.icon} ${classes.major}`} icon={faExclamationTriangle} /> { faultStatus.major } |
+ <FontAwesomeIcon className={`${classes.icon} ${classes.minor}`} icon={faExclamationTriangle} /> { faultStatus.minor } |
+ <FontAwesomeIcon className={`${classes.icon} ${classes.warning}`} icon={faExclamationTriangle} /> { faultStatus.warning } |
+ </Typography>
+ );
+ };
+}
+
+export const FaultStatus = withStyles(styles)(connect(mapProps)(FaultStatusComponent));
+export default FaultStatus; \ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts b/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts
index a887a3327..e97383e10 100644
--- a/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts
+++ b/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts
@@ -10,12 +10,14 @@ import { IFaultNotifications, faultNotificationsHandler } from './notificationsH
import { ICurrentProblemsState, currentProblemsActionHandler } from './currentProblemsHandler';
import { IAlarmLogEntriesState, alarmLogEntriesActionHandler } from './alarmLogEntriesHandler';
import { SetPanelAction } from '../actions/panelChangeActions';
+import { IFaultStatus, faultStatusHandler } from './faultStatusHandler';
export interface IFaultAppStoreState {
currentProblems: ICurrentProblemsState;
faultNotifications: IFaultNotifications;
alarmLogEntries: IAlarmLogEntriesState;
currentOpenPanel: string|null;
+ faultStatus: IFaultStatus;
}
const currentOpenPanelHandler: IActionHandler<string | null> = (state = null, action) => {
@@ -35,7 +37,8 @@ const actionHandlers = {
currentProblems: currentProblemsActionHandler,
faultNotifications: faultNotificationsHandler,
alarmLogEntries: alarmLogEntriesActionHandler,
- currentOpenPanel: currentOpenPanelHandler
+ currentOpenPanel: currentOpenPanelHandler,
+ faultStatus: faultStatusHandler
};
export const faultAppRootHandler = combineActionHandler<IFaultAppStoreState>(actionHandlers);
diff --git a/sdnr/wt/odlux/apps/faultApp/src/handlers/faultStatusHandler.ts b/sdnr/wt/odlux/apps/faultApp/src/handlers/faultStatusHandler.ts
new file mode 100644
index 000000000..0a084df6b
--- /dev/null
+++ b/sdnr/wt/odlux/apps/faultApp/src/handlers/faultStatusHandler.ts
@@ -0,0 +1,29 @@
+import { IActionHandler } from "../../../../framework/src/flux/action";
+import { SetFaultStatusAction } from "../actions/statusActions";
+
+export interface IFaultStatus {
+ critical: number,
+ major: number,
+ minor: number,
+ warning: number
+}
+
+const faultStatusInit: IFaultStatus = {
+ critical: 0,
+ major: 0,
+ minor: 0,
+ warning: 0
+};
+
+export const faultStatusHandler: IActionHandler<IFaultStatus> = (state = faultStatusInit, action) => {
+ if (action instanceof SetFaultStatusAction) {
+ state = {
+ critical: action.criticalFaults,
+ major: action.majorFaults,
+ minor: action.minorFaults,
+ warning: action.warnings
+ }
+ }
+
+ return state;
+} \ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/faultApp/src/index.html b/sdnr/wt/odlux/apps/faultApp/src/index.html
index 5f6794f33..a2a0830b3 100644
--- a/sdnr/wt/odlux/apps/faultApp/src/index.html
+++ b/sdnr/wt/odlux/apps/faultApp/src/index.html
@@ -15,10 +15,14 @@
<script type="text/javascript" src="./config.js"></script>
<script>
// run the application
- require(["app", "faultApp"], function (app, faultApp) {
- faultApp.register();
- app("./app.tsx");
- });
+ require(["app", "connectApp", "faultApp", "maintenanceApp", "configurationApp", "helpApp"], function (app, connectApp, faultApp, maintenanceApp, configurationApp, helpApp) {
+ connectApp.register();
+ faultApp.register();
+ configurationApp.register();
+ maintenanceApp.register();
+ helpApp.register();
+ app("./app.tsx").runApplication();
+ });
</script>
</body>
diff --git a/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx b/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx
index c4545ad1a..be1e075fc 100644
--- a/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx
+++ b/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx
@@ -20,7 +20,9 @@ import { PanelId } from "./models/panelId";
import { SetPanelAction } from "./actions/panelChangeActions";
import { AddFaultNotificationAction } from "./actions/notificationActions";
-import { createCurrentProblemsProperties, createCurrentProblemsActions } from "./handlers/currentProblemsHandler";
+import { createCurrentProblemsProperties, createCurrentProblemsActions, currentProblemsReloadAction } from "./handlers/currentProblemsHandler";
+import { FaultStatus } from "./components/faultStatus";
+import { refreshFaultStatusAsyncAction } from "./actions/statusActions";
let currentMountId: string | undefined = undefined;
@@ -65,6 +67,7 @@ export function register() {
icon: faBell,
rootComponent: App,
rootActionHandler: faultAppRootHandler,
+ statusBarElement: FaultStatus,
menuEntry: "Fault"
});
@@ -75,4 +78,18 @@ export function register() {
store.dispatch(new AddFaultNotificationAction(fault));
}
}));
+
+ applicationApi.applicationStoreInitialized.then(store => {
+ store.dispatch(currentProblemsReloadAction);
+ });
+
+ applicationApi.applicationStoreInitialized.then(store => {
+ store.dispatch(refreshFaultStatusAsyncAction);
+ });
+ window.setInterval(() => {
+ applicationApi.applicationStoreInitialized.then(store => {
+ store.dispatch(refreshFaultStatusAsyncAction);
+ });
+ }, 15000);
+
}
diff --git a/sdnr/wt/odlux/apps/faultApp/src/services/faultStatusService.ts b/sdnr/wt/odlux/apps/faultApp/src/services/faultStatusService.ts
new file mode 100644
index 000000000..ad0d394ce
--- /dev/null
+++ b/sdnr/wt/odlux/apps/faultApp/src/services/faultStatusService.ts
@@ -0,0 +1,22 @@
+import { requestRest } from "../../../../framework/src/services/restService";
+import { Result } from "../../../../framework/src/models/elasticSearch";
+
+export const getFaultStateFromDatabase = async (): Promise < { [key: string]: number } | null > => {
+ const path = 'database/sdnevents/faultcurrent/_search';
+ const query = {
+ "size": 0,
+ "aggregations": {
+ "severity": {
+ "terms": {
+ "field": "faultCurrent.severity"
+ }
+ }
+ }
+ };
+
+ const result = await requestRest<Result<{ severity: { buckets: { key: string, doc_count: number }[] } }>>(path, { method: "POST", body: JSON.stringify(query) });
+ return result && result.aggregations && result.aggregations["severity"].buckets.reduce<{ [key: string]: number }>((acc, cur) => {
+ acc[cur.key] = cur.doc_count;
+ return acc;
+ }, {}) || null;
+} \ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/faultApp/webpack.config.js b/sdnr/wt/odlux/apps/faultApp/webpack.config.js
index a0284c5dd..bbf33ea2f 100644
--- a/sdnr/wt/odlux/apps/faultApp/webpack.config.js
+++ b/sdnr/wt/odlux/apps/faultApp/webpack.config.js
@@ -124,8 +124,26 @@ module.exports = (env) => {
colors: true
},
proxy: {
- "/database": {
- target: "http://localhost:8181",
+ "/oauth2/": {
+ target: "http://localhost:3000",
+ secure: false
+ },
+ "/database/": {
+ target: "http://localhost:3000",
+ secure: false
+ },
+ "/restconf/": {
+ target: "http://localhost:3000",
+ secure: false
+ },
+ "/help/": {
+ target: "http://localhost:3000",
+ secure: false
+ },
+ "/websocket/": {
+ target: "http://localhost:3000",
+ ws: true,
+ changeOrigin: true,
secure: false
}
}