mirror of
https://github.com/openmhz/trunk-server.git
synced 2026-11-13 17:27:37 -05:00
Add All Systems List
This commit is contained in:
@@ -3,6 +3,7 @@ const System = require("../models/system");
|
|||||||
const SystemStat = require("../models/system_stat");
|
const SystemStat = require("../models/system_stat");
|
||||||
const Talkgroup = require("../models/talkgroup");
|
const Talkgroup = require("../models/talkgroup");
|
||||||
const Group = require("../models/group");
|
const Group = require("../models/group");
|
||||||
|
const User = require("../models/user");
|
||||||
const crypto = require("crypto");
|
const crypto = require("crypto");
|
||||||
|
|
||||||
exports.isLoggedIn = function (req, res, next) {
|
exports.isLoggedIn = function (req, res, next) {
|
||||||
@@ -12,6 +13,27 @@ exports.isLoggedIn = function (req, res, next) {
|
|||||||
|
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
|
exports.listUserSystems = async function (req,res,next) {
|
||||||
|
if (!req.user.admin) {
|
||||||
|
res.status(401);
|
||||||
|
res.json({ success: false, message: "Not Authorized" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const users = await User.find({}, "_id email firstName lastName lastLogin");
|
||||||
|
let list = [];
|
||||||
|
console.log(users);
|
||||||
|
for (let index = 0; index < users.length; index++) {
|
||||||
|
let user = users[index].toObject();
|
||||||
|
const userId = new mongoose.Types.ObjectId(user._id);
|
||||||
|
const systems = await System.find({ userId: userId }, "name shortName description systemType city state county country lastActive");
|
||||||
|
|
||||||
|
user["systems"] = systems;
|
||||||
|
list.push(user);
|
||||||
|
}
|
||||||
|
res.json(list);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
exports.listAllSystems = async function (req, res, next) {
|
exports.listAllSystems = async function (req, res, next) {
|
||||||
if (!req.user.admin) {
|
if (!req.user.admin) {
|
||||||
res.status(401);
|
res.status(401);
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ app.get("/groups/:shortName/:groupId?", isLoggedIn, groups.getGroups);
|
|||||||
app.delete("/groups/:shortName/:groupId", isLoggedIn, groups.deleteGroup);
|
app.delete("/groups/:shortName/:groupId", isLoggedIn, groups.deleteGroup);
|
||||||
app.get("/systems", isLoggedIn, systems.listSystems)
|
app.get("/systems", isLoggedIn, systems.listSystems)
|
||||||
app.get("/admin/systems", isAdmin, systems.listAllSystems)
|
app.get("/admin/systems", isAdmin, systems.listAllSystems)
|
||||||
|
app.get("/admin/users", isAdmin, systems.listUserSystems)
|
||||||
app.delete("/systems/:shortName", isLoggedIn, systems.deleteSystem)
|
app.delete("/systems/:shortName", isLoggedIn, systems.deleteSystem)
|
||||||
app.post("/systems/:shortName", [isLoggedIn, systems.ownSystem, systems.validateSystem, systems.updateSystem])
|
app.post("/systems/:shortName", [isLoggedIn, systems.ownSystem, systems.validateSystem, systems.updateSystem])
|
||||||
app.post("/systems", [isLoggedIn, systems.uniqueShortName, systems.validateSystem, systems.createSystem])
|
app.post("/systems", [isLoggedIn, systems.uniqueShortName, systems.validateSystem, systems.createSystem])
|
||||||
|
|||||||
@@ -1,19 +1,17 @@
|
|||||||
import {
|
import {
|
||||||
Container,
|
Container,
|
||||||
Divider,
|
|
||||||
Header,
|
Header,
|
||||||
Table
|
Table,
|
||||||
|
Icon
|
||||||
} from "semantic-ui-react";
|
} from "semantic-ui-react";
|
||||||
import { useGetAllSystemsQuery, } from '../features/api/apiSlice'
|
import { useGetAllSystemsQuery, } from '../features/api/apiSlice'
|
||||||
|
import SystemRow from "./SystemRow";
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
const ListSystems = () => {
|
const AllSystems = () => {
|
||||||
const { data, isSuccess } = useGetAllSystemsQuery();
|
const { data: users, isSuccess } = useGetAllSystemsQuery();
|
||||||
let systems = false;
|
|
||||||
if (isSuccess) {
|
|
||||||
systems = data.systems;
|
|
||||||
}
|
|
||||||
|
|
||||||
//https://stackoverflow.com/questions/36559661/how-can-i-dispatch-from-child-components-in-react-redux
|
//https://stackoverflow.com/questions/36559661/how-can-i-dispatch-from-child-components-in-react-redux
|
||||||
//https://stackoverflow.com/questions/42597602/react-onclick-pass-event-with-parameter
|
//https://stackoverflow.com/questions/42597602/react-onclick-pass-event-with-parameter
|
||||||
@@ -24,29 +22,36 @@ const ListSystems = () => {
|
|||||||
<Header as="h1">Radio Systems</Header>
|
<Header as="h1">Radio Systems</Header>
|
||||||
|
|
||||||
|
|
||||||
{systems &&
|
{users &&
|
||||||
systems.map((system) =>
|
users.map((user) =>
|
||||||
<Table celled selectable>
|
|
||||||
|
<Container key={user.email}>
|
||||||
|
<Header as='h2'>
|
||||||
|
<Icon name='user' />
|
||||||
|
<Header.Content>
|
||||||
|
{user.firstName} {user.lastName}
|
||||||
|
<Header.Subheader><a href={`mailto:${user.email}`}>{user.email}</a></Header.Subheader>
|
||||||
|
</Header.Content>
|
||||||
|
</Header>
|
||||||
|
<Table celled selectable>
|
||||||
<Table.Header>
|
<Table.Header>
|
||||||
<Table.Row>
|
<Table.Row>
|
||||||
<Table.HeaderCell>ShortName</Table.HeaderCell>
|
<Table.HeaderCell>ShortName</Table.HeaderCell>
|
||||||
<Table.HeaderCell>Name</Table.HeaderCell>
|
<Table.HeaderCell>Name</Table.HeaderCell>
|
||||||
|
<Table.HeaderCell>Description</Table.HeaderCell>
|
||||||
|
<Table.HeaderCell>Location</Table.HeaderCell>
|
||||||
<Table.HeaderCell>Last Active</Table.HeaderCell>
|
<Table.HeaderCell>Last Active</Table.HeaderCell>
|
||||||
<Table.HeaderCell>Owner</Table.HeaderCell>
|
|
||||||
<Table.HeaderCell>Email</Table.HeaderCell>
|
|
||||||
</Table.Row>
|
</Table.Row>
|
||||||
</Table.Header>
|
</Table.Header>
|
||||||
|
|
||||||
<Table.Body>
|
<Table.Body>
|
||||||
<Table.Row>
|
{user.systems &&
|
||||||
<Table.Cell>{system.shortName}</Table.Cell>
|
user.systems.map((system) =>
|
||||||
<Table.Cell>{system.name}</Table.Cell>
|
<SystemRow key={system.shortName} system={system}/>
|
||||||
<Table.Cell>{system.lastActive}</Table.Cell>
|
)}
|
||||||
<Table.Cell>{system.userId.firstName} {system.userId.lastName}</Table.Cell>
|
</Table.Body>
|
||||||
<Table.Cell>{system.userId.email}</Table.Cell>
|
</Table>
|
||||||
</Table.Row>
|
</Container>
|
||||||
</Table.Body>
|
|
||||||
</Table>
|
|
||||||
)}
|
)}
|
||||||
|
|
||||||
</Container>
|
</Container>
|
||||||
@@ -55,4 +60,4 @@ const ListSystems = () => {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ListSystems;
|
export default AllSystems;
|
||||||
|
|||||||
49
admin/src/AllSystems/SystemRow.js
Normal file
49
admin/src/AllSystems/SystemRow.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import {
|
||||||
|
Container,
|
||||||
|
Header,
|
||||||
|
Table,
|
||||||
|
Icon
|
||||||
|
} from "semantic-ui-react";
|
||||||
|
|
||||||
|
|
||||||
|
const SystemRow = (props) => {
|
||||||
|
const { system } = props;
|
||||||
|
var location = "";
|
||||||
|
let lastActive = "";
|
||||||
|
if (system.lastActive) {
|
||||||
|
lastActive = new Date(system.lastActive).toLocaleDateString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (system) {
|
||||||
|
|
||||||
|
|
||||||
|
switch (system.systemType) {
|
||||||
|
case "state":
|
||||||
|
location = system.state;
|
||||||
|
break;
|
||||||
|
case "city":
|
||||||
|
location = system.city + ", " + system.state;
|
||||||
|
break;
|
||||||
|
case "county":
|
||||||
|
location = system.county + ", " + system.state;
|
||||||
|
break;
|
||||||
|
case "international":
|
||||||
|
location = system.country;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
location = "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Table.Row key={system.shortName}>
|
||||||
|
<Table.Cell>{system.shortName}</Table.Cell>
|
||||||
|
<Table.Cell>{system.name}</Table.Cell>
|
||||||
|
<Table.Cell>{system.description}</Table.Cell>
|
||||||
|
<Table.Cell>{location}</Table.Cell>
|
||||||
|
<Table.Cell>{lastActive}</Table.Cell>
|
||||||
|
</Table.Row>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SystemRow;
|
||||||
@@ -5,6 +5,7 @@ import {AdminRestricted, Restricted} from "./Restricted"
|
|||||||
|
|
||||||
import About from "../Components/About"
|
import About from "../Components/About"
|
||||||
import System from "../System/System"
|
import System from "../System/System"
|
||||||
|
import AllSystems from "../AllSystems/AllSystems"
|
||||||
import ListSystems from "../System/ListSystems"
|
import ListSystems from "../System/ListSystems"
|
||||||
import UpdateSystem from "../System/UpdateSystem"
|
import UpdateSystem from "../System/UpdateSystem"
|
||||||
import CreateSystem from "../System/CreateSystem"
|
import CreateSystem from "../System/CreateSystem"
|
||||||
@@ -20,7 +21,7 @@ const App = (params) => {
|
|||||||
<Route path="/update-system/:shortName" element={ <Restricted><UpdateSystem/></Restricted>} />
|
<Route path="/update-system/:shortName" element={ <Restricted><UpdateSystem/></Restricted>} />
|
||||||
<Route path="/create-system" element={ <Restricted><CreateSystem/></Restricted>} />
|
<Route path="/create-system" element={ <Restricted><CreateSystem/></Restricted>} />
|
||||||
<Route path="/list-systems" element={ <Restricted><ListSystems/></Restricted>} />
|
<Route path="/list-systems" element={ <Restricted><ListSystems/></Restricted>} />
|
||||||
<Route path="/all-systems" element={ <AdminRestricted><ListSystems/></AdminRestricted>} />
|
<Route path="/all-systems" element={ <AdminRestricted><AllSystems/></AdminRestricted>} />
|
||||||
<Route path="/" element={ <Restricted><ListSystems/></Restricted>} />
|
<Route path="/" element={ <Restricted><ListSystems/></Restricted>} />
|
||||||
<Route render={() => (<div>Miss</div>)} />
|
<Route render={() => (<div>Miss</div>)} />
|
||||||
</Routes>
|
</Routes>
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ export const apiSlice = createApi({
|
|||||||
}),
|
}),
|
||||||
getAllSystems: builder.query({
|
getAllSystems: builder.query({
|
||||||
// The URL for the request is '/fakeApi/posts'
|
// The URL for the request is '/fakeApi/posts'
|
||||||
query: () => ({ url: `/admin/systems`, credentials: "include" })
|
query: () => ({ url: `/admin/users`, credentials: "include" })
|
||||||
}),
|
}),
|
||||||
createSystem: builder.mutation({
|
createSystem: builder.mutation({
|
||||||
query: (system) => ({
|
query: (system) => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user