summaryrefslogtreecommitdiffstats
path: root/src/app/inventory/Inventory.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/inventory/Inventory.jsx')
-rw-r--r--src/app/inventory/Inventory.jsx190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/app/inventory/Inventory.jsx b/src/app/inventory/Inventory.jsx
new file mode 100644
index 0000000..de7120b
--- /dev/null
+++ b/src/app/inventory/Inventory.jsx
@@ -0,0 +1,190 @@
+/*
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ============================================================================
+ * 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.
+ * ============LICENSE_END=====================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+import React, {Component} from 'react';
+import {connect} from 'react-redux';
+import Grid from 'react-bootstrap/lib/Grid';
+import Row from 'react-bootstrap/lib/Row';
+import Col from 'react-bootstrap/lib/Col';
+import Clearfix from 'react-bootstrap/lib/Clearfix';
+import {
+ LineChart, Line, XAxis, YAxis, CartesianGrid,
+ Tooltip, ResponsiveContainer, Brush
+} from 'recharts';
+import i18n from 'utils/i18n/i18n';
+
+import TopographicMap from 'generic-components/map/TopographicMap.jsx';
+import {
+ onTopographicMapMounted, onCountByTypeLoad, onLoadTotalCountByDate
+} from 'app/inventory/InventoryActions.js';
+import {
+ INVENTORY_TITLE,
+ TOTAL_ENTITY_COUNTS_BY_DATE_CHART,
+ COMPLEX_BY_LOCATION_TITLE,
+ ENTITIES_BY_TYPE_TITLE,
+ TOTAL_ENTITY_COUNT_TITLE
+} from 'app/inventory/InventoryConstants.js';
+import InlineMessage from 'generic-components/InlineMessage/InlineMessage.jsx';
+import PaginatedTable from 'generic-components/paginatedTable/PaginatedTable.jsx';
+import {
+ dateFormatLocalTimeZoneMMDDYYYY, getTicks, getTicksData, sortDataByField
+} from 'utils/DateTimeChartUtil.js';
+import TitledContainer from 'generic-components/titledContainer/TitledContainer.jsx';
+import {COLOR_BLUE} from 'utils/GlobalConstants.js';
+
+const mapStateToProps = ({inventoryReducer}) => {
+ let {
+ mapPlotPoints = [], countByType = [], countByDate = [],
+ feedbackMsgText = '', feedbackMsgSeverity = ''
+ } = inventoryReducer;
+
+ return {
+ mapPlotPoints,
+ countByType,
+ countByDate,
+ feedbackMsgText,
+ feedbackMsgSeverity
+ };
+};
+
+const mapActionToProps = (dispatch) => {
+ return {
+ onMountQueryTopographicVisualization: (requestObject) => {
+ dispatch(onTopographicMapMounted(requestObject));
+ }, onLoadCountByType: () => {
+ dispatch(onCountByTypeLoad());
+ }, onLoadTotalCountByDate: () => {
+ dispatch(onLoadTotalCountByDate());
+ }
+ };
+};
+
+class Inventory extends Component {
+
+ componentDidMount() {
+ let requestObject = {
+ entityType: 'complex'
+ };
+ this.props.onMountQueryTopographicVisualization(requestObject);
+ this.props.onLoadCountByType();
+ this.props.onLoadTotalCountByDate();
+ }
+
+ render() {
+ let {
+ mapPlotPoints, countByType, onLoadCountByType, countByDate,
+ feedbackMsgSeverity, feedbackMsgText
+ } = this.props;
+
+ let tableDefinition = {
+ key: {name: 'Entity'},
+ doc_count: {name: 'Count'}
+ };
+ let paginationClasses = 'audit-pagination';
+ let tableClasses =
+ 'inventory-table table table-striped table-bordered table-condensed';
+
+ const xAxisAttrName = 'date';
+ const yAxisAttrName = 'count';
+ const sortedData = sortDataByField(countByDate, xAxisAttrName);
+ const ticksArr = getTicks(sortedData, xAxisAttrName);
+ const completeData = getTicksData(sortedData, ticksArr, xAxisAttrName);
+ const completeSortedData = sortDataByField(completeData, xAxisAttrName);
+
+ let totalEntities = 0;
+ let lastDate = '';
+ if (sortedData.length > 0) {
+ lastDate =
+ dateFormatLocalTimeZoneMMDDYYYY(sortedData[sortedData.length - 1]
+ .date);
+ totalEntities = sortedData[sortedData.length - 1].count;
+ }
+
+ return (
+ <div>
+ <div className='secondary-header'>
+ <span className='secondary-title'>{i18n(INVENTORY_TITLE)}</span>
+ <InlineMessage level={feedbackMsgSeverity}
+ messageTxt={feedbackMsgText}/>
+ </div>
+ <Grid fluid={true}>
+ <Row>
+ <Col xs={3} sm={3} md={3}>
+ <TitledContainer title={TOTAL_ENTITY_COUNT_TITLE}>
+ <div className='total-entity-count'>
+ {totalEntities}
+ <span>{lastDate}</span>
+ </div>
+ </TitledContainer>
+ <TitledContainer title={ENTITIES_BY_TYPE_TITLE}>
+ <PaginatedTable
+ tableHeaders={tableDefinition}
+ displayHeader={false}
+ tableData={countByType}
+ activePage={1}
+ pageCount={1}
+ onPageIndexSelected={ () => onLoadCountByType()}
+ paginationClass={paginationClasses}
+ tableClass={tableClasses}
+ maxPaginationLinks={25}/>
+ </TitledContainer>
+ </Col>
+ <Clearfix visibleSmBlock/>
+ <Col xs={9} sm={9} md={9}>
+ <TitledContainer
+ title={i18n(TOTAL_ENTITY_COUNTS_BY_DATE_CHART.title)}>
+ <ResponsiveContainer width='100%' height={250}>
+ <LineChart data={completeSortedData}
+ margin={{
+ top: 10, bottom: 10, left: 10, right: 70
+ }}>
+ <XAxis dataKey={xAxisAttrName} ticks={ticksArr}
+ tickCount={ticksArr.length}
+ tickFormatter={dateFormatLocalTimeZoneMMDDYYYY}/>
+ <YAxis/>
+ <CartesianGrid strokeDasharray='3 3'/>
+ <Tooltip labelFormatter={dateFormatLocalTimeZoneMMDDYYYY}/>
+ <Brush dataKey={xAxisAttrName}
+ tickFormatter={dateFormatLocalTimeZoneMMDDYYYY}
+ height={20} stroke={COLOR_BLUE}/>
+ <Line
+ name={i18n(TOTAL_ENTITY_COUNTS_BY_DATE_CHART.yAxisLabel)}
+ type='monotone' dataKey={yAxisAttrName}
+ stroke={COLOR_BLUE}
+ connectNulls={true} activeDot={{r: 6}}/>
+ </LineChart>
+ </ResponsiveContainer>
+ </TitledContainer>
+ <TitledContainer title={i18n(COMPLEX_BY_LOCATION_TITLE)}>
+ <TopographicMap pointArray={mapPlotPoints}/>
+ </TitledContainer>
+ </Col>
+ </Row>
+ </Grid>
+ </div>
+ );
+ }
+}
+export default connect(mapStateToProps, mapActionToProps)(Inventory);