This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch feature/5.0.0
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking-ui.git


The following commit(s) were added to refs/heads/feature/5.0.0 by this push:
     new e2557ac  Add searching alarm info
e2557ac is described below

commit e2557ac7d75044c437efd621c5edd60c8a48562e
Author: hanahmily <hanahm...@gmail.com>
AuthorDate: Wed Jan 31 11:47:21 2018 +0800

    Add searching alarm info
---
 src/main/frontend/.roadhogrc.mock.js               |   2 +-
 src/main/frontend/mock/alarm.js                    |  73 +++++++++---
 src/main/frontend/src/common/nav.js                |   2 +-
 src/main/frontend/src/models/alarm.js              |  58 +++++++++
 src/main/frontend/src/models/alert.js              |  26 -----
 src/main/frontend/src/routes/Alarm/Alarm.js        | 130 +++++++++++++++++++++
 .../routes/{Alert/Alert.less => Alarm/Alarm.less}  | 100 ++++++++--------
 src/main/frontend/src/routes/Alert/Alert.js        |  80 -------------
 src/main/frontend/src/utils/utils.js               |  68 ++++-------
 9 files changed, 322 insertions(+), 217 deletions(-)

diff --git a/src/main/frontend/.roadhogrc.mock.js 
b/src/main/frontend/.roadhogrc.mock.js
index d98cd24..5b2986f 100644
--- a/src/main/frontend/.roadhogrc.mock.js
+++ b/src/main/frontend/.roadhogrc.mock.js
@@ -25,7 +25,7 @@ const proxy = {
   'POST /api/server': getServer,
   'POST /api/service/search': searchService,
   'POST /api/service': getService,
-  'POST /api/alert': getAlarm,
+  'POST /api/alarm': getAlarm,
   'POST /api/trace/options': getAllApplicationForTrace,
   'POST /api/trace': getTrace,
   'POST /api/spans': getSpans,
diff --git a/src/main/frontend/mock/alarm.js b/src/main/frontend/mock/alarm.js
index df7adbc..5799d4a 100644
--- a/src/main/frontend/mock/alarm.js
+++ b/src/main/frontend/mock/alarm.js
@@ -2,21 +2,64 @@ import mockjs from 'mockjs';
 
 export default {
   getAlarm(req, res) {
-    res.json(mockjs.mock(
-      {
-        data: {
-          'loadAlertList|100': [
-            {
-              'key|+1': 1,
-              title: '@name',
-              content: '@paragraph(1)',
-              startTime: '@datetime("yyyy-MM-dd HH:mm:ss")',
-              'causeType|1': ['LOW_SUCCESS_RATE', 'SLOW_RESPONSE'],
-              'alertType|1': ['APPLICATION', 'SERVER', 'SERVICE'],
+    const { variables: { alarmType } } = req.body;
+    switch (alarmType) {
+      case 'APPLICATION':
+        return res.json(mockjs.mock(
+          {
+            data: {
+              loadAlarmList: {
+                'items|10': [{
+                  'key|+1': 1,
+                  title: '@name',
+                  content: '@paragraph(1)',
+                  startTime: '@datetime("yyyy-MM-dd HH:mm:ss")',
+                  'causeType|1': ['LOW_SUCCESS_RATE', 'SLOW_RESPONSE'],
+                  alarmType: 'APPLICATION',
+                }],
+                total: '@natural(5, 50)',
+              },
             },
-          ],
-        },
-      }
-    ));
+          }
+        ));
+      case 'SERVER':
+        return res.json(mockjs.mock(
+          {
+            data: {
+              loadAlarmList: {
+                'items|10': [{
+                  'key|+1': 1,
+                  title: '@name',
+                  content: '@paragraph(1)',
+                  startTime: '@datetime("yyyy-MM-dd HH:mm:ss")',
+                  'causeType|1': ['LOW_SUCCESS_RATE', 'SLOW_RESPONSE'],
+                  alarmType: 'SERVER',
+                }],
+                total: '@natural(5, 50)',
+              },
+            },
+          }
+        ));
+      case 'SERVICE':
+        return res.json(mockjs.mock(
+          {
+            data: {
+              loadAlarmList: {
+                'items|10': [{
+                  'key|+1': 1,
+                  title: '@name',
+                  content: '@paragraph(1)',
+                  startTime: '@datetime("yyyy-MM-dd HH:mm:ss")',
+                  'causeType|1': ['LOW_SUCCESS_RATE', 'SLOW_RESPONSE'],
+                  alarmType: 'SERVICE',
+                }],
+                total: '@natural(5, 50)',
+              },
+            },
+          }
+        ));
+      default:
+        return null;
+    }
   },
 };
diff --git a/src/main/frontend/src/common/nav.js 
b/src/main/frontend/src/common/nav.js
index 71cac94..1da8b46 100644
--- a/src/main/frontend/src/common/nav.js
+++ b/src/main/frontend/src/common/nav.js
@@ -55,7 +55,7 @@ export const getNavData = app => [
         name: 'Alarm',
         icon: 'iconfont icon-ALERT',
         path: 'alarm',
-        component: dynamicWrapper(app, ['alert'], () => 
import('../routes/Alert/Alert')),
+        component: dynamicWrapper(app, ['alarm'], () => 
import('../routes/Alarm/Alarm')),
       },
     ],
   },
