Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
245 changes: 245 additions & 0 deletions experiments/recurrence-fields-documentation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
# Документация по полям повторяемости задач

## Текущая реализация (PR #55)

### 📋 Структура полей для каждого типа повторяемости

#### 1. **Не повторяется** (recurrence = "none")
```
┌─────────────────────────────────────┐
│ Повторяемость: [Не повторяется ▼] │
└─────────────────────────────────────┘
```
**Дополнительные поля:** Нет

---

#### 2. **Ежедневно** (recurrence = "daily")
```
┌─────────────────────────────────────┐
│ Повторяемость: [Ежедневно ▼] │
├─────────────────────────────────────┤
│ Время повторения: [09:30] │
│ (type="time", step="60") │
│ Формат: HH:MM (только час:минута)│
└─────────────────────────────────────┘
```
**Дополнительные поля:**
- ✅ Время повторения (HH:MM)

**Отправка в API:**
```json
{
"recurrence": "daily",
"recurrence_time": "09:30"
}
```

---

#### 3. **Еженедельно** (recurrence = "weekly")
```
┌─────────────────────────────────────┐
│ Повторяемость: [Еженедельно ▼] │
├─────────────────────────────────────┤
│ Время повторения: [14:30] │
│ (type="time", step="60") │
│ Формат: HH:MM (только час:минута)│
├─────────────────────────────────────┤
│ День недели: [Понедельник ▼] │
│ Опции: │
│ - Понедельник (1) │
│ - Вторник (2) │
│ - Среда (3) │
│ - Четверг (4) │
│ - Пятница (5) │
│ - Суббота (6) │
│ - Воскресенье (0) │
└─────────────────────────────────────┘
```
**Дополнительные поля:**
- ✅ Время повторения (HH:MM)
- ✅ День недели (1-6, 0 для воскресенья)

**Отправка в API:**
```json
{
"recurrence": "weekly",
"recurrence_time": "14:30",
"recurrence_day_of_week": 1
}
```

---

#### 4. **Ежемесячно** (recurrence = "monthly")
```
┌─────────────────────────────────────┐
│ Повторяемость: [Ежемесячно ▼] │
├─────────────────────────────────────┤
│ Время повторения: [10:00] │
│ (type="time", step="60") │
│ Формат: HH:MM (только час:минута)│
├─────────────────────────────────────┤
│ День месяца: [15 ▼] │
│ Опции: 1, 2, 3, ..., 31 │
└─────────────────────────────────────┘
```
**Дополнительные поля:**
- ✅ Время повторения (HH:MM)
- ✅ День месяца (1-31)

**Отправка в API:**
```json
{
"recurrence": "monthly",
"recurrence_time": "10:00",
"recurrence_day_of_month": 15
}
```

---

## 🔍 Другие поля формы

### Дата появления (appear_date)
**Текущая реализация:**
```html
<input type="datetime-local" ... />
```
**Формат:** YYYY-MM-DDTHH:MM (год-месяц-день час:минута)
**Пример:** 2025-11-15T09:00

**Вопрос к пользователю:**
Требуется ли изменить это поле на показ только времени (HH:MM)? Если да, как система узнает дату появления задачи?

### Дедлайн (deadline)
**Текущая реализация:**
```html
<input type="datetime-local" ... />
```
**Формат:** YYYY-MM-DDTHH:MM (год-месяц-день час:минута)
**Пример:** 2025-11-20T18:00

---

## ✅ Соответствие требованиям пользователя

Из комментария пользователя:
> "При еженедельным должен быть выбор минут часов дня недели при ежемесячном должен быть выбор конкретных дней месяца и час минуты а при ежедневных только час и минута."

### Проверка:

| Тип повторяемости | Требование | Реализовано | Статус |
|-------------------|-----------|-------------|--------|
| **Ежедневно** | Час + минута | ✅ Время повторения (HH:MM) | ✅ |
| **Еженедельно** | Час + минута + день недели | ✅ Время повторения (HH:MM) + День недели | ✅ |
| **Ежемесячно** | Час + минута + день месяца | ✅ Время повторения (HH:MM) + День месяца | ✅ |
| **Дата появления** | Только час + минута? | ❓ Сейчас: datetime-local (дата+время) | ❓ |

---

## 📝 Реализация в коде

### TaskModal.tsx (строки 204-251)

```typescript
// Поле времени (для всех типов повторяемости кроме "none")
{formData.recurrence !== 'none' && (
<div>
<label className="block text-sm font-medium text-gray-700">Время повторения</label>
<input
type="time"
step="60" // Скрывает секунды, показывает только HH:MM
value={formData.recurrence_time || ''}
onChange={(e) => setFormData({ ...formData, recurrence_time: e.target.value })}
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
/>
</div>
)}

// Поле дня недели (только для еженедельной повторяемости)
{formData.recurrence === 'weekly' && (
<div>
<label className="block text-sm font-medium text-gray-700">День недели</label>
<select
value={formData.recurrence_day_of_week || ''}
onChange={(e) => setFormData({ ...formData, recurrence_day_of_week: e.target.value ? parseInt(e.target.value) : undefined })}
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
>
<option value="">Выберите день недели</option>
<option value="1">Понедельник</option>
<option value="2">Вторник</option>
<option value="3">Среда</option>
<option value="4">Четверг</option>
<option value="5">Пятница</option>
<option value="6">Суббота</option>
<option value="0">Воскресенье</option>
</select>
</div>
)}

// Поле дня месяца (только для ежемесячной повторяемости)
{formData.recurrence === 'monthly' && (
<div>
<label className="block text-sm font-medium text-gray-700">День месяца</label>
<select
value={formData.recurrence_day_of_month || ''}
onChange={(e) => setFormData({ ...formData, recurrence_day_of_month: e.target.value ? parseInt(e.target.value) : undefined })}
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
>
<option value="">Выберите день месяца</option>
{Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
<option key={day} value={day}>{day}</option>
))}
</select>
</div>
)}
```

