create-steve-rogers 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/SFMS/.env +9 -0
- package/apps/SFMS/README.md +0 -0
- package/apps/SFMS/backend/.env +9 -0
- package/apps/SFMS/backend/.env.example +9 -0
- package/apps/SFMS/backend/package-lock.json +1580 -0
- package/apps/SFMS/backend/package.json +23 -0
- package/apps/SFMS/backend/src/config/database.js +7 -0
- package/apps/SFMS/backend/src/config/env.js +35 -0
- package/apps/SFMS/backend/src/middleware/authMiddleware.js +32 -0
- package/apps/SFMS/backend/src/models/Payment.js +12 -0
- package/apps/SFMS/backend/src/models/Student.js +12 -0
- package/apps/SFMS/backend/src/models/User.js +13 -0
- package/apps/SFMS/backend/src/routes/authRoutes.js +93 -0
- package/apps/SFMS/backend/src/routes/paymentRoutes.js +117 -0
- package/apps/SFMS/backend/src/routes/reportRoutes.js +59 -0
- package/apps/SFMS/backend/src/routes/studentRoutes.js +79 -0
- package/apps/SFMS/backend/src/server.js +34 -0
- package/apps/SFMS/frontend/.env.example +8 -0
- package/apps/SFMS/frontend/dist/assets/index-B08X8imN.css +1 -0
- package/apps/SFMS/frontend/dist/assets/index-DVO0_wcb.js +67 -0
- package/apps/SFMS/frontend/dist/favicon.svg +4 -0
- package/apps/SFMS/frontend/dist/index.html +20 -0
- package/apps/SFMS/frontend/index.html +19 -0
- package/apps/SFMS/frontend/package-lock.json +2667 -0
- package/apps/SFMS/frontend/package.json +23 -0
- package/apps/SFMS/frontend/postcss.config.js +6 -0
- package/apps/SFMS/frontend/public/favicon.svg +4 -0
- package/apps/SFMS/frontend/src/App.jsx +41 -0
- package/apps/SFMS/frontend/src/api/apiClient.js +41 -0
- package/apps/SFMS/frontend/src/components/AppLayout.jsx +60 -0
- package/apps/SFMS/frontend/src/context/AuthContext.jsx +79 -0
- package/apps/SFMS/frontend/src/index.css +229 -0
- package/apps/SFMS/frontend/src/main.jsx +16 -0
- package/apps/SFMS/frontend/src/pages/DashboardPage.jsx +82 -0
- package/apps/SFMS/frontend/src/pages/LoginPage.jsx +142 -0
- package/apps/SFMS/frontend/src/pages/PaymentsPage.jsx +269 -0
- package/apps/SFMS/frontend/src/pages/ReportsPage.jsx +114 -0
- package/apps/SFMS/frontend/src/pages/StudentsPage.jsx +257 -0
- package/apps/SFMS/frontend/tailwind.config.js +21 -0
- package/apps/SFMS/frontend/vite.config.js +35 -0
- package/apps/SIMS/.env +4 -0
- package/apps/SIMS/README.md +138 -0
- package/apps/SIMS/backend/.env +4 -0
- package/apps/SIMS/backend/.env.example +4 -0
- package/apps/SIMS/backend/package-lock.json +1600 -0
- package/apps/SIMS/backend/package.json +22 -0
- package/apps/SIMS/backend/src/config/db.js +9 -0
- package/apps/SIMS/backend/src/controllers/authController.js +93 -0
- package/apps/SIMS/backend/src/controllers/simsReportController.js +94 -0
- package/apps/SIMS/backend/src/controllers/sparePartController.js +41 -0
- package/apps/SIMS/backend/src/controllers/stockInController.js +45 -0
- package/apps/SIMS/backend/src/controllers/stockOutController.js +123 -0
- package/apps/SIMS/backend/src/middleware/auth.js +8 -0
- package/apps/SIMS/backend/src/models/SparePart.js +17 -0
- package/apps/SIMS/backend/src/models/StockIn.js +16 -0
- package/apps/SIMS/backend/src/models/StockOut.js +18 -0
- package/apps/SIMS/backend/src/models/User.js +11 -0
- package/apps/SIMS/backend/src/routes/authRoutes.js +12 -0
- package/apps/SIMS/backend/src/routes/simsReportRoutes.js +8 -0
- package/apps/SIMS/backend/src/routes/sparePartRoutes.js +8 -0
- package/apps/SIMS/backend/src/routes/stockInRoutes.js +8 -0
- package/apps/SIMS/backend/src/routes/stockOutRoutes.js +10 -0
- package/apps/SIMS/backend/src/server.js +62 -0
- package/apps/SIMS/backend/src/utils/passwordPolicy.js +10 -0
- package/apps/SIMS/backend/src/utils/sparePartHelpers.js +5 -0
- package/apps/SIMS/frontend/dist/assets/index-3hv-vGL2.css +2 -0
- package/apps/SIMS/frontend/dist/assets/index-T8XT7M6y.js +19 -0
- package/apps/SIMS/frontend/dist/index.html +14 -0
- package/apps/SIMS/frontend/index.html +13 -0
- package/apps/SIMS/frontend/package-lock.json +3053 -0
- package/apps/SIMS/frontend/package.json +31 -0
- package/apps/SIMS/frontend/src/App.jsx +112 -0
- package/apps/SIMS/frontend/src/api/authApi.js +7 -0
- package/apps/SIMS/frontend/src/api/client.js +8 -0
- package/apps/SIMS/frontend/src/api/simsReportApi.js +5 -0
- package/apps/SIMS/frontend/src/api/sparePartsApi.js +4 -0
- package/apps/SIMS/frontend/src/api/stockInApi.js +4 -0
- package/apps/SIMS/frontend/src/api/stockOutApi.js +6 -0
- package/apps/SIMS/frontend/src/api/usersApi.js +3 -0
- package/apps/SIMS/frontend/src/components/AppLayout.jsx +60 -0
- package/apps/SIMS/frontend/src/index.css +737 -0
- package/apps/SIMS/frontend/src/main.jsx +13 -0
- package/apps/SIMS/frontend/src/pages/DashboardPage.jsx +179 -0
- package/apps/SIMS/frontend/src/pages/LoginPage.jsx +75 -0
- package/apps/SIMS/frontend/src/pages/RegisterPage.jsx +78 -0
- package/apps/SIMS/frontend/src/pages/ReportsPage.jsx +108 -0
- package/apps/SIMS/frontend/src/pages/ResetPasswordPage.jsx +75 -0
- package/apps/SIMS/frontend/src/pages/SparePartPage.jsx +128 -0
- package/apps/SIMS/frontend/src/pages/StockInPage.jsx +100 -0
- package/apps/SIMS/frontend/src/pages/StockOutPage.jsx +206 -0
- package/apps/SIMS/frontend/src/utils/passwordPolicy.js +8 -0
- package/apps/SIMS/frontend/vite.config.js +8 -0
- package/apps/config.js +13 -0
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sims-frontend",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "vite build",
|
|
9
|
+
"lint": "eslint .",
|
|
10
|
+
"preview": "vite preview"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@tailwindcss/vite": "^4.2.4",
|
|
14
|
+
"axios": "^1.15.2",
|
|
15
|
+
"react": "^19.2.5",
|
|
16
|
+
"react-dom": "^19.2.5",
|
|
17
|
+
"react-router-dom": "^7.14.2",
|
|
18
|
+
"tailwindcss": "^4.2.4"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@eslint/js": "^10.0.1",
|
|
22
|
+
"@types/react": "^19.2.14",
|
|
23
|
+
"@types/react-dom": "^19.2.3",
|
|
24
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
25
|
+
"eslint": "^10.2.0",
|
|
26
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
27
|
+
"eslint-plugin-react-refresh": "^0.5.2",
|
|
28
|
+
"globals": "^17.5.0",
|
|
29
|
+
"vite": "^8.0.10"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { Navigate, Route, Routes } from "react-router-dom";
|
|
3
|
+
import AppLayout from "./components/AppLayout";
|
|
4
|
+
import LoginPage from "./pages/LoginPage";
|
|
5
|
+
import RegisterPage from "./pages/RegisterPage";
|
|
6
|
+
import ResetPasswordPage from "./pages/ResetPasswordPage";
|
|
7
|
+
import DashboardPage from "./pages/DashboardPage";
|
|
8
|
+
import SparePartPage from "./pages/SparePartPage";
|
|
9
|
+
import StockInPage from "./pages/StockInPage";
|
|
10
|
+
import StockOutPage from "./pages/StockOutPage";
|
|
11
|
+
import ReportsPage from "./pages/ReportsPage";
|
|
12
|
+
import { fetchCurrentUser, logoutUser } from "./api/authApi";
|
|
13
|
+
|
|
14
|
+
function ProtectedLayout({ isAuthenticated, username, onLogout }) {
|
|
15
|
+
if (!isAuthenticated) {
|
|
16
|
+
return <Navigate to="/login" replace />;
|
|
17
|
+
}
|
|
18
|
+
return <AppLayout onLogout={onLogout} username={username} />;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function PublicRoute({ isAuthenticated, children }) {
|
|
22
|
+
if (isAuthenticated) {
|
|
23
|
+
return <Navigate to="/dashboard" replace />;
|
|
24
|
+
}
|
|
25
|
+
return children;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function App() {
|
|
29
|
+
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
|
30
|
+
const [username, setUsername] = useState("");
|
|
31
|
+
const [loading, setLoading] = useState(true);
|
|
32
|
+
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
(async () => {
|
|
35
|
+
try {
|
|
36
|
+
const r = await fetchCurrentUser();
|
|
37
|
+
setIsAuthenticated(true);
|
|
38
|
+
setUsername(r.data.username);
|
|
39
|
+
} catch {
|
|
40
|
+
setIsAuthenticated(false);
|
|
41
|
+
} finally {
|
|
42
|
+
setLoading(false);
|
|
43
|
+
}
|
|
44
|
+
})();
|
|
45
|
+
}, []);
|
|
46
|
+
|
|
47
|
+
const handleLogout = async () => {
|
|
48
|
+
await logoutUser();
|
|
49
|
+
setIsAuthenticated(false);
|
|
50
|
+
setUsername("");
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
if (loading) {
|
|
54
|
+
return <div className="p-8 text-center text-slate-600">Checking session…</div>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<Routes>
|
|
59
|
+
<Route
|
|
60
|
+
path="/login"
|
|
61
|
+
element={
|
|
62
|
+
<PublicRoute isAuthenticated={isAuthenticated}>
|
|
63
|
+
<LoginPage
|
|
64
|
+
onLoginSuccess={(name) => {
|
|
65
|
+
setIsAuthenticated(true);
|
|
66
|
+
setUsername(name);
|
|
67
|
+
}}
|
|
68
|
+
/>
|
|
69
|
+
</PublicRoute>
|
|
70
|
+
}
|
|
71
|
+
/>
|
|
72
|
+
<Route
|
|
73
|
+
path="/register"
|
|
74
|
+
element={
|
|
75
|
+
<PublicRoute isAuthenticated={isAuthenticated}>
|
|
76
|
+
<RegisterPage />
|
|
77
|
+
</PublicRoute>
|
|
78
|
+
}
|
|
79
|
+
/>
|
|
80
|
+
<Route
|
|
81
|
+
path="/reset-password"
|
|
82
|
+
element={
|
|
83
|
+
<PublicRoute isAuthenticated={isAuthenticated}>
|
|
84
|
+
<ResetPasswordPage />
|
|
85
|
+
</PublicRoute>
|
|
86
|
+
}
|
|
87
|
+
/>
|
|
88
|
+
<Route
|
|
89
|
+
element={
|
|
90
|
+
<ProtectedLayout
|
|
91
|
+
isAuthenticated={isAuthenticated}
|
|
92
|
+
username={username}
|
|
93
|
+
onLogout={handleLogout}
|
|
94
|
+
/>
|
|
95
|
+
}
|
|
96
|
+
>
|
|
97
|
+
<Route path="/dashboard" element={<DashboardPage />} />
|
|
98
|
+
<Route path="/spare-part" element={<SparePartPage />} />
|
|
99
|
+
<Route path="/stock-in" element={<StockInPage />} />
|
|
100
|
+
<Route path="/stock-out" element={<StockOutPage />} />
|
|
101
|
+
<Route path="/reports" element={<ReportsPage />} />
|
|
102
|
+
<Route path="/" element={<Navigate to="/dashboard" replace />} />
|
|
103
|
+
</Route>
|
|
104
|
+
<Route
|
|
105
|
+
path="*"
|
|
106
|
+
element={<Navigate to={isAuthenticated ? "/dashboard" : "/login"} replace />}
|
|
107
|
+
/>
|
|
108
|
+
</Routes>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export default App;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import api from "./client";
|
|
2
|
+
|
|
3
|
+
export const registerUser = (payload) => api.post("/auth/register", payload);
|
|
4
|
+
export const loginUser = (payload) => api.post("/auth/login", payload);
|
|
5
|
+
export const recoverPassword = (payload) => api.post("/auth/recover", payload);
|
|
6
|
+
export const logoutUser = () => api.post("/auth/logout");
|
|
7
|
+
export const fetchCurrentUser = () => api.get("/auth/me");
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import api from "./client";
|
|
2
|
+
|
|
3
|
+
export const getStockOut = () => api.get("/stock-out");
|
|
4
|
+
export const createStockOut = (payload) => api.post("/stock-out", payload);
|
|
5
|
+
export const updateStockOut = (id, payload) => api.put(`/stock-out/${id}`, payload);
|
|
6
|
+
export const deleteStockOut = (id) => api.delete(`/stock-out/${id}`);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Link, NavLink, Outlet } from "react-router-dom";
|
|
2
|
+
|
|
3
|
+
function AppLayout({ onLogout, username }) {
|
|
4
|
+
const linkClass = ({ isActive }) => `app-nav-link ${isActive ? "app-nav-link-active" : ""}`;
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
<div className="app-shell">
|
|
8
|
+
<aside className="app-sidebar">
|
|
9
|
+
<div className="app-brand-block">
|
|
10
|
+
<Link to="/spare-part" className="app-brand">
|
|
11
|
+
<span className="app-brand-mark">SI</span>
|
|
12
|
+
<span>
|
|
13
|
+
<span className="app-brand-name">SIMS</span>
|
|
14
|
+
<span className="app-brand-caption">Inventory console</span>
|
|
15
|
+
</span>
|
|
16
|
+
</Link>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<nav className="app-nav" aria-label="Main navigation">
|
|
20
|
+
<NavLink to="/dashboard" className={linkClass}>
|
|
21
|
+
<span className="app-nav-icon">00</span>
|
|
22
|
+
Dashboard
|
|
23
|
+
</NavLink>
|
|
24
|
+
<NavLink to="/spare-part" className={linkClass}>
|
|
25
|
+
<span className="app-nav-icon">01</span>
|
|
26
|
+
Spare Part
|
|
27
|
+
</NavLink>
|
|
28
|
+
<NavLink to="/stock-in" className={linkClass}>
|
|
29
|
+
<span className="app-nav-icon">02</span>
|
|
30
|
+
Stock In
|
|
31
|
+
</NavLink>
|
|
32
|
+
<NavLink to="/stock-out" className={linkClass}>
|
|
33
|
+
<span className="app-nav-icon">03</span>
|
|
34
|
+
Stock Out
|
|
35
|
+
</NavLink>
|
|
36
|
+
<NavLink to="/reports" className={linkClass}>
|
|
37
|
+
<span className="app-nav-icon">04</span>
|
|
38
|
+
Reports
|
|
39
|
+
</NavLink>
|
|
40
|
+
</nav>
|
|
41
|
+
|
|
42
|
+
<div className="app-sidebar-footer">
|
|
43
|
+
<div className="app-user">
|
|
44
|
+
<span className="app-user-label">Signed in</span>
|
|
45
|
+
<strong>{username}</strong>
|
|
46
|
+
</div>
|
|
47
|
+
<button type="button" onClick={onLogout} className="app-logout">
|
|
48
|
+
Logout
|
|
49
|
+
</button>
|
|
50
|
+
</div>
|
|
51
|
+
</aside>
|
|
52
|
+
|
|
53
|
+
<main className="app-main">
|
|
54
|
+
<Outlet />
|
|
55
|
+
</main>
|
|
56
|
+
</div>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default AppLayout;
|