diff --git a/src/main/frontend/src/models/alarm.js 
b/src/main/frontend/src/models/alarm.js
new file mode 100644
index 0000000..bd1827c
--- /dev/null
+++ b/src/main/frontend/src/models/alarm.js
@@ -0,0 +1,58 @@
+import { generateModal } from '../utils/utils';
+
+const dataQuery = `
+  query Alarm($keyword: String, $alarmType: AlarmType, $duration:Duration!, 
$paging: Pagination!){
+    loadAlarmList(keyword: $keyword, alarmType: $alarmType, duration: 
$duration, paging: $paging)
+  }
+`;
+
+export default generateModal({
+  namespace: 'alarm',
+  state: {
+    applicationAlarmList: {
+      items: [],
+      total: 0,
+    },
+    serverAlarmList: {
+      items: [],
+      total: 0,
+    },
+    serviceAlarmList: {
+      items: [],
+      total: 0,
+    },
+  },
+  dataQuery,
+  reducers: {
+    saveApplicationAlarmList(preState, { payload: { loadAlarmList } }) {
+      const { data } = preState;
+      return {
+        ...preState,
+        data: {
+          ...data,
+          applicationAlarmList: loadAlarmList,
+        },
+      };
+    },
+    saveServerAlarmList(preState, { payload: { loadAlarmList } }) {
+      const { data } = preState;
+      return {
+        ...preState,
+        data: {
+          ...data,
+          serverAlarmList: loadAlarmList,
+        },
+      };
+    },
+    saveServiceAlarmList(preState, { payload: { loadAlarmList } }) {
+      const { data } = preState;
+      return {
+        ...preState,
+        data: {
+          ...data,
+          serviceAlarmList: loadAlarmList,
+        },
+      };
+    },
+  },
+});
diff --git a/src/main/frontend/src/models/alert.js 
b/src/main/frontend/src/models/alert.js
deleted file mode 100644
index c0a919b..0000000
--- a/src/main/frontend/src/models/alert.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { query } from '../services/graphql';
-
-export default {
-  namespace: 'alert',
-  state: {
-    loadAlertList: [],
-  },
-  effects: {
-    *fetch({ payload }, { call, put }) {
-      const response = yield call(query, 'alert', payload);
-      yield put({
-        type: 'save',
-        payload: response,
-      });
-    },
-  },
-
-  reducers: {
-    save(state, action) {
-      return {
-        ...state,
-        ...action.payload.data,
-      };
-    },
-  },
-};
diff --git a/src/main/frontend/src/routes/Alarm/Alarm.js 
b/src/main/frontend/src/routes/Alarm/Alarm.js
new file mode 100644
index 0000000..cb376da
--- /dev/null
+++ b/src/main/frontend/src/routes/Alarm/Alarm.js
@@ -0,0 +1,130 @@
+import React, { PureComponent } from 'react';
+import { connect } from 'dva';
+import { Card, Input, Tabs, List, Avatar } from 'antd';
+import { Panel } from '../../components/Page';
+import styles from './Alarm.less';
+
+const { Search } = Input;
+const { TabPane } = Tabs;
+const defaultPaging = {
+  pageNum: 1,
+  pageSize: 10,
+  needTotal: true,
+};
+
+@connect(state => ({
+  alarm: state.alarm,
+  globalVariables: state.global.globalVariables,
+  loading: state.loading.models.alarm,
+}))
+export default class Alarm extends PureComponent {
+  componentDidMount() {
+    this.props.dispatch({
+      type: 'alarm/saveVariables',
+      payload: { values: {
+        alarmType: 'APPLICATION',
+        paging: defaultPaging,
+      } },
+    });
+  }
+  handleSearch = (keyword) => {
+    this.props.dispatch({
+      type: 'alarm/saveVariables',
+      payload: { values: {
+        keyword,
+        paging: defaultPaging,
+      } },
+    });
+  }
+  handlePageChange = (pag) => {
+    this.props.dispatch({
+      type: 'alarm/saveVariables',
+      payload: { values: {
+        paging: {
+          pageNum: pag,
+          pageSize: 10,
+          needTotal: true,
+        },
+      } },
+    });
+  }
+  changeAlarmType = (alarmType) => {
+    this.props.dispatch({
+      type: 'alarm/saveVariables',
+      payload: { values: {
+        alarmType,
+        paging: defaultPaging,
+      } },
+    });
+  }
+  handleChange = (variables) => {
+    const type = variables.alarmType.charAt(0) + 
variables.alarmType.slice(1).toLowerCase();
+    this.props.dispatch({
+      type: 'alarm/fetchData',
+      payload: { variables, reducer: `save${type}AlarmList` },
+    });
+  }
+  renderList = ({ items, total }) => {
+    const { alarm: { variables: { values: { paging = defaultPaging } } }, 
loading } = this.props;
+    const pagination = {
+      pageSize: paging.pageSize,
+      current: paging.pageNum,
+      total,
+      onChange: this.handlePageChange,
+    };
+
+    return (
+      <List
+        className="demo-loadmore-list"
+        loading={loading}
+        itemLayout="horizontal"
+        dataSource={items}
+        pagination={pagination}
+        renderItem={item => (
+          <List.Item>
+            <List.Item.Meta
+              avatar={
+                <Avatar
+                  style={item.causeType === 'LOW_SUCCESS_RATE' ? { 
backgroundColor: '#e68a00' } : { backgroundColor: '#b32400' }}
+                  icon={item.causeType === 'LOW_SUCCESS_RATE' ? 
'clock-circle-o' : 'close'}
+                />}
+              title={item.title}
+              description={item.content}
+            />
+            <div>{item.startTime}</div>
+          </List.Item>
+        )}
+      />);
+  }
+  render() {
+    const extraContent = (
+      <div className={styles.extraContent}>
+        <Search
+          className={styles.extraContentSearch}
+          placeholder="Search..."
+          onSearch={this.handleSearch}
+        />
+      </div>
+    );
+    const { alarm: { variables: { values }, data } } = this.props;
+    return (
+      <Panel
+        variables={values}
+        globalVariables={this.props.globalVariables}
+        onChange={this.handleChange}
+      >
+        <Card
+          title="Alarm List"
+          bordered={false}
+          extra={extraContent}
+        >
+          <Tabs defaultActiveKey={values.alarmType} 
onChange={this.changeAlarmType}>
+            <TabPane tab="Application" 
key="APPLICATION">{this.renderList(data.applicationAlarmList)}</TabPane>
+            <TabPane tab="Server" 
key="SERVER">{this.renderList(data.serverAlarmList)}</TabPane>
+            <TabPane tab="Service" 
key="SERVICE">{this.renderList(data.serviceAlarmList)}</TabPane>
+          </Tabs>
+        </Card>
+      </Panel>
+    );
+  }
+}
diff --git a/src/main/frontend/src/routes/Alert/Alert.less 
b/src/main/frontend/src/routes/Alarm/Alarm.less
similarity index 94%
rename from src/main/frontend/src/routes/Alert/Alert.less
rename to src/main/frontend/src/routes/Alarm/Alarm.less
index b10d030..1aa3571 100644
--- a/src/main/frontend/src/routes/Alert/Alert.less
+++ b/src/main/frontend/src/routes/Alarm/Alarm.less
@@ -1,50 +1,50 @@
-@import "~antd/lib/style/themes/default.less";
-@import "../../utils/utils.less";
-
-.tableList {
-  .tableListOperator {
-    margin-bottom: 16px;
-    button {
-      margin-right: 8px;
-    }
-  }
-}
-
-.tableListForm {
-  :global {
-    .ant-form-item {
-      margin-bottom: 24px;
-      margin-right: 0;
-      display: flex;
-      > .ant-form-item-label {
-        width: auto;
-        line-height: 32px;
-        padding-right: 8px;
-      }
-    }
-    .ant-form-item-control-wrapper {
-      flex: 1;
-    }
-  }
-  .submitButtons {
-    white-space: nowrap;
-    margin-bottom: 24px;
-  }
-}
-
-@media screen and (max-width: @screen-lg) {
-  .tableListForm :global(.ant-form-item) {
-    margin-right: 24px;
-  }
-}
-
-@media screen and (max-width: @screen-md) {
-  .tableListForm :global(.ant-form-item) {
-    margin-right: 8px;
-  }
-}
-
-.extraContentSearch {
-  margin-left: 16px;
-  width: 272px;
-}
+@import "~antd/lib/style/themes/default.less";
+@import "../../utils/utils.less";
+
+.tableList {
+  .tableListOperator {
+    margin-bottom: 16px;
+    button {
+      margin-right: 8px;
+    }
+  }
+}
+
+.tableListForm {
+  :global {
+    .ant-form-item {
+      margin-bottom: 24px;
+      margin-right: 0;
+      display: flex;
+      > .ant-form-item-label {
+        width: auto;
+        line-height: 32px;
+        padding-right: 8px;
+      }
+    }
+    .ant-form-item-control-wrapper {
+      flex: 1;
+    }
+  }
+  .submitButtons {
+    white-space: nowrap;
+    margin-bottom: 24px;
+  }
+}
+
+@media screen and (max-width: @screen-lg) {
+  .tableListForm :global(.ant-form-item) {
+    margin-right: 24px;
+  }
+}
+
+@media screen and (max-width: @screen-md) {
+  .tableListForm :global(.ant-form-item) {
+    margin-right: 8px;
+  }
+}
+
+.extraContentSearch {
+  margin-left: 16px;
+  width: 272px;
+}
diff --git a/src/main/frontend/src/routes/Alert/Alert.js 
b/src/main/frontend/src/routes/Alert/Alert.js
deleted file mode 100644
index c13db2a..0000000
--- a/src/main/frontend/src/routes/Alert/Alert.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import React, { Component } from 'react';
-import { connect } from 'dva';
-import { Card, Input, Tabs, List, Avatar } from 'antd';
-import styles from './Alert.less';
-
-const { Search } = Input;
-const { TabPane } = Tabs;
-
-@connect(state => ({
-  alert: state.alert,
-  duration: state.global.duration,
-  loading: state.loading.models.alarm,
-}))
-export default class Alert extends Component {
-  componentDidMount() {
-    this.props.dispatch({
-      type: 'alert/fetch',
-      payload: {},
-    });
-  }
-  shouldComponentUpdate(nextProps) {
-    if (this.props.duration !== nextProps.duration) {
-      this.props.dispatch({
-        type: 'alert/fetch',
-        payload: {},
-      });
-    }
-    return this.props.alert !== nextProps.alert;
-  }
-  changeAlarmType = () => {}
-  renderList = (data) => {
-    const { loading } = this.props;
-    return (
-      <List
-        className="demo-loadmore-list"
-        loading={loading}
-        itemLayout="horizontal"
-        dataSource={data}
-        renderItem={item => (
-          <List.Item>
-            <List.Item.Meta
-              avatar={
-                <Avatar
-                  style={item.causeType === 'LOW_SUCCESS_RATE' ? { 
backgroundColor: '#e68a00' } : { backgroundColor: '#b32400' }}
-                  icon={item.causeType === 'LOW_SUCCESS_RATE' ? 
'clock-circle-o' : 'close'}
-                />}
-              title={item.title}
-              description={item.content}
-            />
-            <div>{item.startTime}</div>
-          </List.Item>
-        )}
-      />);
-  }
-  render() {
-    const extraContent = (
-      <div className={styles.extraContent}>
-        <Search
-          className={styles.extraContentSearch}
-          placeholder="Search..."
-          onSearch={() => ({})}
-        />
-      </div>
-    );
-    const { alert: { loadAlertList } } = this.props;
-    return (
-      <Card
-        title="Alarm List"
-        bordered={false}
-        extra={extraContent}
-      >
-        <Tabs defaultActiveKey="1" onChange={this.changeAlarmType}>
-          <TabPane tab="Application" 
key="1">{this.renderList(loadAlertList.filter(i => i.alertType === 
'APPLICATION'))}</TabPane>
-          <TabPane tab="Server" 
key="2">{this.renderList(loadAlertList.filter(i => i.alertType === 
'SERVER'))}</TabPane>
-          <TabPane tab="Service" 
key="3">{this.renderList(loadAlertList.filter(i => i.alertType === 
'SERVICE'))}</TabPane>
-        </Tabs>
-      </Card>
-    );
-  }
-}
diff --git a/src/main/frontend/src/utils/utils.js 
b/src/main/frontend/src/utils/utils.js
index 6fe041a..633c2cc 100644
--- a/src/main/frontend/src/utils/utils.js
+++ b/src/main/frontend/src/utils/utils.js
@@ -128,40 +128,6 @@ export function generateDuration({ from, to }) {
   };
 }
 