---

## 🧪 Тестовые сценарии

### Сценарий 1: Ежедневная утренняя задача
**Ввод:**
- Повторяемость: Ежедневно
- Время повторения: 09:00

**Результат:**
- Задача появляется каждый день в 09:00

---

### Сценарий 2: Еженедельная встреча по понедельникам
**Ввод:**
- Повторяемость: Еженедельно
- Время повторения: 14:30
- День недели: Понедельник

**Результат:**
- Задача появляется каждый понедельник в 14:30

---

### Сценарий 3: Ежемесячный отчёт 15-го числа
**Ввод:**
- Повторяемость: Ежемесячно
- Время повторения: 10:00
- День месяца: 15

**Результат:**
- Задача появляется 15-го числа каждого месяца в 10:00

---

## 🔄 История изменений

### PR #53
- Добавлен атрибут `step="60"` для поля времени
- Время отправляется в формате HH:MM (без секунд)

### PR #55
- Добавлено поле "День недели" для еженедельной повторяемости
- Добавлено поле "День месяца" для ежемесячной повторяемости
- Поля появляются условно в зависимости от выбранного типа повторяемости
112 changes: 112 additions & 0 deletions experiments/test-recurrence-fields.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# Тест полей повторяемости задач

## Проблема
Пользователь сообщил: "Браузер показывает так как и раньше, так же там всё ещё стоят год мес и день"

## Анализ
После изучения кода выяснилось, что в `TaskModal.tsx` были установлены значения `recurrence_day_of_week` и `recurrence_day_of_month` в состоянии формы (строки 42-43), но не было соответствующих полей ввода в UI.

## Решение
Добавлены два условных поля ввода:

### 1. Для еженедельной повторяемости (weekly)
- **Поле**: "День недели" (recurrence_day_of_week)
- **Тип**: Выпадающий список (select)
- **Опции**: Понедельник (1) - Воскресенье (0)
- **Условие отображения**: `formData.recurrence === 'weekly'`

### 2. Для ежемесячной повторяемости (monthly)
- **Поле**: "День месяца" (recurrence_day_of_month)
- **Тип**: Выпадающий список (select)
- **Опции**: 1-31
- **Условие отображения**: `formData.recurrence === 'monthly'`

## Структура полей повторяемости

```
Повторяемость: [select] -> Не повторяется / Ежедневно / Еженедельно / Ежемесячно

↓ (если НЕ "Не повторяется")
Время повторения: [time input step="60"] -> HH:MM (без секунд)

↓ (если "Еженедельно")
День недели: [select] -> Понедельник / Вторник / ... / Воскресенье

↓ (если "Ежемесячно")
День месяца: [select] -> 1 / 2 / ... / 31
```

## Изменения в коде

**Файл**: `src/components/tasks/TaskModal.tsx`
**Строки**: 217-251

### Добавленный код для "День недели":
```typescript
{formData.recurrence === 'weekly' && (
<div>
<label className="block text-sm font-medium text-gray-700">День недели</label>
<select
value={formData.recurrence_day_of_week || ''}
onChange={(e) => setFormData({ ...formData, recurrence_day_of_week: e.target.value ? parseInt(e.target.value) : undefined })}
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
>
<option value="">Выберите день недели</option>
<option value="1">Понедельник</option>
<option value="2">Вторник</option>
<option value="3">Среда</option>
<option value="4">Четверг</option>
<option value="5">Пятница</option>
<option value="6">Суббота</option>
<option value="0">Воскресенье</option>
</select>
</div>
)}
```

### Добавленный код для "День месяца":
```typescript
{formData.recurrence === 'monthly' && (
<div>
<label className="block text-sm font-medium text-gray-700">День месяца</label>
<select
value={formData.recurrence_day_of_month || ''}
onChange={(e) => setFormData({ ...formData, recurrence_day_of_month: e.target.value ? parseInt(e.target.value) : undefined })}
className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm px-3 py-2 border"
>
<option value="">Выберите день месяца</option>
{Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
<option key={day} value={day}>{day}</option>
))}
</select>
</div>
)}
```

## Тестирование

### Сценарий 1: Ежедневная повторяемость
1. Выбрать "Ежедневно" в поле "Повторяемость"
2. Появится поле "Время повторения" с форматом ЧЧ:ММ (без секунд)
3. НЕ появятся поля "День недели" или "День месяца"

### Сценарий 2: Еженедельная повторяемость
1. Выбрать "Еженедельно" в поле "Повторяемость"
2. Появится поле "Время повторения" с форматом ЧЧ:ММ
3. Появится поле "День недели" с выбором дня недели

### Сценарий 3: Ежемесячная повторяемость
1. Выбрать "Ежемесячно" в поле "Повторяемость"
2. Появится поле "Время повторения" с форматом ЧЧ:ММ
3. Появится поле "День месяца" с выбором числа от 1 до 31

### Сценарий 4: Без повторяемости
1. Выбрать "Не повторяется" в поле "Повторяемость"
2. НЕ появятся никакие дополнительные поля

## Результаты сборки
- ✅ Build successful (TypeScript компиляция без ошибок)
- ✅ Lint: нет новых ошибок (38 существующих ошибок не связаны с этим изменением)

## Ответ на issue #54
Теперь пользователь может видеть и выбирать "день" (день недели или день месяца) в зависимости от выбранного типа повторяемости. Это решает проблему отсутствия полей для указания конкретного дня повторения задачи.
Loading