diff --git a/.gitea/workflows/docker-publish-fast.yml b/.gitea/workflows/docker-publish-fast.yml index 56a3c0d..4ed89e9 100644 --- a/.gitea/workflows/docker-publish-fast.yml +++ b/.gitea/workflows/docker-publish-fast.yml @@ -56,4 +56,4 @@ jobs: - name: Trigger container update webhook run: | - curl -X POST -sS --fail https://docker.shts.su/api/webhooks/d3fd3b6a-c670-4035-9357-2fde8aa76b6e \ No newline at end of file + curl -X POST -sS --fail "${{ secrets.portainer_webhook }}" \ No newline at end of file diff --git a/.gitea/workflows/docker-publish.yml b/.gitea/workflows/docker-publish.yml index 617a8e0..dbdbef9 100644 --- a/.gitea/workflows/docker-publish.yml +++ b/.gitea/workflows/docker-publish.yml @@ -48,4 +48,4 @@ jobs: - name: Trigger container update webhook run: | - curl -X POST -sS --fail https://docker.shts.su/api/webhooks/d3fd3b6a-c670-4035-9357-2fde8aa76b6e \ No newline at end of file + curl -X POST -sS --fail "${{ secrets.portainer_webhook }}" \ No newline at end of file diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index f03130c..2b9d67a 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -20,7 +20,9 @@ import { IconDownload, IconCreditCard, IconMenu2, - IconArrowsExchange + IconArrowsExchange, + IconLayoutSidebarLeftExpand, + IconLayoutNavbar } from '@tabler/icons-react'; import ServerManager from './ServerManager'; import FilterManager from './FilterManager'; @@ -56,14 +58,16 @@ function LanguageProvider({ children }) { dashboard: 'Панель', domains: 'Домены', ipRanges: 'IP-диапазоны', asns: 'AS', communities: 'Community', servers: 'Серверы', filters: 'Фильтры', billing: 'Биллинг', autoUrls: 'Авто URL', easySwitch: 'Easy Switch', networkConfig: 'Сетевые настройки', mikrotikBackups: 'MikroTik Бэкапы', - light: 'Светлая', dark: 'Тёмная' + light: 'Светлая', dark: 'Тёмная', + layoutSidebar: 'Сайдбар', layoutHorizontal: 'Верхнее меню' }, en: { home: 'Home', data: 'Data', management: 'Management', tools: 'Tools', dashboard: 'Dashboard', domains: 'Domains', ipRanges: 'IP Ranges', asns: 'ASNs', communities: 'Communities', servers: 'Servers', filters: 'Filters', billing: 'Billing', autoUrls: 'Auto URLs', easySwitch: 'Easy Switch', networkConfig: 'Network Config', mikrotikBackups: 'MikroTik Backups', - light: 'Light', dark: 'Dark' + light: 'Light', dark: 'Dark', + layoutSidebar: 'Sidebar', layoutHorizontal: 'Top menu' } }; const t = (key) => (dict[lang] && key in dict[lang] ? dict[lang][key] : key); @@ -122,12 +126,19 @@ function App() { ); } +const LAYOUT_FLUID = 'fluid'; +const LAYOUT_HORIZONTAL = 'horizontal'; + function MainLayout() { const location = useLocation(); const { lang, setLang, t } = useContext(LanguageContext); const { theme, setTheme } = useContext(ThemeContext); - // Навбар стал лаконичным: без неиспользуемых уведомлений/иконок const [settingsOpen, setSettingsOpen] = useState(false); + const [layout, setLayout] = useState(() => localStorage.getItem('layout') || LAYOUT_FLUID); + + useEffect(() => { + localStorage.setItem('layout', layout); + }, [layout]); // Состояние для управления выпадающими меню const [dropdownStates, setDropdownStates] = useState({ @@ -233,6 +244,152 @@ function MainLayout() { const activeTab = getActiveTab(); + // Старый вид: один верхний навбар с горизонтальным меню + if (layout === LAYOUT_HORIZONTAL) { + return ( +