2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt odlux
4 * =================================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * =================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
16 * ============LICENSE_END==========================================================================
18 import * as React from 'react';
20 import { Theme, createStyles, WithStyles, withStyles, Tooltip } from '@material-ui/core';
22 import { faBan } from '@fortawesome/free-solid-svg-icons';
23 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
25 import AddIcon from '@material-ui/icons/Add';
26 import EditIcon from '@material-ui/icons/Edit';
27 import RemoveIcon from '@material-ui/icons/RemoveCircleOutline';
28 import Refresh from '@material-ui/icons/Refresh';
29 import { MenuItem, Divider, Typography } from '@material-ui/core';
31 import connect, { IDispatcher, Connect } from '../../../../framework/src/flux/connect';
32 import MaterialTable, { MaterialTableCtorType, ColumnType } from '../../../../framework/src/components/material-table';
33 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
35 import { MaintenenceEntry, spoofSymbol } from '../models/maintenenceEntryType';
37 import EditMaintenenceEntryDialog, { EditMaintenenceEntryDialogMode } from '../components/editMaintenenceEntryDialog';
38 import RefreshMaintenanceEntriesDialog, { RefreshMaintenanceEntriesDialogMode } from '../components/refreshMaintenanceEntries';
39 import { convertToLocaleString } from '../utils/timeUtils';
40 import { createmaintenanceEntriesActions, createmaintenanceEntriesProperties, maintenanceEntriesReloadAction } from '../handlers/maintenenceEntriesHandler';
42 const styles = (theme: Theme) => createStyles({
49 marginLeft: theme.spacing(1),
50 marginRight: theme.spacing(1),
55 const MaintenenceEntriesTable = MaterialTable as MaterialTableCtorType<MaintenenceEntry>;
57 const mapProps = (state: IApplicationStoreState) => ({
58 maintenanceEntriesProperties: createmaintenanceEntriesProperties(state)
61 const mapDispatcher = (dispatcher: IDispatcher) => ({
62 maintenanceEntriesActions: createmaintenanceEntriesActions(dispatcher.dispatch),
63 onLoadMaintenanceEntries: async () => {
64 await dispatcher.dispatch(maintenanceEntriesReloadAction)
68 const emptyMaintenenceEntry: MaintenenceEntry = {
72 start: convertToLocaleString(new Date().valueOf()),
73 end: convertToLocaleString(new Date().valueOf()),
77 type MaintenenceViewComponentProps = Connect<typeof mapProps, typeof mapDispatcher> & WithStyles<typeof styles> & {
81 type MaintenenceViewComponentState = {
82 maintenenceEntryToEdit: MaintenenceEntry;
83 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode;
84 refreshMaintenenceEntriesEditorMode: RefreshMaintenanceEntriesDialogMode;
87 let initialSorted = false;
89 class MaintenenceViewComponent extends React.Component<MaintenenceViewComponentProps, MaintenenceViewComponentState> {
91 constructor(props: MaintenenceViewComponentProps) {
95 maintenenceEntryToEdit: emptyMaintenenceEntry,
96 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.None,
97 refreshMaintenenceEntriesEditorMode: RefreshMaintenanceEntriesDialogMode.None
102 getContextMenu(rowData: MaintenenceEntry): JSX.Element[] {
104 <MenuItem aria-label={"1hr-from-now"} onClick={event => this.onOpenPlus1hEditMaintenenceEntryDialog(event, rowData)}><Typography>+1h</Typography></MenuItem>,
105 <MenuItem aria-label={"8hr-from-now"} onClick={event => this.onOpenPlus8hEditMaintenenceEntryDialog(event, rowData)}><Typography>+8h</Typography></MenuItem>,
107 <MenuItem aria-label={"edit"} onClick={event => this.onOpenEditMaintenenceEntryDialog(event, rowData)}><EditIcon /><Typography>Edit</Typography></MenuItem>,
108 <MenuItem aria-label={"remove"} onClick={event => this.onOpenRemoveMaintenenceEntryDialog(event, rowData)}><RemoveIcon /><Typography>Remove</Typography></MenuItem>
114 const { classes } = this.props;
115 const addMaintenenceEntryAction = {
116 icon: AddIcon, tooltip: 'Add', ariaLabel:'add-element', onClick: () => {
117 const startTime = (new Date().valueOf());
118 const endTime = startTime;
120 maintenenceEntryToEdit: {
121 ...emptyMaintenenceEntry,
122 start: convertToLocaleString(startTime),
123 end: convertToLocaleString(endTime),
125 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.AddMaintenenceEntry
130 const refreshMaintenanceEntriesAction = {
131 icon: Refresh, tooltip: 'Refresh Maintenance Entries', ariaLabel: 'refresh', onClick: () => {
133 refreshMaintenenceEntriesEditorMode: RefreshMaintenanceEntriesDialogMode.RefreshMaintenanceEntriesTable
138 const now = new Date().valueOf();
141 <MaintenenceEntriesTable stickyHeader tableId="maintenance-table" title={"Maintenance"} customActionButtons={[refreshMaintenanceEntriesAction, addMaintenenceEntryAction]} columns={
143 { property: "nodeId", title: "Node Name", type: ColumnType.text },
145 property: "notifications", title: "Notification", width: 50, align: "center", type: ColumnType.custom, customControl: ({ rowData }) => (
146 rowData.active && (Date.parse(rowData.start).valueOf() <= now) && (Date.parse(rowData.end).valueOf() >= now) && <FontAwesomeIcon icon={faBan} /> || null
149 { property: "active", title: "Activation State", type: ColumnType.boolean, labels: { "true": "active", "false": "not active" }, },
150 { property: "start", title: "Start Date (UTC)", type: ColumnType.text },
151 { property: "end", title: "End Date (UTC)", type: ColumnType.text }
153 } idProperty={'_id'}{...this.props.maintenanceEntriesActions} {...this.props.maintenanceEntriesProperties} asynchronus createContextMenu={rowData => {
154 return this.getContextMenu(rowData);
156 </MaintenenceEntriesTable>
157 <EditMaintenenceEntryDialog initialMaintenenceEntry={this.state.maintenenceEntryToEdit} mode={this.state.maintenenceEntryEditorMode}
158 onClose={this.onCloseEditMaintenenceEntryDialog} />
159 <RefreshMaintenanceEntriesDialog mode={this.state.refreshMaintenenceEntriesEditorMode}
160 onClose={this.onCloseRefreshMaintenenceEntryDialog} />
165 public componentDidMount() {
167 if (!initialSorted) {
168 initialSorted = true;
169 this.props.maintenanceEntriesActions.onHandleRequestSort("node-id");
171 this.props.onLoadMaintenanceEntries();
177 private onOpenPlus1hEditMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
178 // event.preventDefault();
179 // event.stopPropagation();
180 const startTime = (new Date().valueOf());
181 const endTime = startTime + (1 * 60 * 60 * 1000);
183 maintenenceEntryToEdit: {
185 start: convertToLocaleString(startTime),
186 end: convertToLocaleString(endTime),
188 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.EditMaintenenceEntry
192 private onOpenPlus8hEditMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
193 // event.preventDefault();
194 // event.stopPropagation();
195 const startTime = (new Date().valueOf());
196 const endTime = startTime + (8 * 60 * 60 * 1000);
198 maintenenceEntryToEdit: {
200 start: convertToLocaleString(startTime),
201 end: convertToLocaleString(endTime),
203 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.EditMaintenenceEntry
207 private onOpenEditMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
208 // event.preventDefault();
209 // event.stopPropagation();
210 const startTime = (new Date().valueOf());
211 const endTime = startTime;
213 maintenenceEntryToEdit: {
215 ...(entry.start && endTime)
216 ? { start: convertToLocaleString(entry.start), end: convertToLocaleString(entry.end) }
217 : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime) }
219 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.EditMaintenenceEntry
223 private onOpenRemoveMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
224 // event.preventDefault();
225 // event.stopPropagation();
226 const startTime = (new Date().valueOf());
227 const endTime = startTime;
229 maintenenceEntryToEdit: {
231 ...(entry.start && endTime)
232 ? { start: convertToLocaleString(entry.start), end: convertToLocaleString(entry.end) }
233 : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime) }
235 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.RemoveMaintenenceEntry
239 private onCloseEditMaintenenceEntryDialog = () => {
241 maintenenceEntryToEdit: emptyMaintenenceEntry,
242 maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.None,
246 private onCloseRefreshMaintenenceEntryDialog = () => {
248 refreshMaintenenceEntriesEditorMode: RefreshMaintenanceEntriesDialogMode.None,
253 export const MaintenenceView = withStyles(styles)(connect(mapProps, mapDispatcher)(MaintenenceViewComponent));
254 export default MaintenenceView;