localization && navbar fix

This commit is contained in:
2025-11-09 22:15:48 +09:00
parent a963281be0
commit 68bbef35ee
22 changed files with 1386 additions and 526 deletions

View File

@@ -358,63 +358,63 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
<div className="col-12 mb-4">
<label className="form-label fs-5 mb-3">
<i className="bi bi-layout-text-window-reverse me-2"></i>
Стиль отображения групп и ссылок
{t('customization.layout.style')}
</label>
<div className="row g-3">
{[
{
value: 'list',
label: 'Список',
labelKey: 'customization.layout.list',
icon: 'bi-list-ul',
description: 'Классический вертикальный список'
descriptionKey: 'customization.layout.listDescription'
},
{
value: 'grid',
label: 'Сетка',
labelKey: 'customization.layout.grid',
icon: 'bi-grid-3x3',
description: 'Равномерная сетка карточек'
descriptionKey: 'customization.layout.gridDescription'
},
{
value: 'cards',
label: 'Карточки',
labelKey: 'customization.layout.cards',
icon: 'bi-card-heading',
description: 'Большие информативные карточки'
descriptionKey: 'customization.layout.cardsDescription'
},
{
value: 'compact',
label: 'Компактный',
labelKey: 'customization.layout.compact',
icon: 'bi-layout-text-sidebar',
description: 'Компактное отображение без отступов'
descriptionKey: 'customization.layout.compactDescription'
},
{
value: 'sidebar',
label: 'Боковая панель',
labelKey: 'customization.layout.sidebar',
icon: 'bi-layout-sidebar',
description: 'Навигация в боковой панели'
descriptionKey: 'customization.layout.sidebarDescription'
},
{
value: 'masonry',
label: 'Кладка',
labelKey: 'customization.layout.masonry',
icon: 'bi-bricks',
description: 'Динамическая сетка разной высоты'
descriptionKey: 'customization.layout.masonryDescription'
},
{
value: 'timeline',
label: 'Лента времени',
labelKey: 'customization.layout.timeline',
icon: 'bi-clock-history',
description: 'Хронологическое отображение'
descriptionKey: 'customization.layout.timelineDescription'
},
{
value: 'magazine',
label: 'Журнальный',
labelKey: 'customization.layout.magazine',
icon: 'bi-newspaper',
description: 'Стиль журнала с крупными изображениями'
descriptionKey: 'customization.layout.magazineDescription'
},
{
value: 'test-list',
label: 'Тестовый список',
labelKey: 'customization.layout.testList',
icon: 'bi-list-check',
description: 'Полный несворачиваемый список всех групп и ссылок'
descriptionKey: 'customization.layout.testListDescription'
}
].map((layout) => (
<div key={layout.value} className="col-md-6 col-lg-4">
@@ -425,8 +425,8 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
>
<div className="card-body d-flex flex-column">
<i className={`${layout.icon} fs-1 mb-3 text-primary`}></i>
<h6 className="card-title mb-2">{layout.label}</h6>
<p className="card-text small text-muted flex-grow-1">{layout.description}</p>
<h6 className="card-title mb-2">{t(layout.labelKey)}</h6>
<p className="card-text small text-muted flex-grow-1">{t(layout.descriptionKey)}</p>
{settings.dashboard_layout === layout.value && (
<div className="mt-2">
<span className="badge bg-primary">
@@ -458,7 +458,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
<div className="tab-pane fade show active">
<div className="row">
<div className="col-md-6 mb-3">
<label className="form-label">Основной цвет темы</label>
<label className="form-label">{t('customization.colors.theme')}</label>
<div className="input-group">
<input
type="color"
@@ -475,7 +475,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
</div>
</div>
<div className="col-md-6 mb-3">
<label className="form-label">Цвет фона дашборда</label>
<label className="form-label">{t('customization.colors.background')}</label>
<div className="input-group">
<input
type="color"
@@ -492,7 +492,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
</div>
</div>
<div className="col-12 mb-3">
<label className="form-label">Фоновое изображение</label>
<label className="form-label">{t('customization.colors.backgroundImage')}</label>
<div className="mb-2">
<input
type="file"
@@ -506,12 +506,12 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
}}
/>
<div className="form-text">
Выберите изображение для фона (JPG, PNG, GIF). Если не выбрано - текущее изображение останется без изменений.
{t('customization.colors.backgroundImageHelp')}
</div>
</div>
{settings.background_image_url && (
<div className="mb-2">
<label className="form-label small">Текущее изображение:</label>
<label className="form-label small">{t('customization.colors.currentImage')}</label>
<div className="d-flex align-items-center gap-2">
<img
src={settings.background_image_url}
@@ -525,16 +525,16 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
onClick={() => {
handleChange('background_image_url', '')
}}
title="Убрать фон"
title={t('customization.colors.removeBackground')}
>
<i className="bi bi-trash"></i> Убрать фон
<i className="bi bi-trash"></i> {t('customization.colors.removeBackground')}
</button>
</div>
</div>
)}
{backgroundImageFile && (
<div className="mb-2">
<label className="form-label small">Новое изображение (будет применено после сохранения):</label>
<label className="form-label small">{t('customization.colors.newImage')}</label>
<div className="text-success">
<i className="bi bi-file-earmark-image me-1"></i>
{backgroundImageFile.name}
@@ -543,7 +543,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
)}
</div>
<div className="col-md-4 mb-3">
<label className="form-label">Цвет заголовков</label>
<label className="form-label">{t('customization.colors.header')}</label>
<div className="input-group">
<input
type="color"
@@ -560,7 +560,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
</div>
</div>
<div className="col-md-4 mb-3">
<label className="form-label">Цвет названий групп</label>
<label className="form-label">{t('customization.colors.group')}</label>
<div className="input-group">
<input
type="color"
@@ -577,7 +577,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
</div>
</div>
<div className="col-md-4 mb-3">
<label className="form-label">Цвет названий ссылок</label>
<label className="form-label">{t('customization.colors.link')}</label>
<div className="input-group">
<input
type="color"
@@ -602,7 +602,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
<div className="tab-pane fade show active">
<div className="row">
<div className="col-12 mb-3">
<h6 className="text-muted">Настройки отображения групп</h6>
<h6 className="text-muted">{t('customization.groups.displaySettings')}</h6>
</div>
<div className="col-12 mb-3">
<div className="form-check form-switch">
@@ -874,10 +874,10 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
<div className="tab-pane fade show active">
<div className="row">
<div className="col-12 mb-4">
<h6 className="text-muted">Настройки шрифтов</h6>
<h6 className="text-muted">{t('customization.advanced.fontSettings')}</h6>
</div>
<div className="col-md-6 mb-3">
<label className="form-label">Основной шрифт</label>
<label className="form-label">{t('customization.advanced.mainFont')}</label>
<select
className="form-select"
value={settings.font_family}
@@ -900,7 +900,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
</select>
</div>
<div className="col-md-6 mb-3">
<label className="form-label">Шрифт заголовков</label>
<label className="form-label">{t('customization.advanced.headingFont')}</label>
<select
className="form-select"
value={settings.heading_font_family || settings.font_family}
@@ -929,7 +929,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
</select>
</div>
<div className="col-md-6 mb-3">
<label className="form-label">Шрифт основного текста</label>
<label className="form-label">{t('customization.advanced.bodyFont')}</label>
<select
className="form-select"
value={settings.body_font_family || settings.font_family}
@@ -963,11 +963,11 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
<div className="col-12 mb-4">
<hr />
<h6 className="text-muted">Дополнительные настройки</h6>
<h6 className="text-muted">{t('customization.advanced.additionalSettings')}</h6>
</div>
<div className="col-12 mb-3">
<label className="form-label">Дополнительный CSS</label>
<label className="form-label">{t('customization.advanced.customCSS')}</label>
<textarea
className="form-control font-monospace"
rows={6}
@@ -1183,7 +1183,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
type="button"
className="btn btn-outline-warning"
onClick={() => {
if (confirm('Вы уверены, что хотите сбросить все настройки интерфейса к значениям по умолчанию? Это действие нельзя отменить.')) {
if (confirm(t('customization.advanced.resetConfirm'))) {
// Сброс к дефолтным настройкам
const defaultSettings = {
theme_color: '#007bff',