Compare commits

..

1 Commits

Author SHA1 Message Date
Owen Schwartz
418e099804 Merge pull request #2521 from fosrl/dev
1.15.4-s.6
2026-02-22 21:13:51 -08:00
16 changed files with 85 additions and 73 deletions

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Контрол на достъпа, базиран на потребители и роли", "resourcesUsersRolesAccess": "Контрол на достъпа, базиран на потребители и роли",
"resourcesErrorUpdate": "Неуспешно превключване на ресурса", "resourcesErrorUpdate": "Неуспешно превключване на ресурса",
"resourcesErrorUpdateDescription": "Възникна грешка при актуализиране на ресурса", "resourcesErrorUpdateDescription": "Възникна грешка при актуализиране на ресурса",
"access": "Access", "access": "Достъп",
"accessControl": "Контрол на достъпа",
"shareLink": "{resource} Сподели връзка", "shareLink": "{resource} Сподели връзка",
"resourceSelect": "Изберете ресурс", "resourceSelect": "Изберете ресурс",
"shareLinks": "Споделени връзки", "shareLinks": "Споделени връзки",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "О, не! Страницата, която търсите, не съществува.", "pageNotFoundDescription": "О, не! Страницата, която търсите, не съществува.",
"overview": "Общ преглед", "overview": "Общ преглед",
"home": "Начало", "home": "Начало",
"accessControl": "Контрол на достъпа",
"settings": "Настройки", "settings": "Настройки",
"usersAll": "Всички потребители", "usersAll": "Всички потребители",
"license": "Лиценз", "license": "Лиценз",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Kontrola přístupu na základě uživatelů a rolí", "resourcesUsersRolesAccess": "Kontrola přístupu na základě uživatelů a rolí",
"resourcesErrorUpdate": "Nepodařilo se přepnout zdroj", "resourcesErrorUpdate": "Nepodařilo se přepnout zdroj",
"resourcesErrorUpdateDescription": "Došlo k chybě při aktualizaci zdroje", "resourcesErrorUpdateDescription": "Došlo k chybě při aktualizaci zdroje",
"access": "Access", "access": "Přístup",
"accessControl": "Kontrola přístupu",
"shareLink": "{resource} Sdílet odkaz", "shareLink": "{resource} Sdílet odkaz",
"resourceSelect": "Vyberte zdroj", "resourceSelect": "Vyberte zdroj",
"shareLinks": "Sdílet odkazy", "shareLinks": "Sdílet odkazy",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Jejda! Stránka, kterou hledáte, neexistuje.", "pageNotFoundDescription": "Jejda! Stránka, kterou hledáte, neexistuje.",
"overview": "Přehled", "overview": "Přehled",
"home": "Domů", "home": "Domů",
"accessControl": "Kontrola přístupu",
"settings": "Nastavení", "settings": "Nastavení",
"usersAll": "Všichni uživatelé", "usersAll": "Všichni uživatelé",
"license": "Licence", "license": "Licence",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Benutzer- und rollenbasierte Zugriffskontrolle", "resourcesUsersRolesAccess": "Benutzer- und rollenbasierte Zugriffskontrolle",
"resourcesErrorUpdate": "Fehler beim Umschalten der Ressource", "resourcesErrorUpdate": "Fehler beim Umschalten der Ressource",
"resourcesErrorUpdateDescription": "Beim Aktualisieren der Ressource ist ein Fehler aufgetreten", "resourcesErrorUpdateDescription": "Beim Aktualisieren der Ressource ist ein Fehler aufgetreten",
"access": "Access", "access": "Zugriff",
"accessControl": "Zugriffskontrolle",
"shareLink": "{resource} Freigabe-Link", "shareLink": "{resource} Freigabe-Link",
"resourceSelect": "Ressource auswählen", "resourceSelect": "Ressource auswählen",
"shareLinks": "Freigabe-Links", "shareLinks": "Freigabe-Links",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Hoppla! Die gesuchte Seite existiert nicht.", "pageNotFoundDescription": "Hoppla! Die gesuchte Seite existiert nicht.",
"overview": "Übersicht", "overview": "Übersicht",
"home": "Startseite", "home": "Startseite",
"accessControl": "Zugriffskontrolle",
"settings": "Einstellungen", "settings": "Einstellungen",
"usersAll": "Alle Benutzer", "usersAll": "Alle Benutzer",
"license": "Lizenz", "license": "Lizenz",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Control de acceso basado en usuarios y roles", "resourcesUsersRolesAccess": "Control de acceso basado en usuarios y roles",
"resourcesErrorUpdate": "Error al cambiar el recurso", "resourcesErrorUpdate": "Error al cambiar el recurso",
"resourcesErrorUpdateDescription": "Se ha producido un error al actualizar el recurso", "resourcesErrorUpdateDescription": "Se ha producido un error al actualizar el recurso",
"access": "Access", "access": "Acceder",
"accessControl": "Control de acceso",
"shareLink": "{resource} Compartir Enlace", "shareLink": "{resource} Compartir Enlace",
"resourceSelect": "Seleccionar recurso", "resourceSelect": "Seleccionar recurso",
"shareLinks": "Compartir enlaces", "shareLinks": "Compartir enlaces",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "¡Vaya! La página que estás buscando no existe.", "pageNotFoundDescription": "¡Vaya! La página que estás buscando no existe.",
"overview": "Resumen", "overview": "Resumen",
"home": "Inicio", "home": "Inicio",
"accessControl": "Control de acceso",
"settings": "Ajustes", "settings": "Ajustes",
"usersAll": "Todos los usuarios", "usersAll": "Todos los usuarios",
"license": "Licencia", "license": "Licencia",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Contrôle d'accès basé sur les utilisateurs et les rôles", "resourcesUsersRolesAccess": "Contrôle d'accès basé sur les utilisateurs et les rôles",
"resourcesErrorUpdate": "Échec de la bascule de la ressource", "resourcesErrorUpdate": "Échec de la bascule de la ressource",
"resourcesErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour de la ressource", "resourcesErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour de la ressource",
"access": "Access", "access": "Accès",
"accessControl": "Contrôle d'accès",
"shareLink": "Lien de partage {resource}", "shareLink": "Lien de partage {resource}",
"resourceSelect": "Sélectionner une ressource", "resourceSelect": "Sélectionner une ressource",
"shareLinks": "Liens de partage", "shareLinks": "Liens de partage",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Oups! La page que vous recherchez n'existe pas.", "pageNotFoundDescription": "Oups! La page que vous recherchez n'existe pas.",
"overview": "Vue d'ensemble", "overview": "Vue d'ensemble",
"home": "Accueil", "home": "Accueil",
"accessControl": "Contrôle d'accès",
"settings": "Paramètres", "settings": "Paramètres",
"usersAll": "Tous les utilisateurs", "usersAll": "Tous les utilisateurs",
"license": "Licence", "license": "Licence",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Controllo accessi basato su utenti e ruoli", "resourcesUsersRolesAccess": "Controllo accessi basato su utenti e ruoli",
"resourcesErrorUpdate": "Impossibile attivare/disattivare la risorsa", "resourcesErrorUpdate": "Impossibile attivare/disattivare la risorsa",
"resourcesErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento della risorsa", "resourcesErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento della risorsa",
"access": "Access", "access": "Accesso",
"accessControl": "Controllo Accessi",
"shareLink": "Link di Condivisione {resource}", "shareLink": "Link di Condivisione {resource}",
"resourceSelect": "Seleziona risorsa", "resourceSelect": "Seleziona risorsa",
"shareLinks": "Link di Condivisione", "shareLinks": "Link di Condivisione",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Oops! La pagina che stai cercando non esiste.", "pageNotFoundDescription": "Oops! La pagina che stai cercando non esiste.",
"overview": "Panoramica", "overview": "Panoramica",
"home": "Home", "home": "Home",
"accessControl": "Controllo Accessi",
"settings": "Impostazioni", "settings": "Impostazioni",
"usersAll": "Tutti Gli Utenti", "usersAll": "Tutti Gli Utenti",
"license": "Licenza", "license": "Licenza",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "사용자 및 역할 기반 접근 제어", "resourcesUsersRolesAccess": "사용자 및 역할 기반 접근 제어",
"resourcesErrorUpdate": "리소스를 전환하는 데 실패했습니다.", "resourcesErrorUpdate": "리소스를 전환하는 데 실패했습니다.",
"resourcesErrorUpdateDescription": "리소스를 업데이트하는 동안 오류가 발생했습니다.", "resourcesErrorUpdateDescription": "리소스를 업데이트하는 동안 오류가 발생했습니다.",
"access": "Access", "access": "접속",
"accessControl": "액세스 제어",
"shareLink": "{resource} 공유 링크", "shareLink": "{resource} 공유 링크",
"resourceSelect": "리소스 선택", "resourceSelect": "리소스 선택",
"shareLinks": "공유 링크", "shareLinks": "공유 링크",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "앗! 찾고 있는 페이지가 존재하지 않습니다.", "pageNotFoundDescription": "앗! 찾고 있는 페이지가 존재하지 않습니다.",
"overview": "개요", "overview": "개요",
"home": "홈", "home": "홈",
"accessControl": "액세스 제어",
"settings": "설정", "settings": "설정",
"usersAll": "모든 사용자", "usersAll": "모든 사용자",
"license": "라이선스", "license": "라이선스",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Bruker- og rollebasert tilgangskontroll", "resourcesUsersRolesAccess": "Bruker- og rollebasert tilgangskontroll",
"resourcesErrorUpdate": "Feilet å slå av/på ressurs", "resourcesErrorUpdate": "Feilet å slå av/på ressurs",
"resourcesErrorUpdateDescription": "En feil oppstod under oppdatering av ressursen", "resourcesErrorUpdateDescription": "En feil oppstod under oppdatering av ressursen",
"access": "Access", "access": "Tilgang",
"accessControl": "Tilgangskontroll",
"shareLink": "{resource} Del Lenke", "shareLink": "{resource} Del Lenke",
"resourceSelect": "Velg ressurs", "resourceSelect": "Velg ressurs",
"shareLinks": "Del lenker", "shareLinks": "Del lenker",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Oops! Siden du leter etter finnes ikke.", "pageNotFoundDescription": "Oops! Siden du leter etter finnes ikke.",
"overview": "Oversikt", "overview": "Oversikt",
"home": "Hjem", "home": "Hjem",
"accessControl": "Tilgangskontroll",
"settings": "Innstillinger", "settings": "Innstillinger",
"usersAll": "Alle brukere", "usersAll": "Alle brukere",
"license": "Lisens", "license": "Lisens",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Gebruiker en rol-gebaseerde toegangsbeheer", "resourcesUsersRolesAccess": "Gebruiker en rol-gebaseerde toegangsbeheer",
"resourcesErrorUpdate": "Bron wisselen mislukt", "resourcesErrorUpdate": "Bron wisselen mislukt",
"resourcesErrorUpdateDescription": "Er is een fout opgetreden tijdens het bijwerken van het document", "resourcesErrorUpdateDescription": "Er is een fout opgetreden tijdens het bijwerken van het document",
"access": "Access", "access": "Toegangsrechten",
"accessControl": "Toegangs controle",
"shareLink": "{resource} Share link", "shareLink": "{resource} Share link",
"resourceSelect": "Selecteer resource", "resourceSelect": "Selecteer resource",
"shareLinks": "Links delen", "shareLinks": "Links delen",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Oeps! De pagina die je zoekt bestaat niet.", "pageNotFoundDescription": "Oeps! De pagina die je zoekt bestaat niet.",
"overview": "Overzicht.", "overview": "Overzicht.",
"home": "Startpagina", "home": "Startpagina",
"accessControl": "Toegangs controle",
"settings": "Instellingen", "settings": "Instellingen",
"usersAll": "Alle gebruikers", "usersAll": "Alle gebruikers",
"license": "Licentie", "license": "Licentie",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Kontrola dostępu oparta na użytkownikach i rolach", "resourcesUsersRolesAccess": "Kontrola dostępu oparta na użytkownikach i rolach",
"resourcesErrorUpdate": "Nie udało się przełączyć zasobu", "resourcesErrorUpdate": "Nie udało się przełączyć zasobu",
"resourcesErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji zasobu", "resourcesErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji zasobu",
"access": "Access", "access": "Dostęp",
"accessControl": "Kontrola dostępu",
"shareLink": "Link udostępniania {resource}", "shareLink": "Link udostępniania {resource}",
"resourceSelect": "Wybierz zasób", "resourceSelect": "Wybierz zasób",
"shareLinks": "Linki udostępniania", "shareLinks": "Linki udostępniania",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Ups! Strona, której szukasz, nie istnieje.", "pageNotFoundDescription": "Ups! Strona, której szukasz, nie istnieje.",
"overview": "Przegląd", "overview": "Przegląd",
"home": "Strona główna", "home": "Strona główna",
"accessControl": "Kontrola dostępu",
"settings": "Ustawienia", "settings": "Ustawienia",
"usersAll": "Wszyscy użytkownicy", "usersAll": "Wszyscy użytkownicy",
"license": "Licencja", "license": "Licencja",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Controle de acesso baseado em utilizadores e funções", "resourcesUsersRolesAccess": "Controle de acesso baseado em utilizadores e funções",
"resourcesErrorUpdate": "Falha ao alternar recurso", "resourcesErrorUpdate": "Falha ao alternar recurso",
"resourcesErrorUpdateDescription": "Ocorreu um erro ao atualizar o recurso", "resourcesErrorUpdateDescription": "Ocorreu um erro ao atualizar o recurso",
"access": "Access", "access": "Acesso",
"accessControl": "Controle de Acesso",
"shareLink": "Link de Compartilhamento {resource}", "shareLink": "Link de Compartilhamento {resource}",
"resourceSelect": "Selecionar recurso", "resourceSelect": "Selecionar recurso",
"shareLinks": "Links de Compartilhamento", "shareLinks": "Links de Compartilhamento",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Ops! A página que você está procurando não existe.", "pageNotFoundDescription": "Ops! A página que você está procurando não existe.",
"overview": "Visão Geral", "overview": "Visão Geral",
"home": "Início", "home": "Início",
"accessControl": "Controle de Acesso",
"settings": "Configurações", "settings": "Configurações",
"usersAll": "Todos os Utilizadores", "usersAll": "Todos os Utilizadores",
"license": "Licença", "license": "Licença",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Контроль доступа на основе пользователей и ролей", "resourcesUsersRolesAccess": "Контроль доступа на основе пользователей и ролей",
"resourcesErrorUpdate": "Не удалось переключить ресурс", "resourcesErrorUpdate": "Не удалось переключить ресурс",
"resourcesErrorUpdateDescription": "Произошла ошибка при обновлении ресурса", "resourcesErrorUpdateDescription": "Произошла ошибка при обновлении ресурса",
"access": "Access", "access": "Доступ",
"accessControl": "Контроль доступа",
"shareLink": "Общая ссылка {resource}", "shareLink": "Общая ссылка {resource}",
"resourceSelect": "Выберите ресурс", "resourceSelect": "Выберите ресурс",
"shareLinks": "Общие ссылки", "shareLinks": "Общие ссылки",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Упс! Страница, которую вы ищете, не существует.", "pageNotFoundDescription": "Упс! Страница, которую вы ищете, не существует.",
"overview": "Обзор", "overview": "Обзор",
"home": "Главная", "home": "Главная",
"accessControl": "Контроль доступа",
"settings": "Настройки", "settings": "Настройки",
"usersAll": "Все пользователи", "usersAll": "Все пользователи",
"license": "Лицензия", "license": "Лицензия",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "Kullanıcı ve rol tabanlı erişim kontrolü", "resourcesUsersRolesAccess": "Kullanıcı ve rol tabanlı erişim kontrolü",
"resourcesErrorUpdate": "Kaynak değiştirilemedi", "resourcesErrorUpdate": "Kaynak değiştirilemedi",
"resourcesErrorUpdateDescription": "Kaynak güncellenirken bir hata oluştu", "resourcesErrorUpdateDescription": "Kaynak güncellenirken bir hata oluştu",
"access": "Access", "access": "Erişim",
"accessControl": "Erişim Kontrolü",
"shareLink": "{resource} Paylaşım Bağlantısı", "shareLink": "{resource} Paylaşım Bağlantısı",
"resourceSelect": "Kaynak seçin", "resourceSelect": "Kaynak seçin",
"shareLinks": "Paylaşım Bağlantıları", "shareLinks": "Paylaşım Bağlantıları",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "Oops! Aradığınız sayfa mevcut değil.", "pageNotFoundDescription": "Oops! Aradığınız sayfa mevcut değil.",
"overview": "Genel Bakış", "overview": "Genel Bakış",
"home": "Ana Sayfa", "home": "Ana Sayfa",
"accessControl": "Erişim Kontrolü",
"settings": "Ayarlar", "settings": "Ayarlar",
"usersAll": "Tüm Kullanıcılar", "usersAll": "Tüm Kullanıcılar",
"license": "Lisans", "license": "Lisans",

