diff --git a/backend/core/settings.py b/backend/core/settings.py
index d6b46a9..705f6d7 100644
--- a/backend/core/settings.py
+++ b/backend/core/settings.py
@@ -126,7 +126,9 @@ STATIC_URL = 'static/'
# CORS configuration
CORS_ALLOWED_ORIGINS = [
"http://localhost:1028",
- "http://127.0.0.1:1028"
+ "http://127.0.0.1:1028",
+ "http://192.168.1.19:1028",
+ "https://boulangerie.louismazin.ovh"
]
# REST Framework & JWT settings
diff --git a/backend/users/serializers.py b/backend/users/serializers.py
index ae7aaa4..0691dee 100644
--- a/backend/users/serializers.py
+++ b/backend/users/serializers.py
@@ -11,7 +11,8 @@ class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
- fields = ['id', 'username', 'email', 'first_name', 'last_name', 'is_admin', 'date_joined']
+
+ fields = ['id', 'username', 'first_name', 'last_name', 'is_admin', 'date_joined']
def get_is_admin(self, obj):
return obj.is_superuser or obj.is_staff
@@ -23,7 +24,8 @@ class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
- fields = ['username', 'password', 'email', 'first_name', 'last_name', 'invite']
+
+ fields = ['username', 'password', 'first_name', 'last_name', 'invite']
def validate_invite(self, value):
try:
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 264fec1..2887fa1 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -8,6 +8,7 @@
"name": "app",
"version": "0.0.0",
"dependencies": {
+ "@zxing/browser": "^0.2.1",
"axios": "^1.20.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
@@ -666,6 +667,41 @@
}
}
},
+ "node_modules/@zxing/browser": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@zxing/browser/-/browser-0.2.1.tgz",
+ "integrity": "sha512-92pVfVDUXbc15xu9vIEmhNyqIEASMEkDF92CwT6T+7sg2EHXJRktH9CQKoQSXe51UtbNsj+Fm09H/JBWHMs/Sw==",
+ "license": "MIT",
+ "optionalDependencies": {
+ "@zxing/text-encoding": "^0.9.0"
+ },
+ "peerDependencies": {
+ "@zxing/library": "^0.23.0"
+ }
+ },
+ "node_modules/@zxing/library": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.23.0.tgz",
+ "integrity": "sha512-6fkkoFwP8CHxl6ugnPsj74PLJgX2iRv5zczGAyt5OBzQgxFhuhF0NCEc4t4OvSr8xAv2MRLlI0Iu9ZGDZQ2urA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "ts-custom-error": "^3.3.1"
+ },
+ "engines": {
+ "node": ">= 24.0.0"
+ },
+ "optionalDependencies": {
+ "@zxing/text-encoding": "~0.9.0"
+ }
+ },
+ "node_modules/@zxing/text-encoding": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz",
+ "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==",
+ "license": "(Unlicense OR Apache-2.0)",
+ "optional": true
+ },
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -1570,6 +1606,16 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
+ "node_modules/ts-custom-error": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz",
+ "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/vite": {
"version": "8.2.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 68d0035..bbfb98c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
+ "@zxing/browser": "^0.2.1",
"axios": "^1.20.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
diff --git a/frontend/src/App.css b/frontend/src/App.css
index 18ecc92..4eb4b64 100644
--- a/frontend/src/App.css
+++ b/frontend/src/App.css
@@ -5,13 +5,14 @@
}
main {
- width: min(1120px, 100%);
+ width: min(var(--content-max), 100%);
flex: 1;
margin: 0 auto;
- padding: 2.5rem 1.5rem 4rem;
+ padding: 2rem clamp(1.25rem, 3vw, 2.75rem);
}
footer {
+ flex-shrink: 0;
padding: 1.5rem;
color: var(--text-muted);
font-size: 0.85rem;
@@ -176,10 +177,20 @@ form {
}
.card {
- max-width: 900px;
+ width: 100%;
+ max-width: var(--content-max);
margin: 0 auto;
}
+.admin-page,
+.weekly-summary-page,
+.time-clock-page,
+.profile-card,
+.home-container {
+ width: 100%;
+ max-width: var(--content-max);
+}
+
.card h2,
.profile-card h2 {
margin: 0 0 1.5rem;
@@ -294,7 +305,7 @@ tbody tr:hover {
@media (max-width: 700px) {
main {
- padding: 1.25rem 1rem 2.5rem;
+ padding: 1.25rem 1rem;
}
.table-responsive {
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index 72d1730..7932070 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -5,7 +5,6 @@ import ProtectedRoute from './components/ProtectedRoute';
import AdminRoute from './components/AdminRoute';
import Header from './components/Header';
import AdminUsersPage from './pages/AdminUsersPage';
-import AdminInvitePage from './pages/AdminInvitePage';
import RegisterPage from './pages/RegisterPage';
import TimeClockPage from './pages/TimeClockPage';
import WeeklySummaryPage from './pages/WeeklySummaryPage';
@@ -37,11 +36,6 @@ function App() {
Emploi du temps hebdomadaire
-
| Utilisateur | }Date | Entrée | Sortie | Durée | -Actions | + {isAdmin &&Actions | }|
|---|---|---|---|---|---|---|---|
| {entry.user} | + }{formatDate(entry.date)} | {formatTime(entry.start_time)} | {formatTime(entry.end_time)} | -{entry.duration ? `${entry.duration.toFixed(2)}h` : '0.00h'} | -
-
-
- |
+ {formatDuration(entry.duration)} | + {isAdmin && +
+
+
+ |
+ }