nice
This commit is contained in:
parent
29eacb2578
commit
7875f21b4d
@ -13,11 +13,16 @@ class UsersConfig(AppConfig):
|
||||
# Only run when the server is actually starting
|
||||
if 'runserver' in sys.argv:
|
||||
try:
|
||||
# Import here to avoid issues during Django startup
|
||||
from .models import User
|
||||
from decouple import config
|
||||
from django.db import transaction
|
||||
|
||||
|
||||
# Don't create/synchronize the configured admin if another
|
||||
# superuser already exists.
|
||||
if User.objects.filter(is_superuser=True).exists():
|
||||
print('A superuser already exists; no admin user was created.')
|
||||
return
|
||||
|
||||
username = config('ADMIN_USERNAME', default='').strip()
|
||||
password = config('ADMIN_PASSWORD', default='')
|
||||
first_name = config('ADMIN_FIRST_NAME', default='').strip()
|
||||
@ -50,6 +55,7 @@ class UsersConfig(AppConfig):
|
||||
|
||||
action = 'created' if created else 'synchronized'
|
||||
print(f'Admin user "{username}" {action}.')
|
||||
|
||||
except Exception as e:
|
||||
# Don't fail the entire Django startup if there's an error
|
||||
print(f'Error creating admin user: {e}')
|
||||
|
||||
@ -8,7 +8,6 @@ import {
|
||||
SidebarFooter,
|
||||
SidebarGroup,
|
||||
SidebarGroupContent,
|
||||
SidebarGroupLabel,
|
||||
SidebarHeader,
|
||||
SidebarMenu,
|
||||
SidebarMenuButton,
|
||||
@ -86,6 +85,82 @@ const NavBar = () => {
|
||||
},
|
||||
];
|
||||
|
||||
/*
|
||||
* Hauteur d'une ligne de navigation.
|
||||
*
|
||||
* Le SidebarMenuButton natif fait 32px.
|
||||
* On lui donne une ligne de 48px et on le centre.
|
||||
*
|
||||
* Le header de groupe fait lui aussi 32px.
|
||||
* En mode plié, il est remplacé visuellement par
|
||||
* une séparation, mais conserve exactement ses 32px.
|
||||
*/
|
||||
const menuItemClass = 'h-12 min-h-12 flex items-center';
|
||||
|
||||
const buttonClass = `
|
||||
w-full
|
||||
h-8
|
||||
min-h-8
|
||||
group-data-[collapsible=icon]:size-8!
|
||||
group-data-[collapsible=icon]:p-2!
|
||||
`;
|
||||
|
||||
const linkClass = `
|
||||
flex
|
||||
h-full
|
||||
w-full
|
||||
items-center
|
||||
gap-2
|
||||
text-base
|
||||
`;
|
||||
|
||||
/*
|
||||
* Header de groupe :
|
||||
*
|
||||
* Déplié :
|
||||
* [ Navigation ] 32px
|
||||
*
|
||||
* Plié :
|
||||
* [ ---------------------- ] 32px
|
||||
*
|
||||
* Même hauteur dans les deux cas.
|
||||
*/
|
||||
const GroupHeader = ({ children }) => (
|
||||
<div
|
||||
className="
|
||||
flex
|
||||
h-8
|
||||
min-h-8
|
||||
w-full
|
||||
items-center
|
||||
px-2
|
||||
"
|
||||
>
|
||||
{/* Nom du groupe */}
|
||||
<span
|
||||
className="
|
||||
truncate
|
||||
text-lg
|
||||
font-medium
|
||||
group-data-[collapsible=icon]:hidden
|
||||
"
|
||||
>
|
||||
{children}
|
||||
</span>
|
||||
|
||||
{/* Séparation en mode plié */}
|
||||
<div
|
||||
className="
|
||||
hidden
|
||||
w-full
|
||||
border-t
|
||||
border-sidebar-border
|
||||
group-data-[collapsible=icon]:block
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<Sidebar
|
||||
className="border-0"
|
||||
@ -94,13 +169,18 @@ const NavBar = () => {
|
||||
onMouseLeave={handleMouseLeave}
|
||||
>
|
||||
{/* Logo / nom de la boulangerie */}
|
||||
<SidebarHeader>
|
||||
<SidebarHeader className="h-16 p-2 pl-0">
|
||||
<SidebarMenu>
|
||||
<SidebarMenuItem>
|
||||
<SidebarMenuItem className="h-12 flex items-center">
|
||||
<SidebarMenuButton
|
||||
size="lg"
|
||||
tooltip="Le Fournil du Bocage"
|
||||
onClick={handleCloseMenu}
|
||||
className="
|
||||
h-12
|
||||
w-full
|
||||
group-data-[collapsible=icon]:h-8!
|
||||
group-data-[collapsible=icon]:w-10!
|
||||
group-data-[collapsible=icon]:p-2!
|
||||
"
|
||||
render={
|
||||
<Link
|
||||
to="/"
|
||||
@ -126,12 +206,12 @@ const NavBar = () => {
|
||||
</SidebarMenu>
|
||||
</SidebarHeader>
|
||||
|
||||
{/* Navigation */}
|
||||
<SidebarContent>
|
||||
<SidebarGroup>
|
||||
<SidebarGroupLabel className="text-lg">
|
||||
{/* Navigation */}
|
||||
<SidebarGroup className="p-2">
|
||||
<GroupHeader>
|
||||
Navigation
|
||||
</SidebarGroupLabel>
|
||||
</GroupHeader>
|
||||
|
||||
<SidebarGroupContent>
|
||||
<SidebarMenu>
|
||||
@ -139,15 +219,18 @@ const NavBar = () => {
|
||||
const Icon = item.icon;
|
||||
|
||||
return (
|
||||
<SidebarMenuItem key={item.href}>
|
||||
<SidebarMenuItem
|
||||
key={item.href}
|
||||
className={menuItemClass}
|
||||
>
|
||||
<SidebarMenuButton
|
||||
tooltip={item.title}
|
||||
onClick={handleCloseMenu}
|
||||
className="w-full"
|
||||
className={buttonClass}
|
||||
render={
|
||||
<NavLink
|
||||
to={item.href}
|
||||
className="flex w-full items-center gap-2 text-base"
|
||||
className={linkClass}
|
||||
>
|
||||
<Icon className="size-6 shrink-0" />
|
||||
|
||||
@ -166,22 +249,22 @@ const NavBar = () => {
|
||||
|
||||
{/* Administration */}
|
||||
{user.is_admin && (
|
||||
<SidebarGroup>
|
||||
<SidebarGroupLabel className="text-lg">
|
||||
<SidebarGroup className="p-2">
|
||||
<GroupHeader>
|
||||
Administration
|
||||
</SidebarGroupLabel>
|
||||
</GroupHeader>
|
||||
|
||||
<SidebarGroupContent>
|
||||
<SidebarMenu>
|
||||
<SidebarMenuItem>
|
||||
<SidebarMenuItem className={menuItemClass}>
|
||||
<SidebarMenuButton
|
||||
tooltip="Comptes existants"
|
||||
onClick={handleCloseMenu}
|
||||
className="w-full"
|
||||
className={buttonClass}
|
||||
render={
|
||||
<NavLink
|
||||
to="/users"
|
||||
className="flex w-full items-center gap-2 text-base"
|
||||
className={linkClass}
|
||||
>
|
||||
<Users className="size-6 shrink-0" />
|
||||
|
||||
@ -201,16 +284,16 @@ const NavBar = () => {
|
||||
{/* Déconnexion */}
|
||||
<SidebarFooter>
|
||||
<SidebarMenu>
|
||||
<SidebarMenuItem>
|
||||
<SidebarMenuItem className={menuItemClass}>
|
||||
<SidebarMenuButton
|
||||
tooltip="Déconnexion"
|
||||
onClick={handleCloseMenu}
|
||||
className="w-full"
|
||||
className={buttonClass}
|
||||
render={
|
||||
<button
|
||||
type="button"
|
||||
onClick={logout}
|
||||
className="flex w-full items-center gap-2 text-base"
|
||||
className={linkClass}
|
||||
>
|
||||
<LogOut className="size-6 shrink-0" />
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user