localization && navbar fix
This commit is contained in:
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user