diff --git a/experiments/recurrence-fields-documentation.md b/experiments/recurrence-fields-documentation.md new file mode 100644 index 0000000..1c6a3ca --- /dev/null +++ b/experiments/recurrence-fields-documentation.md @@ -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 + +``` +**Формат:** YYYY-MM-DDTHH:MM (год-месяц-день час:минута) +**Пример:** 2025-11-15T09:00 + +**Вопрос к пользователю:** +Требуется ли изменить это поле на показ только времени (HH:MM)? Если да, как система узнает дату появления задачи? + +### Дедлайн (deadline) +**Текущая реализация:** +```html + +``` +**Формат:** 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' && ( +
+ + 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" + /> +
+)} + +// Поле дня недели (только для еженедельной повторяемости) +{formData.recurrence === 'weekly' && ( +
+ + +
+)} + +// Поле дня месяца (только для ежемесячной повторяемости) +{formData.recurrence === 'monthly' && ( +
+ + +
+)} +``` + +--- + +## 🧪 Тестовые сценарии + +### Сценарий 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 +- Добавлено поле "День недели" для еженедельной повторяемости +- Добавлено поле "День месяца" для ежемесячной повторяемости +- Поля появляются условно в зависимости от выбранного типа повторяемости diff --git a/experiments/test-recurrence-fields.md b/experiments/test-recurrence-fields.md new file mode 100644 index 0000000..ceb3bf8 --- /dev/null +++ b/experiments/test-recurrence-fields.md @@ -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' && ( +
+ + +
+)} +``` + +### Добавленный код для "День месяца": +```typescript +{formData.recurrence === 'monthly' && ( +
+ + +
+)} +``` + +## Тестирование + +### Сценарий 1: Ежедневная повторяемость +1. Выбрать "Ежедневно" в поле "Повторяемость" +2. Появится поле "Время повторения" с форматом ЧЧ:ММ (без секунд) +3. НЕ появятся поля "День недели" или "День месяца" + +### Сценарий 2: Еженедельная повторяемость +1. Выбрать "Еженедельно" в поле "Повторяемость" +2. Появится поле "Время повторения" с форматом ЧЧ:ММ +3. Появится поле "День недели" с выбором дня недели + +### Сценарий 3: Ежемесячная повторяемость +1. Выбрать "Ежемесячно" в поле "Повторяемость" +2. Появится поле "Время повторения" с форматом ЧЧ:ММ +3. Появится поле "День месяца" с выбором числа от 1 до 31 + +### Сценарий 4: Без повторяемости +1. Выбрать "Не повторяется" в поле "Повторяемость" +2. НЕ появятся никакие дополнительные поля + +## Результаты сборки +- ✅ Build successful (TypeScript компиляция без ошибок) +- ✅ Lint: нет новых ошибок (38 существующих ошибок не связаны с этим изменением) + +## Ответ на issue #54 +Теперь пользователь может видеть и выбирать "день" (день недели или день месяца) в зависимости от выбранного типа повторяемости. Это решает проблему отсутствия полей для указания конкретного дня повторения задачи. diff --git a/experiments/test-time-input-browser.html b/experiments/test-time-input-browser.html new file mode 100644 index 0000000..17a8370 --- /dev/null +++ b/experiments/test-time-input-browser.html @@ -0,0 +1,115 @@ + + + + + + Time Input Test + + + +

Тест поля времени (Time Input Test)

+ +
+

1. Обычный time input (БЕЗ step="60")

+ + +
+ Значение: 14:30:00 +
+
+ +
+

2. Time input С step="60"

+ + +
+ Значение: 14:30 +
+
+ +
+

3. datetime-local input (для сравнения)

+ + +
+ Значение: 2025-11-14T14:30 +
+
+ +
+

4. Time input С step="1" (показывает секунды)

+ + +
+ Значение: 14:30:45 +
+
+ +
+

Информация о браузере

+
+ User Agent: +
+
+ + + + diff --git a/src/components/tasks/TaskModal.tsx b/src/components/tasks/TaskModal.tsx index 0e8cb1f..3816092 100644 --- a/src/components/tasks/TaskModal.tsx +++ b/src/components/tasks/TaskModal.tsx @@ -84,9 +84,27 @@ export const TaskModal: React.FC = ({ isOpen, onClose, task }) = // Format recurrence_time to HH:MM (remove seconds if present) const dataToSubmit = { ...formData }; - if (dataToSubmit.recurrence_time) { - // Extract only HH:MM from HH:MM:SS format - dataToSubmit.recurrence_time = dataToSubmit.recurrence_time.substring(0, 5); + + // Clean up recurrence-related fields when recurrence is 'none' + if (dataToSubmit.recurrence === 'none') { + delete dataToSubmit.recurrence_time; + delete dataToSubmit.recurrence_day_of_week; + delete dataToSubmit.recurrence_day_of_month; + } else { + if (dataToSubmit.recurrence_time) { + // Extract only HH:MM from HH:MM:SS format + dataToSubmit.recurrence_time = dataToSubmit.recurrence_time.substring(0, 5); + } + + // Clean up day_of_week if not weekly + if (dataToSubmit.recurrence !== 'weekly') { + delete dataToSubmit.recurrence_day_of_week; + } + + // Clean up day_of_month if not monthly + if (dataToSubmit.recurrence !== 'monthly') { + delete dataToSubmit.recurrence_day_of_month; + } } if (task) { @@ -191,7 +209,27 @@ export const TaskModal: React.FC = ({ isOpen, onClose, task }) = 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" + > + + + + + + + + + + + )} + + {formData.recurrence === 'monthly' && ( +
+ + +
+ )} +