--- /dev/null
+/*
+ *
+ * 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
+}