import React, {Component} from "react"; import {Link} from "react-router-dom"; import ListTalkgroups from "../Talkgroups/ListTalkgroups.js"; import MessageBox from "../components/pure/Message.js"; import ListGroups from "../Group/ListGroups.js"; import GroupModal from "../Group/GroupModalContainer.js"; import UpdatePermissionModal from "../Permission/UpdatePermissionModalContainer.js"; import AddPermissionModal from "../Permission/AddPermissionModalContainer.js"; import ErrorChart from "./ResponsiveErrorChart" import CallChart from "./ResponsiveCallChart" import { Button, Confirm, Icon, Form, TextArea, Header, Container, Message, List, Segment, Tab, Divider, Label } from "semantic-ui-react"; function planName(planType) { switch (planType) { case freePlanValue: return "Free"; case proPlanValue: return "Pro"; } } class System extends Component { constructor(props) { super(props); this.handleUpload = this.handleUpload.bind(this); this.reorderGroup = this.reorderGroup.bind(this); this.deleteGroup = this.deleteGroup.bind(this); this.editGroup = this.editGroup.bind(this); this.saveGroupOrder = this.saveGroupOrder.bind(this); this.showSystemDeleteConfirm = this.showSystemDeleteConfirm.bind(this); this.showPermissionDeleteConfirm = this.showPermissionDeleteConfirm.bind( this ); this.updatePermission = this.updatePermission.bind(this); this.handlePermissionDeleteConfirm = this.handlePermissionDeleteConfirm.bind( this ); this.handlePermissionDeleteCancel = this.handlePermissionDeleteCancel.bind( this ); this.handleSystemDeleteConfirm = this.handleSystemDeleteConfirm.bind(this); this.handleSystemDeleteCancel = this.handleSystemDeleteCancel.bind(this); this.handleUpgradePlan = this.handleUpgradePlan.bind(this); this.handleUpdatePermissionClose = this.handleUpdatePermissionClose.bind( this ); this.handleGroupToggle = this.handleGroupToggle.bind(this); this.handleGroupClose = this.handleGroupClose.bind(this); this.handleAddPermissionToggle = this.handleAddPermissionToggle.bind(this); this.handleAddPermissionClose = this.handleAddPermissionClose.bind(this); this.processErrors = this.processErrors.bind(this); this.processStatistics = this.processStatistics.bind(this); this.state = { openSystemDeleteConfirm: false, openPermissionDeleteConfirm: false, openMessage: false, requestMessage: "", groupVisible: false, editGroupId: false, selectedPermission: false, addPermissionVisible: false, updatePermissionVisible: false, updatePermissionId: false }; } processErrors(errors) { var allData = []; var num = 0; const now = new Date(); var maxDate = now; var minDate = now; var minValue = 0; var maxValue = 0; var legend = []; for (var j = 0; j < errors.length; j++) { var data = []; for (var i = 0; i < errors[j].values.length; i++) { var time = new Date(errors[j].values[i].time); if (errors[j].values[i].errors > maxValue) maxValue = errors[j].values[i].errors; if (time < minDate) minDate = time; var value = { id: num++, y: errors[j].values[i].errors, x: time }; data.push(value); } const id = Math.floor(errors[j]._id / 1000) / 1000 + "MHz"; legend.push(id); var obj = { id: id, data: data }; allData.push(obj); } const errorData = { data: allData, minDate: minDate, maxDate: maxDate, minValue: minValue, maxValue: maxValue, legend: legend }; this.setState({ errorData: errorData }); } processStatistics(statistic) { var callTotals = []; var errorTotals = []; const now = new Date(); var maxDate = now; var minDate = now; var minValue = 0; var maxValue = 0; var MS_PER_MINUTE = 60000; for (var j = 0; j < statistic.callTotals.length; j++) { var spotsBack = statistic.callTotals.length - j; var time = new Date(now - spotsBack * 15 * MS_PER_MINUTE); if (time < minDate) minDate = time; if (statistic.callTotals[j] > maxValue) maxValue = statistic.callTotals[j]; callTotals.push({ y: statistic.callTotals[j], x: time }); } for (var j = 0; j < statistic.errorTotals.length; j++) { var spotsBack = statistic.errorTotals.length - j; var time = new Date(now - spotsBack * 15 * MS_PER_MINUTE); if (time < minDate) minDate = time; if (statistic.errorTotals[j] > maxValue) maxValue = statistic.errorTotals[j]; errorTotals.push({ x: time, y: statistic.errorTotals[j] }); } var callData = { minDate: minDate, maxDate: maxDate, minValue: minValue, maxValue: maxValue, callTotals: callTotals, errorTotals: errorTotals }; this.setState({ callData: callData }); } componentDidMount() { this.props.systemActions.fetchSystems(); this.props.talkgroupActions.fetchTalkgroups(this.props.shortName); this.props.groupActions.fetchGroups(this.props.shortName); this.props.errorActions.fetch(this.props.shortName); this.props.permissionActions.fetch(this.props.shortName); if (this.props.statistic) { this.processStatistics(this.props.statistic); } if (this.props.errors) { this.processErrors(this.props.errors); } } componentWillReceiveProps(nextProp) { if (!this.props.errors && nextProp.errors) { this.processErrors(nextProp.errors); } if (!this.props.statistic && nextProp.statistic) { this.processStatistics(nextProp.statistic); } } updatePermission(permissionId) { this.setState({ updatePermissionId: permissionId, updatePermissionVisible: !this.state.updatePermissionVisible }); } editGroup(groupId) { this.setState({ editGroupId: groupId, groupVisible: !this.state.groupVisible }); } deleteGroup(groupId) { this.props.groupActions.deleteGroup(this.props.shortName, groupId); } reorderGroup(oldIndex, newIndex) { this.props.groupActions.reorderGroup( this.props.shortName, oldIndex, newIndex ); } handleUpdatePermissionClose(didUpdate) { this.setState({ updatePermissionVisible: !this.state.updatePermissionVisible, updatePermissionId: false }); } handleAddPermissionClose(didUpdate) { this.setState({ addPermissionVisible: !this.state.addPermissionVisible }); } handleAddPermissionToggle = () => this.setState({ addPermissionVisible: !this.state.addPermissionVisible }); handleGroupClose(didUpdate) { this.setState({ groupVisible: !this.state.groupVisible, editGroupId: false }); } handleGroupToggle = () => this.setState({ editGroupId: false, groupVisible: !this.state.groupVisible }) handleExport() { this.props.talkgroupActions .exportTalkgroups(this.props.system.shortName) .then(requestMessage => { if (requestMessage) { // report to the user is there was a problem during registration this.setState({ requestMessage }); } }); } saveGroupOrder() { const order = this.props.groups.map(x => x._id); const data = { groupOrder: JSON.stringify(order) }; this.props.groupActions .saveGroupOrder(this.props.system.shortName, data) .then(requestMessage => { if (requestMessage) { } }); } handleUpgradePlan() { window.location = account_server + "/update-plans"; } handleUpload(file) { this.props.talkgroupActions .importTalkgroups(this.props.system.shortName, file) .then(requestMessage => { if (requestMessage) { // report to the user is there was a problem during registration this.setState({ requestMessage }); } }); } // https://github.com/Semantic-Org/Semantic-UI-React/issues/2103 showPermissionDeleteConfirm = permission => this.setState({ openPermissionDeleteConfirm: true, selectedPermission: permission }); showSystemDeleteConfirm = () => this.setState({ openSystemDeleteConfirm: true }); handlePermissionDeleteConfirm = permissionId => { this.setState({ openPermissionDeleteConfirm: false }); this.props.permissionActions .deletePermission({ shortName: this.props.system.shortName, permissionId: this.state.selectedPermission._id }) .then(requestMessage => { if (requestMessage) { // report to the user is there was a problem during login this.setState({ requestMessage: requestMessage, openMessage: true }); } }); }; handleSystemDeleteConfirm = () => { this.setState({ openSystemDeleteConfirm: false }); this.props.systemActions .deleteSystem(this.props.system.shortName) .then(requestMessage => { if (requestMessage) { // report to the user is there was a problem during login this.setState({ requestMessage: requestMessage, openMessage: true }); } }); }; handleSystemDeleteCancel = () => this.setState({ openSystemDeleteConfirm: false }); handlePermissionDeleteCancel = () => this.setState({ openPermissionDeleteConfirm: false }); render() { const system = this.props.system; let fileInput = null; var location = ""; var example = ""; var plan = ""; var groupRender = () => {}; if (system) { if (this.props.talkgroups && this.props.talkgroups.length) { groupRender = () => (
Below are the parameters you will need to configure Trunk Recorder. The example below shows how they should be added to the config.json file.
This is the same .csv talkgroup file from Trunk Recorder... except the Hex column has been deleted
The columns for the file are: