/*
* This file is part of caronte (https://github.com/eciavatta/caronte).
* Copyright (c) 2020 Emiliano Ciavatta.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
import React, {Component} from "react";
import {Col, Container, Row} from "react-bootstrap";
import Table from "react-bootstrap/Table";
import backend from "../../backend";
import dispatcher from "../../dispatcher";
import {createCurlCommand} from "../../utils";
import validation from "../../validation";
import ButtonField from "../fields/ButtonField";
import ColorField from "../fields/extensions/ColorField";
import NumericField from "../fields/extensions/NumericField";
import InputField from "../fields/InputField";
import TextField from "../fields/TextField";
import LinkPopover from "../objects/LinkPopover";
import "./common.scss";
import "./ServicesPane.scss";
const classNames = require("classnames");
const _ = require("lodash");
class ServicesPane extends Component {
emptyService = {
"port": 0,
"name": "",
"color": "",
"notes": ""
};
state = {
services: [],
currentService: this.emptyService,
};
componentDidMount() {
this.reset();
this.loadServices();
dispatcher.register("notifications", this.handleNotifications);
document.title = "caronte:~/services$";
}
componentWillUnmount() {
dispatcher.unregister(this.handleNotifications);
}
handleNotifications = (payload) => {
if (payload.event === "services.edit") {
this.loadServices();
}
};
loadServices = () => {
backend.get("/api/services")
.then((res) => this.setState({services: Object.values(res.json), servicesStatusCode: res.status}))
.catch((res) => this.setState({servicesStatusCode: res.status, servicesResponse: JSON.stringify(res.json)}));
};
updateService = () => {
const service = this.state.currentService;
if (this.validateService(service)) {
backend.put("/api/services", service).then((res) => {
this.reset();
this.setState({serviceStatusCode: res.status});
this.loadServices();
}).catch((res) => {
this.setState({serviceStatusCode: res.status, serviceResponse: JSON.stringify(res.json)});
});
}
};
validateService = (service) => {
let valid = true;
if (!validation.isValidPort(service.port, true)) {
this.setState({servicePortError: "port < 0 || port > 65565"});
valid = false;
}
if (service.name.length < 3) {
this.setState({serviceNameError: "name.length < 3"});
valid = false;
}
if (!validation.isValidColor(service.color)) {
this.setState({serviceColorError: "color is not hexcolor"});
valid = false;
}
return valid;
};
reset = () => {
this.setState({
isUpdate: false,
currentService: _.cloneDeep(this.emptyService),
servicePortError: null,
serviceNameError: null,
serviceColorError: null,
serviceStatusCode: null,
servicesStatusCode: null,
serviceResponse: null,
servicesResponse: null
});
};
updateParam = (callback) => {
callback(this.state.currentService);
this.setState({currentService: this.state.currentService});
};
render() {
const isUpdate = this.state.isUpdate;
const service = this.state.currentService;
let services = this.state.services.map((s) =>
{
this.reset();
this.setState({isUpdate: true, currentService: _.cloneDeep(s)});
}} className={classNames("row-small", "row-clickable", {"row-selected": service.port === s.port})}>
{s["port"]} |
{s["name"]} |
|
{s["notes"]} |
);
const curlCommand = createCurlCommand("/services", "PUT", service);
return (
GET /api/services
{this.state.servicesStatusCode &&
}
port |
name |
color |
notes |
{services}
PUT /api/services
this.updateParam((s) => s.port = v)}
min={0} max={65565} error={this.state.servicePortError}/>
this.updateParam((s) => s.name = v)}
error={this.state.serviceNameError}/>
this.updateParam((s) => s.color = v)}/>
this.updateParam((s) => s.notes = v)}/>
{}
);
}
}
export default ServicesPane;