- Add missing quantity field to Item model - Add missing string resources and translations - Fix unresolved references in UI screens
584 lines
46 KiB
XML
584 lines
46 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<PROJECT_SPECIFICATION>
|
||
<PROJECT_INFO>
|
||
<name>Homebox Lens</name>
|
||
<description>Android-клиент для системы управления инвентарем Homebox. Позволяет пользователям управлять своим инвентарем, взаимодействуя с экземпляром сервера Homebox.</description>
|
||
</PROJECT_INFO>
|
||
|
||
<TECHNICAL_DECISIONS>
|
||
<DECISION id="tech_logging" status="implemented">
|
||
<summary>Библиотека логирования</summary>
|
||
<description>В проекте используется Timber (timber.log.Timber) для всех целей логирования. Он предоставляет простой и расширяемый API для логирования.</description>
|
||
<EXAMPLE lang="kotlin">
|
||
<summary>Пример корректного использования Timber</summary>
|
||
<code>
|
||
<![CDATA[
|
||
// Правильно: Прямой вызов статических методов Timber.
|
||
// Для информационных сообщений (INFO):
|
||
Timber.i("User logged in successfully. UserId: %s", userId)
|
||
|
||
// Для отладочных сообщений (DEBUG):
|
||
Timber.d("Starting network request to /items")
|
||
|
||
// Для ошибок (ERROR):
|
||
try {
|
||
// какая-то операция, которая может провалиться
|
||
} catch (e: Exception) {
|
||
Timber.e(e, "Failed to fetch user profile.")
|
||
}
|
||
|
||
// НЕПРАВИЛЬНО: Попытка создать экземпляр логгера.
|
||
// val logger = Timber.tag("MyScreen") // Избегать этого!
|
||
// logger.info("Some message") // Этот метод не существует в API Timber.
|
||
]]>
|
||
</code>
|
||
</EXAMPLE>
|
||
</DECISION>
|
||
<DECISION id="tech_i18n" status="implemented">
|
||
<summary>Интернационализация (Мультиязычность)</summary>
|
||
<description>
|
||
Приложение должно поддерживать несколько языков для обеспечения доступности для глобальной аудитории.
|
||
Реализация будет основана на стандартном механизме ресурсов Android.
|
||
- Все строки, видимые пользователю, должны быть вынесены в файл `app/src/main/res/values/strings.xml`. Использование жестко закодированных строк в коде запрещено.
|
||
- Язык по умолчанию - русский (ru). Файл `strings.xml` будет содержать русские строки.
|
||
- Для поддержки других языков (например, английского - en) будут создаваться соответствующие каталоги ресурсов (например, `app/src/main/res/values-en/strings.xml`).
|
||
- В коде для доступа к строкам необходимо использовать ссылки на ресурсы (например, `R.string.app_name`).
|
||
</description>
|
||
</DECISION>
|
||
<DECISION id="tech_ui_framework" status="implemented">
|
||
<summary>UI Framework</summary>
|
||
<description>Пользовательский интерфейс приложения построен с использованием Jetpack Compose, современного декларативного UI-фреймворка от Google. Это обеспечивает быстрое создание, гибкость и поддержку динамических данных.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_di" status="implemented">
|
||
<summary>Внедрение зависимостей (Dependency Injection)</summary>
|
||
<description>Для управления зависимостями в проекте используется Hilt. Он интегрирован с компонентами Jetpack и упрощает внедрение зависимостей в Android-приложениях.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_navigation" status="implemented">
|
||
<summary>Навигация</summary>
|
||
<description>Навигация между экранами (Composable-функциями) реализована с помощью библиотеки Navigation Compose, которая является частью Jetpack Navigation.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_async" status="implemented">
|
||
<summary>Асинхронные операции</summary>
|
||
<description>Все асинхронные операции, такие как сетевые запросы или доступ к базе данных, выполняются с использованием Kotlin Coroutines. Это обеспечивает эффективное управление фоновыми задачами без блокировки основного потока.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_networking" status="implemented">
|
||
<summary>Сетевое взаимодействие</summary>
|
||
<description>Для взаимодействия с API сервера Homebox используется стек технологий: Retrofit для создания типобезопасных HTTP-клиентов, OkHttp в качестве HTTP-клиента и Moshi для парсинга JSON.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_database" status="implemented">
|
||
<summary>Локальное хранилище</summary>
|
||
<description>Для кэширования данных на устройстве используется библиотека Room. Она предоставляет абстракцию над SQLite и обеспечивает надежное локальное хранение данных.</description>
|
||
</DECISION>
|
||
</TECHNICAL_DECISIONS>
|
||
|
||
<SECURITY_SPEC>
|
||
<Description>Спецификация безопасности проекта.</Description>
|
||
<PRINCIPLE>Все сетевые взаимодействия должны быть защищены HTTPS. Аутентификация пользователя хранится в EncryptedSharedPreferences. Обработка ошибок аутентификации должна включать logout и редирект на экран логина.</PRINCIPLE>
|
||
<RULE name="AuthHandling">Использовать JWT или API-ключ для авторизации запросов. При истечении токена автоматически обновлять.</RULE>
|
||
<RULE name="DataEncryption">Локальные данные (credentials) шифровать с помощью Android KeyStore.</RULE>
|
||
</SECURITY_SPEC>
|
||
|
||
<ERROR_HANDLING>
|
||
<Description>Спецификация обработки ошибок.</Description>
|
||
<PRINCIPLE>Все потенциальные ошибки (сеть, БД, валидация) должны быть обработаны с использованием sealed classes для ошибок (e.g., NetworkError, ValidationError) и отображаться пользователю через Snackbar или Dialog.</PRINCIPLE>
|
||
<SCENARIO name="NetworkFailure">При сетевых ошибках показывать сообщение "No internet connection" и предлагать retry.</SCENARIO>
|
||
<SCENARIO name="ServerError">Для HTTP 4xx/5xx отображать user-friendly сообщение на основе response body.</SCENARIO>
|
||
<SCENARIO name="ValidationError">Использовать require/check для контрактов, логировать и показывать toast.</SCENARIO>
|
||
</ERROR_HANDLING>
|
||
|
||
<DATA_MODELS>
|
||
<MODEL id="model_item" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Item.kt" status="implemented">
|
||
<summary>Модель инвентарного товара.</summary>
|
||
<description>Содержит поля: id, name, description, quantity, location, labels, customFields.</description>
|
||
</MODEL>
|
||
<MODEL id="model_label" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Label.kt" status="implemented">
|
||
<summary>Модель метки.</summary>
|
||
<description>Содержит поля: id, name, color.</description>
|
||
</MODEL>
|
||
<MODEL id="model_location" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Location.kt" status="implemented">
|
||
<summary>Модель местоположения.</summary>
|
||
<description>Содержит поля: id, name, parentLocation.</description>
|
||
</MODEL>
|
||
<MODEL id="model_statistics" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Statistics.kt" status="implemented">
|
||
<summary>Модель статистики инвентаря.</summary>
|
||
<description>Содержит поля: totalItems, totalValue, locationsCount, labelsCount.</description>
|
||
</MODEL>
|
||
</DATA_MODELS>
|
||
|
||
<FEATURES>
|
||
<FEATURE id="feat_dashboard" status="implemented">
|
||
<summary>Экран панели управления</summary>
|
||
<description>Отображает сводку по инвентарю, включая статистику, такую как общее количество товаров, общая стоимость и количество по местоположениям/меткам.</description>
|
||
<UI_COMPONENT ref_id="screen_dashboard" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_get_stats" status="implemented">
|
||
<summary>Получение и отображение статистики</summary>
|
||
<description>Получает общую статистику по инвентарю с сервера.</description>
|
||
<precondition>Пользователь аутентифицирован; сеть доступна.</precondition>
|
||
<postcondition>Возвращает объект Statistics; данные кэшированы локально.</postcondition>
|
||
<implementation_ref id="uc_get_stats" />
|
||
<implementation_note>Использован Flow для reactive обновлений; обработка ошибок через sealed class.</implementation_note>
|
||
</FUNCTION>
|
||
<FUNCTION id="func_get_recent_items" status="implemented">
|
||
<summary>Получение и отображение недавно добавленных товаров</summary>
|
||
<description>Получает список последних N добавленных товаров из локальной базы данных.</description>
|
||
<precondition>Пользователь аутентифицирован.</precondition>
|
||
<postcondition>Возвращает Flow со списком ItemSummary; список отсортирован по дате создания.</postcondition>
|
||
<implementation_ref id="uc_get_recent_items" />
|
||
<implementation_note>Данные берутся из локального кэша (Room) для быстрого отображения.</implementation_note>
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_inventory_list" status="implemented">
|
||
<summary>Экран списка инвентаря</summary>
|
||
<description>Отображает список всех инвентарных позиций с возможностью поиска и фильтрации.</description>
|
||
<UI_COMPONENT ref_id="screen_inventory_list" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_search_items" status="implemented">
|
||
<summary>Поиск и фильтрация товаров</summary>
|
||
<description>Ищет товары по строке запроса и фильтрам. Результаты разбиты на страницы.</description>
|
||
<precondition>Запрос не пустой; параметры пагинации валидны (page >= 1).</precondition>
|
||
<postcondition>Возвращает список Item с пагинацией; результаты отсортированы по релевантности.</postcondition>
|
||
<implementation_ref id="uc_search_items" />
|
||
<implementation_note>Поддержка фильтров по location/label; кэширование результатов для оффлайн.</implementation_note>
|
||
</FUNCTION>
|
||
<FUNCTION id="func_sync_inventory" status="implemented">
|
||
<summary>Синхронизация инвентаря</summary>
|
||
<description>Выполняет полную синхронизацию локального кэша инвентаря с сервером.</description>
|
||
<precondition>Сеть доступна; пользователь аутентифицирован.</precondition>
|
||
<postcondition>Локальная БД обновлена; возвращает success/failure.</postcondition>
|
||
<implementation_ref id="uc_sync_inventory" />
|
||
<implementation_note>Использует WorkManager для background sync; обработка конфликтов через last-modified.</implementation_note>
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_item_details" status="implemented">
|
||
<summary>Экран сведений о товаре</summary>
|
||
<description>Показывает все сведения о конкретном инвентарном товаре, включая его название, описание, изображения, вложения и настраиваемые поля.</description>
|
||
<UI_COMPONENT ref_id="screen_item_details" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_get_item_details" status="implemented">
|
||
<summary>Получение сведений о товаре</summary>
|
||
<description>Получает полные сведения о конкретном товаре из репозитория.</description>
|
||
<precondition>Item ID валиден и существует.</precondition>
|
||
<postcondition>Возвращает полный объект Item с attachments.</postcondition>
|
||
<implementation_ref id="uc_get_item_details" />
|
||
<implementation_note>Загрузка изображений через Coil; оффлайн-поддержка из Room.</implementation_note>
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_item_management" status="implemented">
|
||
<summary>Создание/редактирование/удаление товаров</summary>
|
||
<description>Позволяет пользователям создавать новые товары, обновлять существующие и удалять их.</description>
|
||
<UI_COMPONENT ref_id="screen_item_edit" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_create_item" status="implemented">
|
||
<summary>Создать товар</summary>
|
||
<description>Создает новый инвентарный товар на сервере.</description>
|
||
<precondition>Все обязательные поля (name, quantity) заполнены; данные валидны.</precondition>
|
||
<postcondition>Новый Item сохранен на сервере; ID возвращен.</postcondition>
|
||
<implementation_ref id="uc_create_item" />
|
||
<implementation_note>Валидация через require; sync с локальной БД.</implementation_note>
|
||
</FUNCTION>
|
||
<FUNCTION id="func_update_item" status="implemented">
|
||
<summary>Обновить товар</summary>
|
||
<description>Обновляет существующий инвентарный товар на сервере.</description>
|
||
<precondition>Item ID существует; изменения валидны.</precondition>
|
||
<postcondition>Item обновлен; версия инкрементирована.</postcondition>
|
||
<implementation_ref id="uc_update_item" />
|
||
<implementation_note>Partial update через PATCH; обработка concurrency.</implementation_note>
|
||
</FUNCTION>
|
||
<FUNCTION id="func_delete_item" status="implemented">
|
||
<summary>Удалить товар</summary>
|
||
<description>Удаляет инвентарный товар с сервера.</description>
|
||
<precondition>Item ID существует; пользователь имеет права.</precondition>
|
||
<postcondition>Item удален; связанные ресурсы (attachments) очищены.</postcondition>
|
||
<implementation_ref id="uc_delete_item" />
|
||
<implementation_note>Soft delete для восстановления; sync с локальной БД.</implementation_note>
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_labels_locations" status="implemented">
|
||
<summary>Управление метками и местоположениями</summary>
|
||
<description>Позволяет пользователям просматривать списки всех доступных меток и местоположений.</description>
|
||
<UI_COMPONENT ref_id="screen_labels_list" />
|
||
<UI_COMPONENT ref_id="screen_locations_list" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_get_all_labels" status="implemented">
|
||
<summary>Получить все метки</summary>
|
||
<description>Получает список всех меток из репозитория.</description>
|
||
<precondition>Сеть доступна или кэш существует.</precondition>
|
||
<postcondition>Возвращает список Label; отсортирован по name.</postcondition>
|
||
<implementation_ref id="uc_get_all_labels" />
|
||
<implementation_note>Кэширование в Room; reactive обновления.</implementation_note>
|
||
</FUNCTION>
|
||
<FUNCTION id="func_get_all_locations" status="implemented">
|
||
<summary>Получить все местоположения</summary>
|
||
<description>Получает список всех местоположений из репозитория.</description>
|
||
<precondition>Сеть доступна или кэш существует.</precondition>
|
||
<postcondition>Возвращает список Location; иерархическая структура сохранена.</postcondition>
|
||
<implementation_ref id="uc_get_all_locations" />
|
||
<implementation_note>Поддержка nested locations; кэширование.</implementation_note>
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_search" status="implemented">
|
||
<summary>Экран поиска</summary>
|
||
<description>Предоставляет специальный пользовательский интерфейс для поиска товаров.</description>
|
||
<UI_COMPONENT ref_id="screen_search" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_search_items_dedicated" status="implemented">
|
||
<summary>Поиск со специального экрана</summary>
|
||
<description>Использует ту же функцию поиска, но со специального экрана.</description>
|
||
<precondition>Запрос не пустой.</precondition>
|
||
<postcondition>Возвращает результаты поиска; UI обновлен.</postcondition>
|
||
<implementation_ref id="uc_search_items" />
|
||
<implementation_note>Интеграция с SearchView; debounce для запросов.</implementation_note>
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
</FEATURES>
|
||
|
||
<UI_SPECIFICATIONS>
|
||
<SCREEN id="screen_dashboard" status="implemented">
|
||
<summary>Главный экран "Панель управления"</summary>
|
||
<description>
|
||
Экран предоставляет обзорную информацию и быстрый доступ к основным функциям. Компоновка должна быть чистой и интуитивно понятной, аналогично веб-интерфейсу HomeBox.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>Верхняя панель приложения. Содержит иконку навигационного меню (гамбургер), название/логотип приложения и иконку для запуска сканера (например, QR-кода).</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="NavigationDrawer">
|
||
<description>Боковое навигационное меню. Открывается по нажатию на иконку в TopAppBar. Содержит основные разделы: Главная, Локации, Поиск, Профиль, Инструменты, а также кнопку "Выйти".</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
|
||
<description>Основная область контента. Содержит несколько информационных блоков.</description>
|
||
<SUB_COMPONENT type="Section" title="Быстрая статистика">
|
||
<description>Сетка из 2x2 карточек, отображающих ключевые метрики.</description>
|
||
<ELEMENT type="Card" name="Общая стоимость" />
|
||
<ELEMENT type="Card" name="Всего вещей" />
|
||
<ELEMENT type="Card" name="Общее количество местоположений" />
|
||
<ELEMENT type="Card" name="Всего меток" />
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="Section" title="Недавно добавлено">
|
||
<description>Горизонтально прокручиваемый список карточек недавно добавленных предметов. Если предметов нет, отображается сообщение "Элементы не найдены".</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="Section" title="Места хранения">
|
||
<description>Сетка или гибкий контейнер (FlowRow) с кликабельными чипами, представляющими местоположения. Нажатие на чип ведет к списку предметов в этом местоположении.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="Section" title="Метки">
|
||
<description>Сетка или гибкий контейнер (FlowRow) с кликабельными чипами, представляющими метки. Нажатие на чип ведет к списку предметов с этой меткой.</description>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
<COMPONENT type="FloatingActionButton_or_PrimaryButton" icon="add">
|
||
<description>
|
||
Вместо плавающей кнопки (FAB), в референсе используется заметная кнопка "Создать" в навигационном меню. Мы будем придерживаться этого подхода для консистентности. Эта кнопка инициирует процесс создания нового предмета.
|
||
</description>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Нажатие на чип местоположения/метки</action>
|
||
<reaction>Навигация на экран списка инвентаря с фильтром.</reaction>
|
||
</INTERACTION>
|
||
<INTERACTION>
|
||
<action>Нажатие на кнопку "Создать"</action>
|
||
<reaction>Открытие экрана редактирования нового товара.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
|
||
<SCREEN id="screen_locations_list" status="implemented">
|
||
<summary>Экран "Локации"</summary>
|
||
<description>
|
||
Отображает вертикальный список всех доступных местоположений. Экран должен быть интегрирован в общую структуру навигации приложения (TopAppBar, NavigationDrawer).
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>Общая верхняя панель приложения, аналогичная экрану "Панель управления".</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="NavigationDrawer">
|
||
<description>Общее боковое меню навигации.</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical">
|
||
<description>Основная область контента, занимающая все доступное пространство под TopAppBar.</description>
|
||
<SUB_COMPONENT type="Header" title="Локации">
|
||
<description>Заголовок экрана, расположенный вверху основной области контента.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="List" name="LocationsList">
|
||
<description>Вертикальный, прокручиваемый список (LazyColumn) всех местоположений.</description>
|
||
<ELEMENT type="ListItem">
|
||
<description>Элемент списка, представляющий одно местоположение. Состоит из иконки (например, 'place') и названия местоположения. Весь элемент является кликабельным и ведет на экран со списком предметов в данной локации.</description>
|
||
</ELEMENT>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
<COMPONENT type="FloatingActionButton" icon="add">
|
||
<description>
|
||
Плавающая кнопка действия, расположенная в правом нижнем углу. Позволяет пользователю добавить новое местоположение. В веб-версии для этого используются иконки в углу, но FAB является более нативным паттерном для Android.
|
||
</description>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Нажатие на элемент списка локаций</action>
|
||
<reaction>Осуществляется навигация на экран списка инвентаря, отфильтрованного по выбранной локации.</reaction>
|
||
</INTERACTION>
|
||
<INTERACTION>
|
||
<action>Нажатие на FloatingActionButton</action>
|
||
<reaction>Открывается диалоговое окно или новый экран для создания нового местоположения.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
|
||
<SCREEN id="screen_labels_list" status="implemented">
|
||
<summary>Экран "Метки"</summary>
|
||
<description>
|
||
Отображает вертикальный список всех доступных меток. Экран должен быть интегрирован в общую структуру навигации приложения.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>Общая верхняя панель приложения с заголовком "Метки" и кнопкой "назад".</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical">
|
||
<description>Основная область контента, занимающая все доступное пространство под TopAppBar.</description>
|
||
<SUB_COMPONENT type="List" name="LabelsList">
|
||
<description>Вертикальный, прокручиваемый список (LazyColumn) всех меток.</description>
|
||
<ELEMENT type="ListItem">
|
||
<description>Элемент списка, представляющий одну метку. Состоит из иконки (например, 'label') и названия метки. Весь элемент является кликабельным и ведет на экран со списком предметов с данной меткой.</description>
|
||
</ELEMENT>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
<COMPONENT type="FloatingActionButton" icon="add">
|
||
<description>
|
||
Плавающая кнопка действия, расположенная в правом нижнем углу. Позволяет пользователю добавить новую метку.
|
||
</description>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Нажатие на элемент списка меток</action>
|
||
<reaction>Осуществляется навигация на экран списка инвентаря, отфильтрованного по выбранной метке.</reaction>
|
||
</INTERACTION>
|
||
<INTERACTION>
|
||
<action>Нажатие на FloatingActionButton</action>
|
||
<reaction>Открывается диалоговое окно или новый экран для создания новой метки.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
|
||
<SCREEN id="screen_inventory_list" status="implemented">
|
||
<summary>Экран "Список инвентаря"</summary>
|
||
<description>
|
||
Отображает список всех инвентарных позиций с возможностью поиска, фильтрации и пагинации. Интегрирован в навигацию.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>Верхняя панель с поиском и фильтрами.</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
|
||
<description>Прокручиваемый список товаров.</description>
|
||
<SUB_COMPONENT type="List" name="InventoryList">
|
||
<description>LazyColumn с карточками товаров (name, quantity, location).</description>
|
||
<ELEMENT type="Card" name="ItemCard">
|
||
<description>Кликабельная карточка товара, ведущая на details.</description>
|
||
</ELEMENT>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
<COMPONENT type="FloatingActionButton" icon="sync">
|
||
<description>Кнопка для синхронизации инвентаря.</description>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Ввод в поиск</action>
|
||
<reaction>Обновление списка с debounce.</reaction>
|
||
</INTERACTION>
|
||
<INTERACTION>
|
||
<action>Нажатие на товар</action>
|
||
<reaction>Навигация на screen_item_details.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
|
||
<SCREEN id="screen_item_details" status="implemented">
|
||
<summary>Экран "Сведения о товаре"</summary>
|
||
<description>
|
||
Показывает детальную информацию о товаре, включая изображения и custom fields.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>С кнопками edit/delete.</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
|
||
<SUB_COMPONENT type="ImageCarousel" name="Images">
|
||
<description>Карусель изображений.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="DetailsSection" title="Описание">
|
||
<description>Текст description.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="FieldsGrid" name="CustomFields">
|
||
<description>Сетка custom полей.</description>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Нажатие edit</action>
|
||
<reaction>Навигация на screen_item_edit.</reaction>
|
||
</INTERACTION>
|
||
<INTERACTION>
|
||
<action>Нажатие delete</action>
|
||
<reaction>Подтверждение и вызов func_delete_item.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
|
||
<SCREEN id="screen_item_edit" status="implemented">
|
||
<summary>Экран "Редактирование товара"</summary>
|
||
<description>
|
||
Форма для создания/обновления товара с полями name, description, quantity, etc.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>С кнопкой save.</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
|
||
<SUB_COMPONENT type="TextField" name="Name">
|
||
<description>Поле ввода имени.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="Dropdown" name="Location">
|
||
<description>Выбор местоположения.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="ChipGroup" name="Labels">
|
||
<description>Выбор меток.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="ImagePicker" name="Images">
|
||
<description>Добавление изображений.</description>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Нажатие save</action>
|
||
<reaction>Валидация и вызов func_create_item или func_update_item.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
|
||
<SCREEN id="screen_search" status="implemented">
|
||
<summary>Экран "Поиск"</summary>
|
||
<description>
|
||
Специализированный экран для поиска с расширенными фильтрами.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>С поисковой строкой.</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical">
|
||
<SUB_COMPONENT type="FilterSection" name="Filters">
|
||
<description>Чипы для фильтров (location, label).</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="List" name="SearchResults">
|
||
<description>LazyColumn результатов.</description>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Изменение запроса/фильтров</action>
|
||
<reaction>Обновление результатов.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
|
||
</UI_SPECIFICATIONS>
|
||
|
||
<ICONOGRAPHY_GUIDE id="iconography_guide">
|
||
<summary>Руководство по использованию иконок</summary>
|
||
<description>
|
||
Этот раздел определяет стандартный набор иконок 'androidx.compose.material.icons.Icons.Filled'
|
||
для использования в приложении. Для устаревших иконок указаны актуальные замены.
|
||
</description>
|
||
<ICON name="AccountBox" path="Icons.Filled.AccountBox" />
|
||
<ICON name="AccountCircle" path="Icons.Filled.AccountCircle" />
|
||
<ICON name="Add" path="Icons.Filled.Add" />
|
||
<ICON name="AddCircle" path="Icons.Filled.AddCircle" />
|
||
<ICON name="ArrowBack" path="Icons.AutoMirrored.Filled.ArrowBack" note="Использовать AutoMirrored версию" />
|
||
<ICON name="ArrowDropDown" path="Icons.Filled.ArrowDropDown" />
|
||
<ICON name="ArrowForward" path="Icons.AutoMirrored.Filled.ArrowForward" note="Использовать AutoMirrored версию" />
|
||
<ICON name="Build" path="Icons.Filled.Build" />
|
||
<ICON name="Call" path="Icons.Filled.Call" />
|
||
<ICON name="Check" path="Icons.Filled.Check" />
|
||
<ICON name="CheckCircle" path="Icons.Filled.CheckCircle" />
|
||
<ICON name="Clear" path="Icons.Filled.Clear" />
|
||
<ICON name="Close" path="Icons.Filled.Close" />
|
||
<ICON name="Create" path="Icons.Filled.Create" />
|
||
<ICON name="DateRange" path="Icons.Filled.DateRange" />
|
||
<ICON name="Delete" path="Icons.Filled.Delete" />
|
||
<ICON name="Done" path="Icons.Filled.Done" />
|
||
<ICON name="Edit" path="Icons.Filled.Edit" />
|
||
<ICON name="Email" path="Icons.Filled.Email" />
|
||
<ICON name="ExitToApp" path="Icons.AutoMirrored.Filled.ExitToApp" note="Использовать AutoMirrored версию" />
|
||
<ICON name="Face" path="Icons.Filled.Face" />
|
||
<ICON name="Favorite" path="Icons.Filled.Favorite" />
|
||
<ICON name="FavoriteBorder" path="Icons.Filled.FavoriteBorder" />
|
||
<ICON name="Home" path="Icons.Filled.Home" />
|
||
<ICON name="Info" path="Icons.AutoMirrored.Filled.Info" note="Использовать AutoMirrored версию" />
|
||
<ICON name="KeyboardArrowDown" path="Icons.Filled.KeyboardArrowDown" />
|
||
<ICON name="KeyboardArrowLeft" path="Icons.AutoMirrored.Filled.KeyboardArrowLeft" note="Использовать AutoMirrored версию" />
|
||
<ICON name="KeyboardArrowRight" path="Icons.AutoMirrored.Filled.KeyboardArrowRight" note="Использовать AutoMirrored версию" />
|
||
<ICON name="KeyboardArrowUp" path="Icons.Filled.KeyboardArrowUp" />
|
||
<ICON name="Label" path="Icons.AutoMirrored.Filled.Label" note="Использовать AutoMirrored версию" />
|
||
<ICON name="List" path="Icons.AutoMirrored.Filled.List" note="Использовать AutoMirrored версию" />
|
||
<ICON name="LocationOn" path="Icons.Filled.LocationOn" />
|
||
<ICON name="Lock" path="Icons.Filled.Lock" />
|
||
<ICON name="MailOutline" path="Icons.Filled.MailOutline" />
|
||
<ICON name="Menu" path="Icons.Filled.Menu" />
|
||
<ICON name="MoreVert" path="Icons.Filled.MoreVert" />
|
||
<ICON name="Notifications" path="Icons.Filled.Notifications" />
|
||
<ICON name="Person" path="Icons.Filled.Person" />
|
||
<ICON name="Phone" path="Icons.Filled.Phone" />
|
||
<ICON name="Place" path="Icons.Filled.Place" />
|
||
<ICON name="PlayArrow" path="Icons.Filled.PlayArrow" />
|
||
<ICON name="Refresh" path="Icons.Filled.Refresh" />
|
||
<ICON name="Search" path="Icons.Filled.Search" />
|
||
<ICON name="Send" path="Icons.AutoMirrored.Filled.Send" note="Использовать AutoMirrored версию" />
|
||
<ICON name="Settings" path="Icons.Filled.Settings" />
|
||
<ICON name="Share" path="Icons.Filled.Share" />
|
||
<ICON name="ShoppingCart" path="Icons.Filled.ShoppingCart" />
|
||
<ICON name="Star" path="Icons.Filled.Star" />
|
||
<ICON name="ThumbUp" path="Icons.Filled.ThumbUp" />
|
||
<ICON name="Warning" path="Icons.Filled.Warning" />
|
||
</ICONOGRAPHY_GUIDE>
|
||
|
||
<IMPLEMENTATION_MAP>
|
||
<!-- Use Cases -->
|
||
<USE_CASE id="uc_get_stats" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt" />
|
||
<USE_CASE id="uc_search_items" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt" />
|
||
<USE_CASE id="uc_sync_inventory" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt" />
|
||
<USE_CASE id="uc_get_item_details" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt" />
|
||
<USE_CASE id="uc_create_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt" />
|
||
<USE_CASE id="uc_update_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/UpdateItemUseCase.kt" />
|
||
<USE_CASE id="uc_delete_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt" />
|
||
<USE_CASE id="uc_get_all_labels" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt" />
|
||
<USE_CASE id="uc_get_all_locations" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt" />
|
||
<USE_CASE id="uc_login" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/LoginUseCase.kt" />
|
||
|
||
<!-- UI Screens -->
|
||
<UI_SCREEN id="screen_dashboard" file_ref="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" />
|
||
<UI_SCREEN id="screen_inventory_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt" />
|
||
<UI_SCREEN id="screen_item_details" file_ref="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt" />
|
||
<UI_SCREEN id="screen_item_edit" file_ref="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" />
|
||
<UI_SCREEN id="screen_labels_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" />
|
||
<UI_SCREEN id="screen_locations_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" />
|
||
<UI_SCREEN id="screen_search" file_ref="app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt" />
|
||
<UI_SCREEN id="screen_setup" file_ref="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt" />
|
||
</IMPLEMENTATION_MAP>
|
||
</PROJECT_SPECIFICATION>
|