blob: f01483bab037a9f8fbde93b7416471023855510b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import React, { Component } from "react";
import noZoneImage from "Images/defult_zone.png";
import { Link } from "react-router-dom";
import { toast } from "react-toastify";
import { fetchApi } from "Utils/fetchAPI";
import { isSystemAdmin, isKeyAdmin } from "Utils/XAUtils";
import ZoneDisplay from "./ZoneDisplay";
import { Row, Col, Collapse } from "react-bootstrap";
import { sortBy } from "lodash";
import withRouter from "Hooks/withRouter";
import { BlockUi, Loader } from "../../components/CommonComponents";
import CustomBreadcrumb from "../CustomBreadcrumb";
class ZoneListing extends Component {
constructor(props) {
super(props);
this.state = {
services: [],
zones: [],
selectedZone: null,
isCollapse: true,
loader: true,
filterZone: [],
isAdminRole: isSystemAdmin() || isKeyAdmin(),
blockUI: false
};
this.onChangeSearch = this.onChangeSearch.bind(this);
}
componentDidMount() {
this.fetchData();
}
componentDidUpdate(prevProps) {
if (
prevProps?.params?.zoneId !== undefined &&
this.props.params.zoneId != prevProps.params.zoneId
) {
this.fetchData();
}
}
fetchData = async () => {
let servicesResp;
let zoneList = [],
selectedZone = null,
zoneId = this.props.params.zoneId;
try {
const zonesResp = await fetchApi({
url: "zones/zones"
});
zoneList = zonesResp.data.securityZones || [];
} catch (error) {
console.error(`Error occurred while fetching Zones! ${error}`);
}
try {
servicesResp = await fetchApi({
url: "plugins/services",
params: {
page: 0,
pageSize: 200,
total_pages: 0,
startIndex: 0
}
});
} catch (error) {
console.error(`Error occurred while fetching Services! ${error}`);
}
zoneList = sortBy(zoneList, ["name"]);
if (zoneId !== undefined) {
selectedZone =
zoneList.find((obj) => obj.id === +zoneId) ||
this.props.navigate("/dataNotFound");
} else {
if (zoneList.length > 0) {
selectedZone = zoneList[0];
this.props.navigate(`/zones/zone/${zoneList[0].id}`, { replace: true });
}
}
this.setState({
loader: false,
selectedZone: selectedZone,
zones: zoneList,
filterZone: zoneList,
services: servicesResp.data.services
});
};
clickBtn = (zoneid) => {
let selectedZone = this.state.zones.find((obj) => zoneid === obj.id);
if (selectedZone) {
this.setState({ selectedZone: selectedZone });
this.props.navigate(`/zones/zone/${zoneid}`);
}
};
onChangeSearch = (e) => {
let filterZone = this.state.zones.filter((obj) =>
obj.name.toLowerCase().includes(e.target.value.toLowerCase())
);
this.setState({ filterZone: filterZone });
};
deleteZone = async (zoneId) => {
let getSelectedZone = [];
try {
this.setState({ blockUI: true });
await fetchApi({
url: `zones/zones/${zoneId}`,
method: "delete"
});
let availableZone = this.state.filterZone.filter(
(obj) => obj.id !== zoneId
);
let localStorageZoneDetails = localStorage.getItem("zoneDetails");
if (
localStorageZoneDetails !== undefined &&
localStorageZoneDetails !== null
) {
JSON.parse(localStorageZoneDetails).value == zoneId &&
localStorage.removeItem("zoneDetails");
}
getSelectedZone = availableZone.length > 0 ? availableZone[0] : null;
this.setState({
selectedZone: getSelectedZone,
filterZone: availableZone,
zones: availableZone,
blockUI: false
});
if (getSelectedZone && getSelectedZone !== undefined) {
this.props.navigate(`/zones/zone/${getSelectedZone.id}`);
} else {
this.props.navigate(`/zones/zone/list`);
}
toast.success("Successfully deleted the zone");
} catch (error) {
this.setState({ blockUI: false });
let errorMsg = `Error occurred while deleting Zone id - ${zoneId}! ${error}`;
if (error?.response?.data?.msgDesc) {
errorMsg = `Error! ${error.response.data.msgDesc}`;
}
toast.error(errorMsg);
console.error(errorMsg);
}
};
expandBtn = (open) => {
this.setState({
isCollapse: !open
});
};
render() {
return (
<React.Fragment>
<div className="header-wraper">
<h3 className="wrap-header bold">Security Zone</h3>
<CustomBreadcrumb />
</div>
{this.state.loader ? (
<Loader />
) : (
<React.Fragment>
<div className="wrap">
<Row>
<BlockUi isUiBlock={this.state.blockUI} />
<Collapse in={this.state.isCollapse} data-id="panel">
<Col sm={3} className="border-right border-grey">
<Row>
{this.state.isAdminRole && (
<Col>
<Link
to={{
pathname: "/zones/create",
state: {
detail: this.state.filterZone[0]
}
}}
className="btn btn-outline-secondary btn-sm"
title="Create zone"
>
<i className="fa-fw fa fa-plus"></i>Create Zone
</Link>
<hr />
</Col>
)}
</Row>
<Row>
<Col>
<input
className="form-control"
type="text"
onChange={this.onChangeSearch}
placeholder="Search"
data-id="zoneSearch"
data-cy="zoneSearch"
></input>
</Col>
</Row>
<Row>
<Col>
{this.state.filterZone.length !== 0 ? (
<ul className="zone-listing mt-2">
{this.state.filterZone.map((zone) => (
<li
className="trim-containt"
key={zone.id}
onClick={() => {
this.clickBtn(zone.id);
}}
data-id={zone.name}
data-cy={zone.name}
title={zone.name}
>
<a
className={
this.state.selectedZone != null &&
this.state.selectedZone.id === zone.id
? `selected`
: ``
}
>
{zone.name}
</a>
</li>
))}
</ul>
) : (
<h6 className="text-muted large mt-3 bold">
No Zone Found !
</h6>
)}
</Col>
</Row>
</Col>
</Collapse>
<Col>
{this.state.selectedZone === null ? (
<Row className="justify-content-md-center">
<Col md="auto">
<div className="pt-5 pr-5">
<img
alt="No Zones"
className="w-50 p-3 d-block mx-auto"
src={noZoneImage}
/>
{this.state.isAdminRole && (
<Link
to={{
pathname: "/zones/create",
state: {
detail: this.state.filterZone[0]
}
}}
className="btn-add-security2 btn-lg"
>
<i className="fa-fw fa fa-plus"></i>Click here to
Create new Zone
</Link>
)}
</div>
</Col>
</Row>
) : (
<ZoneDisplay
history={this.props.navigate}
zone={this.state.selectedZone}
services={this.state.services}
deleteZone={this.deleteZone}
expandBtn={this.expandBtn}
isCollapse={this.state.isCollapse}
/>
)}
</Col>
</Row>
</div>
</React.Fragment>
)}
</React.Fragment>
);
}
}
export default withRouter(ZoneListing);