Rift.IO OSM R1 Initial Submission
[osm/UI.git] / skyquake / framework / widgets / skyquake_container / eventCenter.jsx
diff --git a/skyquake/framework/widgets/skyquake_container/eventCenter.jsx b/skyquake/framework/widgets/skyquake_container/eventCenter.jsx
new file mode 100644 (file)
index 0000000..75d2d52
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * 
+ *   Copyright 2016 RIFT.IO Inc
+ *
+ *   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.
+ *
+ */
+
+ /**
+  * EventCenter module to display a list of events from the system
+  * @module framework/widgets/skyquake_container/EventCenter
+  * @author Kiran Kashalkar <kiran.kashalkar@riftio.com>
+  *
+  */
+
+import React from 'react';
+import { Link } from 'react-router';
+import Utils from 'utils/utils.js';
+import Crouton from 'react-crouton';
+import TreeView from 'react-treeview';
+import _ from 'lodash';
+import '../../../node_modules/react-treeview/react-treeview.css';
+import './eventCenter.scss';
+
+export default class EventCenter extends React.Component {
+       constructor(props) {
+               super(props);
+               this.state = {};
+               this.state.isOpen = false;
+       }
+
+       componentWillReceiveProps(props) {
+               let stateObject = {};
+
+               let notificationList = sessionStorage.getItem('notificationList');
+               let latestNotification = sessionStorage.getItem('latestNotification');
+
+               if (props.newNotificationEvent && props.newNotificationMsg) {
+                       if (latestNotification) {
+                               latestNotification = JSON.parse(latestNotification);
+                               if (!_.isEqual(props.newNotificationMsg, latestNotification)) {
+                                       stateObject.newNotificationEvent = props.newNotificationEvent;
+                                       stateObject.newNotificationMsg = props.newNotificationMsg;
+                                       sessionStorage.setItem('latestNotification', JSON.stringify(stateObject.newNotificationMsg));
+                               } else {
+                                       stateObject.newNotificationEvent = false;
+                                       stateObject.newNotificationMsg = null;
+                               }
+                       } else {
+                               stateObject.newNotificationEvent = true;
+                               stateObject.newNotificationMsg = props.newNotificationMsg;
+                               sessionStorage.setItem('latestNotification', JSON.stringify(stateObject.newNotificationMsg));
+                       }
+               } else {
+                       stateObject.newNotificationEvent = false;
+                       stateObject.newNotificationMsg = null;
+               }
+
+               if (notificationList) {
+                       stateObject.notifications = _.merge(notificationList, props.notifications);
+               } else {
+                       stateObject.notifications = props.notifications;
+               }
+               sessionStorage.setItem('notifications', JSON.stringify(stateObject.notifications));
+               this.setState(stateObject);
+       }
+
+       newNotificationReset = () => {
+        this.setState({
+            newNotificationEvent: false
+        });
+    }
+
+       onClickToggleOpenClose(event) {
+               this.props.onToggle();
+               this.setState({
+                       isOpen: !this.state.isOpen
+               });
+       }
+       constructTree(details) {
+               let markup = [];
+               for (let key in details) {
+                       if (typeof(details[key]) == "object") {
+                           let html = (
+                               <TreeView key={key} nodeLabel={key}>
+                                 {this.constructTree(details[key])}
+                               </TreeView>
+                           );
+                           markup.push(html);
+                       } else {
+                               markup.push((<div key={key} className="info">{key} = {details[key].toString()}</div>));
+                       }
+               }
+               return markup;
+       }
+
+       getNotificationFields(notification) {
+               let notificationFields = {};
+               if (notification) {
+
+                       notificationFields.source = notification.source;
+                       notificationFields.eventTime = notification.eventTime;
+
+                       Object.keys(notification).map((notificationKey) => {
+                               if (_.indexOf(['source', 'eventTime'], notificationKey) == -1) {
+                                       notificationFields.eventKey = notificationKey;
+                                       notificationFields.details = notification[notificationFields.eventKey];
+                               }
+                       });
+
+               }
+               return notificationFields;
+       }
+
+       render() {
+               let html;
+               let displayNotifications = [];
+               let displayNotificationsTableHead = null;
+
+               if (this.state.notifications && this.state.notifications.length > 0) {
+                       displayNotificationsTableHead = (
+                               <thead>
+                                       <tr key='header' className='header'>
+                                               <th className='source column'> Source Event Stream </th>
+                                               <th className='timestamp column'> Timestamp </th>
+                                               <th className='event column'> Event </th>
+                                               <th className='details column'> Details </th>
+                                       </tr>
+                               </thead>
+                       );
+               }
+
+               this.state.notifications && this.state.notifications.map((notification, notifIndex) => {
+                       let notificationFields = {};
+
+                       notificationFields = this.getNotificationFields(notification);
+
+                       displayNotifications.push(
+                               <tr key={notifIndex} className='notificationItem'>
+                                       <td className='source column'> {notificationFields.source} </td>
+                                       <td className='timestamp column'> {notificationFields.eventTime} </td>
+                                       <td className='event column'> {notificationFields.eventKey} </td>
+                                       <td className='details column'>
+                                               <TreeView key={notifIndex + '-detail'} nodeLabel='Event Details'>
+                                                       {this.constructTree(notificationFields.details)}
+                                               </TreeView>
+                                       </td>
+                               </tr>
+                       );
+               });
+
+               let openedClassName = this.state.isOpen ? 'open' : 'closed';
+               html = (
+                       <div className={'eventCenter ' + openedClassName}>
+
+                        <div className='notification'>
+                            <Crouton
+                                id={Date.now()}
+                                message={this.getNotificationFields(this.state.newNotificationMsg).eventKey +
+                                       ' notification received. Check Event Center for more details.'}
+                                type={'info'}
+                                hidden={!(this.state.newNotificationEvent && this.state.newNotificationMsg)}
+                                onDismiss={this.newNotificationReset}
+                                timeout={this.props.dismissTimeout}
+                            />
+                        </div>
+                               <h1 className='title' data-open-close-icon={this.state.isOpen ? 'open' : 'closed'}
+                                       onClick={this.onClickToggleOpenClose.bind(this)}>
+                                       EVENT CENTER
+                               </h1>
+                               <div className='notificationListBody'>
+                                       <table className='notificationList'>
+                                               {displayNotificationsTableHead}
+                                               <tbody>
+                                                       {displayNotifications}
+                                               </tbody>
+                                       </table>
+                               </div>
+                       </div>
+               );
+
+               return html;
+       }
+}
+
+EventCenter.defaultProps = {
+       dismissTimeout: 3000
+}