Skip to content

Commit 39aba61

Browse files
committed
feat: добавлена поддержка типа select для настроек плагинов
Добавлен новый тип поля "select" для настроек плагинов, который позволяет разработчикам создавать выпадающие списки с предопределенными значениями. Поддерживает два формата опций: - Простой массив строк: ["option1", "option2"] - Массив объектов с value и label: [{ value: "val1", label: "Label 1" }] Обновлена документация для разработчиков плагинов с примерами использования.
1 parent dbb4155 commit 39aba61

2 files changed

Lines changed: 79 additions & 0 deletions

File tree

backend/src/ai/plugin-assistant-system-prompt.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,26 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
412412
"defaultPath": "config/default.json"
413413
},
414414

415+
"mode": {
416+
"type": "select",
417+
"label": "Режим работы",
418+
"description": "Выберите режим работы плагина",
419+
"options": ["easy", "normal", "hard"],
420+
"default": "normal"
421+
},
422+
423+
"language": {
424+
"type": "select",
425+
"label": "Язык",
426+
"description": "Выберите язык интерфейса",
427+
"options": [
428+
{ "value": "ru", "label": "Русский" },
429+
{ "value": "en", "label": "English" },
430+
{ "value": "uk", "label": "Українська" }
431+
],
432+
"default": "ru"
433+
},
434+
415435
"proxy": {
416436
"type": "proxy",
417437
"label": "Прокси для запросов",
@@ -434,6 +454,7 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
434454
| `string[]` | Массив строк | `["a", "b"]` |
435455
| `json` | JSON объект | `{"key": "value"}` |
436456
| `json_file` | JSON из файла | Путь к файлу |
457+
| `select` | Выпадающий список | `"normal"` (строка или объект) |
437458
| `proxy` | Выбор прокси (из списка или вручную) | `{ enabled: true, host: "...", port: 1080 }` |
438459

439460
### Структура объекта proxy
@@ -454,6 +475,41 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
454475

455476
Если прокси отключен: `{ enabled: false }`
456477

478+
### Структура настройки select
479+
480+
Настройка типа `select` позволяет пользователю выбрать одно значение из предопределенного списка опций.
481+
482+
**Формат options:**
483+
484+
1. **Простой массив строк** - когда значение и label совпадают:
485+
```javascript
486+
"options": ["easy", "normal", "hard"]
487+
```
488+
489+
2. **Массив объектов** - когда нужны разные value и label:
490+
```javascript
491+
"options": [
492+
{ "value": "ru", "label": "Русский" },
493+
{ "value": "en", "label": "English" },
494+
{ "value": "uk", "label": "Українська" }
495+
]
496+
```
497+
498+
**Результат:**
499+
Сохраненное значение всегда будет строкой (например: `"normal"`, `"ru"`)
500+
501+
**Пример использования в плагине:**
502+
```javascript
503+
module.exports = (bot, { settings }) => {
504+
const mode = settings.mode; // "easy" | "normal" | "hard"
505+
const language = settings.language; // "ru" | "en" | "uk"
506+
507+
if (mode === 'hard') {
508+
console.log('Включён сложный режим');
509+
}
510+
};
511+
```
512+
457513
### Доступ к настройкам
458514

459515
```javascript

frontend/src/components/PluginSettingsForm.jsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,29 @@ function SettingField({ settingKey, config, value, onChange }) {
197197
{config.description && <p className="text-sm text-muted-foreground">{config.description}</p>}
198198
</div>
199199
);
200+
case 'select':
201+
return (
202+
<div className="space-y-2">
203+
<Label htmlFor={id}>{config.label}</Label>
204+
<Select value={value || config.default || ''} onValueChange={(newValue) => onChange(settingKey, newValue)}>
205+
<SelectTrigger id={id}>
206+
<SelectValue placeholder="Выберите значение" />
207+
</SelectTrigger>
208+
<SelectContent>
209+
{(config.options || []).map((option) => {
210+
const optionValue = typeof option === 'string' ? option : option.value;
211+
const optionLabel = typeof option === 'string' ? option : option.label;
212+
return (
213+
<SelectItem key={optionValue} value={optionValue}>
214+
{optionLabel}
215+
</SelectItem>
216+
);
217+
})}
218+
</SelectContent>
219+
</Select>
220+
{config.description && <p className="text-sm text-muted-foreground">{config.description}</p>}
221+
</div>
222+
);
200223
case 'json':
201224
case 'json_file':
202225
return (

0 commit comments

Comments
 (0)