diff --git a/front/src/App.js b/front/src/App.js
index 97904c7..28a7eab 100644
--- a/front/src/App.js
+++ b/front/src/App.js
@@ -6,6 +6,8 @@ import 'bootstrap/dist/css/bootstrap.min.css';
import DrivingSchools from './components/DrivingSchools.jsx';
import Categories from './components/Categories.jsx';
import OneDrivingSchool from './components/OneDrivingSchool.jsx';
+import CountStudInCategory from './components/CountStudInCategory.jsx';
+
function Router(props) {
return useRoutes(props.rootRoute);
}
@@ -17,6 +19,7 @@ function Router(props) {
{ path: '/drivingSchools', element: , label: 'Автошколы' },
{ path: '/students', element: , label: 'Студенты' },
{ path: '/categories', element: , label: 'Категории' },
+ { path: '/studcategory', element: , label: 'Количество студентов в категории' },
{ path: '/drivingSchool/:id', element: },
];
const links = routes.filter(route => route.hasOwnProperty('label'));
diff --git a/front/src/components/CatalogForGroup.jsx b/front/src/components/CatalogForGroup.jsx
new file mode 100644
index 0000000..629ab97
--- /dev/null
+++ b/front/src/components/CatalogForGroup.jsx
@@ -0,0 +1,12 @@
+import TableForGroup from "./commons/TableForGroup.jsx";
+// это абстрактный компонент для всех справочников
+export default function CatalogForGroup(props) {
+
+ return <>
+
{props.name}
+ >
+
+}
\ No newline at end of file
diff --git a/front/src/components/CatalogSC.jsx b/front/src/components/CatalogSC.jsx
new file mode 100644
index 0000000..972857f
--- /dev/null
+++ b/front/src/components/CatalogSC.jsx
@@ -0,0 +1,49 @@
+import Button from 'react-bootstrap/Button';
+import TableSC from "./commons/TableSC.jsx";
+import { useState} from 'react';
+import ModalForm from './commons/ModalForm.jsx';
+// это абстрактный компонент для всех справочников
+export default function CatalogSC(props) {
+ const [show, setShow] = useState(false);
+ const [modalTitle, setModalTitle] = useState("");
+
+ const handleClose = () => setShow(false);
+ const handleShow = () => setShow(true);
+
+
+ function handleAdd() {
+ setModalTitle("Добавление");
+ props.onBtnAdd();
+ handleShow();
+ }
+ function handleEdit(itemId) {
+ setModalTitle("Редактирование");
+ props.onEdit(itemId);
+ handleShow();
+ }
+ function handleRemove(item) {
+ props.onDelete(item);
+ }
+ function changeData(event) {
+ props.onFormChanged(event);
+ }
+
+ return <>
+
{props.name}
+
+
+ >
+
+}
\ No newline at end of file
diff --git a/front/src/components/Categories.jsx b/front/src/components/Categories.jsx
index bba6d16..57e701e 100644
--- a/front/src/components/Categories.jsx
+++ b/front/src/components/Categories.jsx
@@ -3,7 +3,7 @@ import Form from 'react-bootstrap/Form';
import Button from 'react-bootstrap/Button';
import { useState, useEffect } from 'react';
import DataService from '../services/DataService';
-import Catalog from "./Catalog.jsx";
+import CatalogSC from "./CatalogSC.jsx";
export default function Categories(props) {
@@ -94,7 +94,7 @@ export default function Categories(props) {
return
-
-
+
}
\ No newline at end of file
diff --git a/front/src/components/CountStudInCategory.jsx b/front/src/components/CountStudInCategory.jsx
new file mode 100644
index 0000000..418cd60
--- /dev/null
+++ b/front/src/components/CountStudInCategory.jsx
@@ -0,0 +1,37 @@
+import { useState, useEffect } from 'react';
+import DataService from '../services/DataService';
+import CatalogForGroup from "./CatalogForGroup.jsx";
+import { useNavigate } from "react-router-dom";
+import GroupedStudAndCategoryDto from "../models/GroupedStudAndCategoryDto";
+
+export default function CountStudInCategory(props) {
+
+ const headers = [
+ {name: 'categoryName', label: "Название"},
+ {name: 'studentsCount', label: "Студенты"},
+ ];
+
+ const nameCatalog = "Количество студентов в категории";
+
+ const url = '/categoryStudent/groupbycategory';
+
+ const [items, setItems] = useState([]);
+
+ useEffect(() => {
+ loadItems();
+ }, []);
+
+ function loadItems() {
+ DataService.readAll(url, (data) => new GroupedStudAndCategoryDto(data))
+ .then(data => setItems(data));
+ }
+
+ return
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/front/src/components/Students.jsx b/front/src/components/Students.jsx
index c13ab4e..b2c36f3 100644
--- a/front/src/components/Students.jsx
+++ b/front/src/components/Students.jsx
@@ -3,7 +3,7 @@ import Form from 'react-bootstrap/Form';
import Button from 'react-bootstrap/Button';
import { useState, useEffect } from 'react';
import DataService from '../services/DataService';
-import Catalog from "./Catalog.jsx";
+import CatalogSC from "./CatalogSC.jsx";
export default function Students(props) {
const headers = [
{name: 'surname', label: "Фамилия"},
@@ -101,7 +101,7 @@ export default function Students(props) {
return
-
-
+
}
\ No newline at end of file
diff --git a/front/src/components/commons/ItemTableForGroup.jsx b/front/src/components/commons/ItemTableForGroup.jsx
new file mode 100644
index 0000000..55a04cb
--- /dev/null
+++ b/front/src/components/commons/ItemTableForGroup.jsx
@@ -0,0 +1,8 @@
+export default function ItemTableForGroup(props) {
+
+ return
+ {
+ props.headers.map((header) =>
{props.item[header.name]}
)
+ }
+
+}
\ No newline at end of file
diff --git a/front/src/components/commons/ItemTableSC.jsx b/front/src/components/commons/ItemTableSC.jsx
new file mode 100644
index 0000000..4fec8bb
--- /dev/null
+++ b/front/src/components/commons/ItemTableSC.jsx
@@ -0,0 +1,18 @@
+import Button from 'react-bootstrap/Button';
+export default function ItemTableSC(props) {
+ function edit() {
+ props.onEdit(props.item.id);
+ }
+ function remove() {
+ props.onDelete(props.item.id);
+ }
+
+ return
+ {
+ props.headers.map((header) =>
{props.item[header.name]}
)
+ }
+ {props.isOnlyView ||
+
+
}
+
+}
\ No newline at end of file
diff --git a/front/src/components/commons/TableForGroup.jsx b/front/src/components/commons/TableForGroup.jsx
new file mode 100644
index 0000000..bbfd7df
--- /dev/null
+++ b/front/src/components/commons/TableForGroup.jsx
@@ -0,0 +1,26 @@
+import ItemTableForGroup from './ItemTableForGroup';
+
+export default function TableForGroup(props) {
+
+ return