493 lines
40 KiB
Plaintext
493 lines
40 KiB
Plaintext
<?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>
|
||
</DECISION>
|
||
<DECISION id="tech_i18n" status="defined">
|
||
<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>
|
||
</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>
|
||
|
||
<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> |