/* * 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)}); }); } }; deleteService = () => { const service = this.state.currentService; if (this.validateService(service)) { backend.delete("/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 && }
{services}
port name color notes
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)}/>
{} {isUpdate && } {!isUpdate && }
); } } export default ServicesPane;