From 0679905c51ec9f1d45d3b128350e9e44e279626d Mon Sep 17 00:00:00 2001 From: PEDZEO Date: Wed, 21 Jan 2026 03:21:45 +0300 Subject: [PATCH] Add helper functions for formatting settings and cleaning HTML in AdminSettings - Introduced `formatSettingName` to convert setting names from Snake_Case/CamelCase to a readable format. - Added `stripHtml` function to remove HTML tags from setting descriptions. - Updated rendering logic in `renderSettingRow` to utilize the new helper functions for improved display of setting names and descriptions. - Enhanced layout for settings display with better spacing and organization. --- src/pages/AdminSettings.tsx | 152 +++++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 53 deletions(-) diff --git a/src/pages/AdminSettings.tsx b/src/pages/AdminSettings.tsx index 713d2fd..03714c9 100644 --- a/src/pages/AdminSettings.tsx +++ b/src/pages/AdminSettings.tsx @@ -104,6 +104,38 @@ const MenuIcon = () => ( ) +// ============ HELPER FUNCTIONS ============ +// Форматирование названия настройки (Snake_Case / CamelCase -> читаемый текст) +function formatSettingName(name: string): string { + if (!name) return '' + + // Убираем префиксы типа "Miniapp ", "Happ " и т.д. + let formatted = name + // CamelCase -> пробелы + .replace(/([a-z])([A-Z])/g, '$1 $2') + // snake_case -> пробелы + .replace(/_/g, ' ') + // Убираем лишние пробелы + .replace(/\s+/g, ' ') + .trim() + + // Делаем первую букву заглавной, остальные как есть + return formatted.charAt(0).toUpperCase() + formatted.slice(1) +} + +// Очистка HTML тегов из описания +function stripHtml(html: string): string { + if (!html) return '' + return html + .replace(/<[^>]*>/g, '') + .replace(/ /g, ' ') + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .trim() +} + // ============ SIDEBAR MENU ITEMS ============ interface MenuItem { id: string @@ -379,31 +411,34 @@ export default function AdminSettings() { const renderSettingRow = (setting: SettingDefinition) => { const isFav = isFavorite(setting.key) + const displayName = formatSettingName(setting.name || setting.key) + const description = setting.hint?.description ? stripHtml(setting.hint.description) : null return (
-
-
- {setting.name || setting.key} - {setting.has_override && ( - - {t('admin.settings.modified')} - + {/* Top row - name and badge */} +
+
+
+ {displayName} + {setting.has_override && ( + + {t('admin.settings.modified')} + + )} +
+ {description && ( +

{description}

)}
- {setting.hint?.description && ( -

{setting.hint.description}

- )} -
-
{/* Favorite button */} +
- {/* Setting control */} - {setting.read_only ? ( -
- - {String(setting.current ?? '-')} -
- ) : setting.type === 'bool' ? ( - renderToggle( - setting.current === true || setting.current === 'true', - () => updateSettingMutation.mutate({ - key: setting.key, - value: setting.current === true || setting.current === 'true' ? 'false' : 'true' - }), - updateSettingMutation.isPending - ) - ) : ( - updateSettingMutation.mutate({ key: setting.key, value })} - disabled={updateSettingMutation.isPending} - /> - )} + {/* Bottom row - control */} +
+ {setting.key} - {/* Reset button */} - {setting.has_override && !setting.read_only && ( - - )} +
+ {/* Setting control */} + {setting.read_only ? ( +
+ + {String(setting.current ?? '-')} +
+ ) : setting.type === 'bool' ? ( + renderToggle( + setting.current === true || setting.current === 'true', + () => updateSettingMutation.mutate({ + key: setting.key, + value: setting.current === true || setting.current === 'true' ? 'false' : 'true' + }), + updateSettingMutation.isPending + ) + ) : ( + updateSettingMutation.mutate({ key: setting.key, value })} + disabled={updateSettingMutation.isPending} + /> + )} + + {/* Reset button */} + {setting.has_override && !setting.read_only && ( + + )} +
) @@ -800,7 +842,9 @@ export default function AdminSettings() {

{t('admin.settings.favoritesHint')}

) : ( - favoriteSettings.map(renderSettingRow) +
+ {favoriteSettings.map(renderSettingRow)} +
)}
) @@ -809,15 +853,15 @@ export default function AdminSettings() {
{/* Sub-categories navigation */} {currentCategories.length > 1 && !activeSubCategory && ( -
+
{currentCategories.map((cat) => ( )} - {/* Settings list */} + {/* Settings grid/list */} {filteredSettings.length === 0 ? (

{t('admin.settings.noSettings')}

) : ( - filteredSettings.map(renderSettingRow) +
+ {filteredSettings.map(renderSettingRow)} +
)}
)