-export function generateBaseModal({ namespace, query, state, effects = {}, 
reducers = {} }) {
-  return {
-    namespace,
-    state,
-    effects: {
-      ...effects,
-      *fetch({ payload }, { call, put }) {
-        const response = yield call(queryService, namespace, { variables: 
payload, query });
-        yield put({
-          type: 'save',
-          payload: response,
-        });
-      },
-      *fetchItem({ payload }, { call, put }) {
-        const response = yield call(queryService, namespace,
-          { variables: payload.variables, query });
-        yield put({
-          type: 'save',
-          payload: { data: { ...response.data, ...payload.data } },
-        });
-      },
-    },
-    reducers: {
-      ...reducers,
-      save(preState, action) {
-        return {
-          ...preState,
-          ...action.payload.data,
-        };
-      },
-    },
-  };
-}
-
 export function generateModal({ namespace, dataQuery, optionsQuery, state = {},
   effects = {}, reducers = {} }) {
   return {
@@ -176,20 +142,34 @@ export function generateModal({ namespace, dataQuery, 
optionsQuery, state = {},
     },
     effects: {
       *initOptions({ payload }, { call, put }) {
-        const { variables } = payload;
+        const { variables, reducer = undefined } = payload;
         const response = yield call(queryService, `${namespace}/options`, { 
variables, query: optionsQuery });
-        yield put({
-          type: 'saveOptions',
-          payload: response.data,
-        });
+        if (reducer) {
+          yield put({
+            type: reducer,
+            payload: response.data,
+          });
+        } else {
+          yield put({
+            type: 'saveOptions',
+            payload: response.data,
+          });
+        }
       },
       *fetchData({ payload }, { call, put }) {
-        const { variables } = payload;
+        const { variables, reducer = undefined } = payload;
         const response = yield call(queryService, namespace, { variables, 
query: dataQuery });
-        yield put({
-          type: 'saveData',
-          payload: response.data,
-        });
+        if (reducer) {
+          yield put({
+            type: reducer,
+            payload: response.data,
+          });
+        } else {
+          yield put({
+            type: 'saveData',
+            payload: response.data,
+          });
+        }
       },
       ...effects,
     },

-- 
To stop receiving notification emails like this one, please contact
hanahm...@apache.org.

Reply via email to