From 93b50aef4c2a28d67e9a4187dd0e782c91acd097 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 14 Nov 2025 22:47:31 +0000 Subject: [PATCH 1/6] Initial commit with task details for issue #54 Adding CLAUDE.md with task information for AI processing. This file will be removed when the task is complete. Issue: https://github.com/xierongchuan/TaskMateFrontend/issues/54 --- CLAUDE.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 4d47fc9..c2e4484 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -154,3 +154,15 @@ The application supports multi-tenancy through dealership-based data filtering. - Error messages are user-friendly and localized - Component styling follows Tailwind CSS patterns with consistent design tokens - Form validation includes both client-side and server-side error handling + +--- + +Issue to solve: https://github.com/xierongchuan/TaskMateFrontend/issues/54 +Your prepared branch: issue-54-6a2337c11b90 +Your prepared working directory: /tmp/gh-issue-solver-1763160445215 +Your forked repository: konard/TaskMateFrontend +Original repository (upstream): xierongchuan/TaskMateFrontend + +Proceed. + +Run timestamp: 2025-11-14T22:47:30.988Z \ No newline at end of file From 5a36dbef42b96326cbbb0957266ee98a873a8940 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 14 Nov 2025 22:52:14 +0000 Subject: [PATCH 2/6] feat(tasks): add day/month selector fields for recurring tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes issue where users couldn't specify which day of week (for weekly recurrence) or which day of month (for monthly recurrence) when creating recurring tasks. Changes: - Add "День недели" (day of week) selector for weekly recurrence (values 0-6) - Add "День месяца" (day of month) selector for monthly recurrence (values 1-31) - Fields appear conditionally based on recurrence type selection - Follows existing UI patterns with consistent styling The recurrence_day_of_week and recurrence_day_of_month fields were being set in formData but had no corresponding UI inputs, causing confusion for users. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- experiments/test-recurrence-fields.md | 112 ++++++++++++++++++++++++++ src/components/tasks/TaskModal.tsx | 36 +++++++++ 2 files changed, 148 insertions(+) create mode 100644 experiments/test-recurrence-fields.md 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/src/components/tasks/TaskModal.tsx b/src/components/tasks/TaskModal.tsx index 0e8cb1f..87ed3b1 100644 --- a/src/components/tasks/TaskModal.tsx +++ b/src/components/tasks/TaskModal.tsx @@ -214,6 +214,42 @@ export const TaskModal: React.FC = ({ isOpen, onClose, task }) = )} + {formData.recurrence === 'weekly' && ( +
+ + +
+ )} + + {formData.recurrence === 'monthly' && ( +
+ + +
+ )} +
From ce6a6c50dc348b856e448d58e19db0984e69c6eb Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 14 Nov 2025 22:53:40 +0000 Subject: [PATCH 3/6] Revert "Initial commit with task details for issue #54" This reverts commit 93b50aef4c2a28d67e9a4187dd0e782c91acd097. --- CLAUDE.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index c2e4484..4d47fc9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -154,15 +154,3 @@ The application supports multi-tenancy through dealership-based data filtering. - Error messages are user-friendly and localized - Component styling follows Tailwind CSS patterns with consistent design tokens - Form validation includes both client-side and server-side error handling - ---- - -Issue to solve: https://github.com/xierongchuan/TaskMateFrontend/issues/54 -Your prepared branch: issue-54-6a2337c11b90 -Your prepared working directory: /tmp/gh-issue-solver-1763160445215 -Your forked repository: konard/TaskMateFrontend -Original repository (upstream): xierongchuan/TaskMateFrontend - -Proceed. - -Run timestamp: 2025-11-14T22:47:30.988Z \ No newline at end of file From c983952ef2336548595985fede8b17af937b0a49 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 14 Nov 2025 22:55:06 +0000 Subject: [PATCH 4/6] test: add browser test for time input display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add interactive HTML test to verify time input behavior with different step attributes and compare with datetime-local input. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- experiments/test-time-input-browser.html | 115 +++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 experiments/test-time-input-browser.html 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: +
+
+ + + + From 45c5c3f7ac0f041f0de540a3f2b0be88de959c81 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 14 Nov 2025 23:09:44 +0000 Subject: [PATCH 5/6] docs: add comprehensive recurrence fields documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added detailed documentation explaining: - Current implementation of recurrence fields for daily/weekly/monthly tasks - Visual diagrams showing field structure for each recurrence type - Code references from TaskModal.tsx - Test scenarios and examples - Verification that current implementation meets user requirements The documentation confirms that all recurrence requirements are already met: ✅ Daily: hour + minute ✅ Weekly: hour + minute + day of week ✅ Monthly: hour + minute + day of month Awaiting user clarification on the "Дата появления" field requirement. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../recurrence-fields-documentation.md | 245 ++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 experiments/recurrence-fields-documentation.md 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 +- Добавлено поле "День недели" для еженедельной повторяемости +- Добавлено поле "День месяца" для ежемесячной повторяемости +- Поля появляются условно в зависимости от выбранного типа повторяемости From 055f8c69deff9e0bbd793a20b22d29ea97dd595a Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 14 Nov 2025 23:28:14 +0000 Subject: [PATCH 6/6] fix(tasks): prevent sending recurrence fields when recurrence is 'none' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлена проблема, когда при создании единовременной задачи (recurrence: 'none') в API отправлялись поля recurrence_time, recurrence_day_of_week и recurrence_day_of_month, что приводило к ошибкам валидации на сервере. Изменения: 1. При recurrence = 'none' теперь удаляются все связанные поля перед отправкой 2. При изменении типа повторяемости автоматически очищаются неактуальные поля 3. При recurrence = 'weekly' удаляется recurrence_day_of_month 4. При recurrence = 'monthly' удаляется recurrence_day_of_week 5. При recurrence = 'daily' удаляются оба специфичных поля Это устраняет ошибки валидации: - "The selected recurrence is invalid." - "The recurrence time field must match the format H:i:s." Fixes #54 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/tasks/TaskModal.tsx | 46 +++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/components/tasks/TaskModal.tsx b/src/components/tasks/TaskModal.tsx index 87ed3b1..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 }) =