feat: Refactor login screen - fix compilation error
This commit is contained in:
@@ -1,98 +1,51 @@
|
||||
<![CDATA[
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<WORK_ORDER>
|
||||
<META>
|
||||
<VERSION>1.0</VERSION>
|
||||
<CREATED_AT>{timestamp}</CREATED_AT>
|
||||
<TITLE>[ARCHITECT -> DEV] Refactor Item Edit Screen</TITLE>
|
||||
<DESCRIPTION>
|
||||
This work order instructs the developer agent to refactor the Item Edit screen to include all available API fields and implement a user-friendly, grouped layout.
|
||||
</DESCRIPTION>
|
||||
<ASSIGNED_TO>agent-developer</ASSIGNED_TO>
|
||||
<LABELS>type::refactoring,feature::item-edit,status::pending</LABELS>
|
||||
<ID>WO-ITEMEDIT-FIX</ID>
|
||||
<TITLE>[ARCHITECT -> DEV] Исправление выбора локации и меток на экране ItemEdit</TITLE>
|
||||
<DESCRIPTION>В текущей реализации на экране редактирования/создания элемента (ItemEditScreen) поля "Location" и "Labels" неактивны. Необходимо реализовать функционал выбора значения для этих полей из списка доступных.</DESCRIPTION>
|
||||
<CREATED_BY>architect-agent</CREATED_BY>
|
||||
<ASSIGNED_TO>developer-agent</ASSIGNED_TO>
|
||||
<STATUS>pending</STATUS>
|
||||
</META>
|
||||
|
||||
<SPECIFICATION>
|
||||
<GOAL>
|
||||
The primary goal is to refactor the `ItemEditScreen` to include all available fields from the Homebox API for creating and updating items, and to present them in a user-friendly manner.
|
||||
</GOAL>
|
||||
|
||||
<CONTEXT>
|
||||
<FILE_LIST>
|
||||
<FILE path="domain/src/main/java/com/homebox/lens/domain/model/Item.kt" />
|
||||
<FILE path="data/src/main/java/com/homebox/lens/data/db/entity/ItemEntity.kt" />
|
||||
<FILE path="data/src/main/java/com/homebox/lens/data/api/dto/ItemCreateDto.kt" />
|
||||
<FILE path="data/src/main/java/com/homebox/lens/data/api/dto/ItemUpdateDto.kt" />
|
||||
<FILE path="data/src/main/java/com/homebox/lens/data/api/dto/ItemOutDto.kt" />
|
||||
<FILE path="data/src/main/java/com/homebox/lens/data/db/entity/Mapper.kt" />
|
||||
<FILE path="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt" />
|
||||
<FILE path="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" />
|
||||
</FILE_LIST>
|
||||
</CONTEXT>
|
||||
</SPECIFICATION>
|
||||
|
||||
<EXECUTION_PLAN>
|
||||
<STEP id="1" name="Update Domain Model">
|
||||
<ACTION>Modify `domain/src/main/java/com/homebox/lens/domain/model/Item.kt`.</ACTION>
|
||||
<TASK_BREAKDOWN>
|
||||
<STEP n="1" file="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt">
|
||||
<ACTION>Загрузка списков локаций и меток.</ACTION>
|
||||
<DETAILS>
|
||||
- Add the following fields to the `Item` data class:
|
||||
- `archived: Boolean`
|
||||
- `assetId: String?`
|
||||
- `fields: List<CustomField>`
|
||||
- `insured: Boolean`
|
||||
- `lifetimeWarranty: Boolean`
|
||||
- `manufacturer: String?`
|
||||
- `modelNumber: String?`
|
||||
- `notes: String?`
|
||||
- `parentId: String?`
|
||||
- `purchaseFrom: String?`
|
||||
- `purchaseTime: String?`
|
||||
- `serialNumber: String?`
|
||||
- `soldNotes: String?`
|
||||
- `soldPrice: Double?`
|
||||
- `soldTime: String?`
|
||||
- `soldTo: String?`
|
||||
- `syncChildItemsLocations: Boolean`
|
||||
- `warrantyDetails: String?`
|
||||
- `warrantyExpires: String?`
|
||||
- Rename the existing `value: BigDecimal?` field to `purchasePrice: Double?`.
|
||||
1. Внедрите `GetAllLocationsUseCase` и `GetAllLabelsUseCase` в `ItemEditViewModel`.
|
||||
2. Обновите `ItemEditUiState`, добавив два новых поля: `val allLocations: List<Location> = emptyList()` и `val allLabels: List<Label> = emptyList()`.
|
||||
3. В функции `loadItem`, после загрузки основной информации о товаре, вызовите `getAllLocationsUseCase` и `getAllLabelsUseCase` и обновите `uiState` полученными списками.
|
||||
4. Добавьте публичные методы `updateLocation(location: Location)` и `updateLabels(labels: List<Label>)` для обновления `item` в `uiState`.
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
|
||||
<STEP id="2" name="Update Data Layer">
|
||||
<ACTION>Update database entity, DTOs, and mappers.</ACTION>
|
||||
<STEP n="2" file="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt">
|
||||
<ACTION>Реализация UI для выбора локации.</ACTION>
|
||||
<DETAILS>
|
||||
- Modify `data/src/main/java/com/homebox/lens/data/db/entity/ItemEntity.kt` to reflect the new `Item` model.
|
||||
- Ensure `ItemCreateDto`, `ItemUpdateDto`, and `ItemOutDto` contain all necessary fields according to the API spec.
|
||||
- Update the mapping functions in `data/src/main/java/com/homebox/lens/data/db/entity/Mapper.kt` to handle all new fields correctly across all layers.
|
||||
1. Замените `OutlinedTextField` для локации на `ExposedDropdownMenuBox`.
|
||||
2. В качестве `dropdownMenu` используйте `DropdownMenuItem` для каждого элемента из `uiState.allLocations`.
|
||||
3. При выборе элемента из списка вызывайте `viewModel.updateLocation(selectedLocation)`.
|
||||
4. В `ExposedDropdownMenuBox` должно отображаться `item.location?.name`.
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
|
||||
<STEP id="3" name="Update ViewModel">
|
||||
<ACTION>Modify `app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt`.</ACTION>
|
||||
<STEP n="3" file="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt">
|
||||
<ACTION>Реализация UI для выбора меток (множественный выбор).</ACTION>
|
||||
<DETAILS>
|
||||
- Update `loadItem` and `saveItem` to handle the state for all new fields.
|
||||
- Add public functions to update the state for each new field (e.g., `updateManufacturer(String)`, `toggleInsured(Boolean)`).
|
||||
1. Поле для меток `Labels` должно оставаться `OutlinedTextField` (read-only), но `onClick` по нему должен открывать диалоговое окно (`AlertDialog`).
|
||||
2. В `AlertDialog` отобразите список всех меток (`uiState.allLabels`) с `Checkbox`'ами.
|
||||
3. Состояние `Checkbox`'ов должно соответствовать списку `item.labels`.
|
||||
4. При нажатии на "OK" в диалоге, вызывайте `viewModel.updateLabels(selectedLabels)`.
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
</TASK_BREAKDOWN>
|
||||
|
||||
<STEP id="4" name="Implement UI">
|
||||
<ACTION>Refactor `app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt`.</ACTION>
|
||||
<DETAILS>
|
||||
- Implement a user-friendly layout using tabs or expandable cards for the following groups: General, Purchase, Warranty, Identification, Status & Notes.
|
||||
- Use appropriate controls for each field type (e.g., `Switch` for booleans, Date Picker for dates).
|
||||
- Connect all UI controls to the ViewModel.
|
||||
- Implement basic input validation.
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
</EXECUTION_PLAN>
|
||||
<ACCEPTANCE_CRITERIA>
|
||||
<CRITERION>При нажатии на поле "Location" открывается выпадающий список со всеми локациями.</CRITERION>
|
||||
<CRITERION>Выбранная локация отображается в поле и сохраняется вместе с элементом.</CRITERION>
|
||||
<CRITERION>При нажатии на поле "Labels" открывается диалоговое окно со списком всех меток и чекбоксами.</CRITERION>
|
||||
<CRITERION>Выбранные метки отображаются в поле и сохраняются вместе с элементом.</CRITERION>
|
||||
</ACCEPTANCE_CRITERIA>
|
||||
|
||||
<VERIFICATION>
|
||||
<CHECK>The application compiles successfully.</CHECK>
|
||||
<CHECK>The Item Edit screen displays all new fields, grouped logically.</CHECK>
|
||||
<CHECK>Creating a new item with all fields populated works correctly.</CHECK>
|
||||
<CHECK>Editing an existing item and modifying the new fields works correctly.</CHECK>
|
||||
<CHECK>Data is persisted correctly and is visible in the Item Details screen after saving.</CHECK>
|
||||
</VERIFICATION>
|
||||
|
||||
</WORK_ORDER>
|
||||
]]>
|
||||
</WORK_ORDER>
|
||||
59
tasks/work_order_login_screen.xml
Normal file
59
tasks/work_order_login_screen.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<WORK_ORDER>
|
||||
<META>
|
||||
<ID>WO-LOGIN-REFACTOR</ID>
|
||||
<TITLE>[ARCHITECT -> DEV] Рефакторинг экрана входа и логики первого запуска</TITLE>
|
||||
<DESCRIPTION>Цель этой задачи - изменить логику запуска приложения. Экран входа (SetupScreen) должен появляться только при первом запуске, когда учетные данные еще не сохранены. В последующие запуски пользователь должен сразу попадать на главный экран (Dashboard). Также необходимо улучшить визуальное оформление экрана входа.</DESCRIPTION>
|
||||
<CREATED_BY>architect-agent</CREATED_BY>
|
||||
<ASSIGNED_TO>developer-agent</ASSIGNED_TO>
|
||||
<STATUS>pending</STATUS>
|
||||
</META>
|
||||
|
||||
<TASK_BREAKDOWN>
|
||||
<STEP n="1" file="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupViewModel.kt">
|
||||
<ACTION>Добавить public-метод для синхронной проверки наличия учетных данных.</ACTION>
|
||||
<DETAILS>
|
||||
Добавьте в класс `SetupViewModel` новый метод `fun areCredentialsSaved(): Boolean`.
|
||||
Этот метод должен синхронно проверять, сохранены ли учетные данные в `CredentialsRepository`.
|
||||
Текущая реализация `getCredentials()` асинхронна, что не подходит для быстрой проверки в `NavGraph`.
|
||||
Вам может потребоваться изменить `CredentialsRepository` для поддержки синхронной проверки (например, используя `SharedPreferences` напрямую).
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
|
||||
<STEP n="2" file="app/src/main/java/com/homebox/lens/ui/screen/splash/SplashScreen.kt">
|
||||
<ACTION>Создать новый `SplashScreen`.</ACTION>
|
||||
<DETAILS>
|
||||
Создайте новый Composable-экран `SplashScreen.kt`.
|
||||
Этот экран будет новой точкой входа в `NavGraph`.
|
||||
Он будет использовать `SetupViewModel` для вызова `areCredentialsSaved()` и, в зависимости от результата, немедленно навигироваться либо на `Screen.Setup`, либо на `Screen.Dashboard`.
|
||||
Пока идет проверка, на экране должен отображаться `CircularProgressIndicator`.
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
|
||||
<STEP n="3" file="app/src/main/java/com/homebox/lens/navigation/NavGraph.kt">
|
||||
<ACTION>Обновить `NavGraph` для использования `SplashScreen`.</ACTION>
|
||||
<DETAILS>
|
||||
Измените `startDestination` в `NavHost` на `Screen.Splash.route`.
|
||||
Добавьте `composable` для `SplashScreen`.
|
||||
В `SplashScreen` вызовите `navController.navigate` с очисткой бэкстека (`popUpTo(Screen.Splash.route) { inclusive = true }`), чтобы пользователь не мог вернуться на сплэш-экран.
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
|
||||
<STEP n="4" file="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt">
|
||||
<ACTION>Улучшить UI экрана `SetupScreen`.</ACTION>
|
||||
<DETAILS>
|
||||
Текущий UI слишком прост. Добавьте заголовок, иконку приложения, и более приятное расположение элементов.
|
||||
Используйте `Card` для группировки полей ввода. Добавьте `Spacer` для лучшего отступа.
|
||||
Кнопку "Connect" сделайте более заметной.
|
||||
</DETAILS>
|
||||
</STEP>
|
||||
|
||||
</TASK_BREAKDOWN>
|
||||
|
||||
<ACCEPTANCE_CRITERIA>
|
||||
<CRITERION>При первом запуске приложения открывается `SetupScreen`.</CRITERION>
|
||||
<CRITERION>После успешного ввода данных и входа, при последующих перезапусках приложения открывается `DashboardScreen`, минуя `SetupScreen`.</CRITERION>
|
||||
<CRITERION>`SetupScreen` имеет улучшенный и более привлекательный дизайн.</CRITERION>
|
||||
</ACCEPTANCE_CRITERIA>
|
||||
|
||||
</WORK_ORDER>
|
||||
Reference in New Issue
Block a user