View File

@@ -649,8 +649,7 @@
"resourcesUsersRolesAccess": "基于用户和角色的访问控制", "resourcesUsersRolesAccess": "基于用户和角色的访问控制",
"resourcesErrorUpdate": "切换资源失败", "resourcesErrorUpdate": "切换资源失败",
"resourcesErrorUpdateDescription": "更新资源时出错", "resourcesErrorUpdateDescription": "更新资源时出错",
"access": "Access", "access": "访问权限",
"accessControl": "访问控制",
"shareLink": "{resource} 的分享链接", "shareLink": "{resource} 的分享链接",
"resourceSelect": "选择资源", "resourceSelect": "选择资源",
"shareLinks": "分享链接", "shareLinks": "分享链接",
@@ -1039,6 +1038,7 @@
"pageNotFoundDescription": "哎呀!您正在查找的页面不存在。", "pageNotFoundDescription": "哎呀!您正在查找的页面不存在。",
"overview": "概览", "overview": "概览",
"home": "首页", "home": "首页",
"accessControl": "访问控制",
"settings": "设置", "settings": "设置",
"usersAll": "所有用户", "usersAll": "所有用户",
"license": "许可协议", "license": "许可协议",

View File

@@ -5,11 +5,13 @@ import { SidebarNav } from "@app/components/SidebarNav";
import { OrgSelector } from "@app/components/OrgSelector"; import { OrgSelector } from "@app/components/OrgSelector";
import { cn } from "@app/lib/cn"; import { cn } from "@app/lib/cn";
import { ListUserOrgsResponse } from "@server/routers/org"; import { ListUserOrgsResponse } from "@server/routers/org";
import SupporterStatus from "@app/components/SupporterStatus";
import { Button } from "@app/components/ui/button"; import { Button } from "@app/components/ui/button";
import { ArrowRight, Menu, Server } from "lucide-react"; import { ExternalLink, Menu, Server } from "lucide-react";
import Link from "next/link"; import Link from "next/link";
import { usePathname } from "next/navigation"; import { usePathname } from "next/navigation";
import { useUserContext } from "@app/hooks/useUserContext"; import { useUserContext } from "@app/hooks/useUserContext";
import { useEnvContext } from "@app/hooks/useEnvContext";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import ProfileIcon from "@app/components/ProfileIcon"; import ProfileIcon from "@app/components/ProfileIcon";
import ThemeSwitcher from "@app/components/ThemeSwitcher"; import ThemeSwitcher from "@app/components/ThemeSwitcher";
@@ -42,6 +44,7 @@ export function LayoutMobileMenu({
const pathname = usePathname(); const pathname = usePathname();
const isAdminPage = pathname?.startsWith("/admin"); const isAdminPage = pathname?.startsWith("/admin");
const { user } = useUserContext(); const { user } = useUserContext();
const { env } = useEnvContext();
const t = useTranslations(); const t = useTranslations();
return ( return (
@@ -80,7 +83,7 @@ export function LayoutMobileMenu({
<div className="px-3 pt-3"> <div className="px-3 pt-3">
{!isAdminPage && {!isAdminPage &&
user.serverAdmin && ( user.serverAdmin && (
<div className="mb-1"> <div className="py-2">
<Link <Link
href="/admin" href="/admin"
className={cn( className={cn(
@@ -95,12 +98,11 @@ export function LayoutMobileMenu({
<span className="flex-shrink-0 mr-2"> <span className="flex-shrink-0 mr-2">
<Server className="h-4 w-4" /> <Server className="h-4 w-4" />
</span> </span>
<span className="flex-1"> <span>
{t( {t(
"serverAdmin" "serverAdmin"
)} )}
</span> </span>
<ArrowRight className="h-4 w-4 shrink-0 ml-auto opacity-70" />
</Link> </Link>
</div> </div>
)} )}
@@ -113,6 +115,22 @@ export function LayoutMobileMenu({
</div> </div>
<div className="sticky bottom-0 left-0 right-0 h-8 pointer-events-none bg-gradient-to-t from-card to-transparent" /> <div className="sticky bottom-0 left-0 right-0 h-8 pointer-events-none bg-gradient-to-t from-card to-transparent" />
</div> </div>
<div className="px-3 pt-3 pb-3 space-y-4 border-t shrink-0">
<SupporterStatus />
{env?.app?.version && (
<div className="text-xs text-muted-foreground text-center">
<Link
href={`https://github.com/fosrl/pangolin/releases/tag/${env.app.version}`}
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center gap-1"
>
v{env.app.version}
<ExternalLink size={12} />
</Link>
</div>
)}
</div>
</SheetContent> </SheetContent>
</Sheet> </Sheet>
</div> </div>

View File

@@ -146,46 +146,6 @@ export function LayoutSidebar({
/> />
<div className="flex-1 overflow-y-auto relative"> <div className="flex-1 overflow-y-auto relative">
<div className="px-2 pt-3"> <div className="px-2 pt-3">
{!isAdminPage && user.serverAdmin && (
<div
className={cn(
"shrink-0",
isSidebarCollapsed ? "mb-4" : "mb-1"
)}
>
<Link
href="/admin"
className={cn(
"flex items-center transition-colors text-muted-foreground hover:text-foreground text-sm w-full hover:bg-secondary/80 dark:hover:bg-secondary/50 rounded-md",
isSidebarCollapsed
? "px-2 py-2 justify-center"
: "px-3 py-1.5"
)}
title={
isSidebarCollapsed
? t("serverAdmin")
: undefined
}
>
<span
className={cn(
"shrink-0",
!isSidebarCollapsed && "mr-2"
)}
>
<Server className="h-4 w-4" />
</span>
{!isSidebarCollapsed && (
<>
<span className="flex-1">
{t("serverAdmin")}
</span>
<ArrowRight className="h-4 w-4 shrink-0 ml-auto opacity-70" />
</>
)}
</Link>
</div>
)}
<SidebarNav <SidebarNav
sections={navItems} sections={navItems}
isCollapsed={isSidebarCollapsed} isCollapsed={isSidebarCollapsed}
@@ -196,6 +156,40 @@ export function LayoutSidebar({
<div className="sticky bottom-0 left-0 right-0 h-8 pointer-events-none bg-gradient-to-t from-card to-transparent" /> <div className="sticky bottom-0 left-0 right-0 h-8 pointer-events-none bg-gradient-to-t from-card to-transparent" />
</div> </div>
{!isAdminPage && user.serverAdmin && (
<div className="shrink-0 px-2 pb-2">
<Link
href="/admin"
className={cn(
"flex items-center transition-colors text-muted-foreground hover:text-foreground text-sm w-full hover:bg-secondary/80 dark:hover:bg-secondary/50 rounded-md",
isSidebarCollapsed
? "px-2 py-2 justify-center"
: "px-3 py-1.5"
)}
title={
isSidebarCollapsed ? t("serverAdmin") : undefined
}
>
<span
className={cn(
"shrink-0",
!isSidebarCollapsed && "mr-2"
)}
>
<Server className="h-4 w-4" />
</span>
{!isSidebarCollapsed && (
<>
<span className="flex-1">
{t("serverAdmin")}
</span>
<ArrowRight className="h-4 w-4 shrink-0 ml-auto opacity-70" />
</>
)}
</Link>
</div>
)}
{isSidebarCollapsed && ( {isSidebarCollapsed && (
<div className="shrink-0 flex justify-center py-2"> <div className="shrink-0 flex justify-center py-2">
<TooltipProvider> <TooltipProvider>
@@ -224,7 +218,7 @@ export function LayoutSidebar({
<div className="w-full border-t border-border mb-3" /> <div className="w-full border-t border-border mb-3" />
<div className="p-4 pt-1 flex flex-col shrink-0"> <div className="p-4 pt-0 mt-0 flex flex-col shrink-0">
{canShowProductUpdates && ( {canShowProductUpdates && (
<div className="mb-3 empty:mb-0"> <div className="mb-3 empty:mb-0">
<ProductUpdates isCollapsed={isSidebarCollapsed} /> <ProductUpdates isCollapsed={isSidebarCollapsed} />