class RackLocators:
"""Класс для хранения локаторов элементов страницы стойки.
Содержит локаторы в формате XPath для поиска элементов:
- Вкладки стойки (верхние вкладки)
- Секции лицевой и обратной сторон стойки
- Юниты и устройства на стойке
- Поля формы редактирования стойки
- Контейнеры и структурные элементы
"""
# Основной контейнер вкладок стойки (верхние вкладки)
TABS_CONTAINER = "//div[@class='v-tabs__container']"
# Все элементы верхних вкладок стойки
ALL_TABS = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item')]"
# Универсальный локатор для любой вкладки по имени
TAB_BY_NAME = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., '{}')]"
# Конкретные вкладки по тексту
GENERAL_INFO_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'Общая информация')]"
MAINTENANCE_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'Обслуживание')]"
EVENTS_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'События')]"
SERVICES_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'Сервисы')]"
# Классы для проверки активности
ACTIVE_TAB_CLASSES = ["accent--text", "v-tabs__item--active"]
# Локатор для активной вкладки
ACTIVE_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item--active')]"
# Контейнер формы
FORM_CONTAINER = "//div[contains(@class, 'container')]"
# Локаторы полей
NAME_FIELD = "//input[@aria-label='Имя']"
SERIAL_NUMBER_FIELD = "//input[@aria-label='Серийный номер']"
INVENTORY_NUMBER_FIELD = "//input[@aria-label='Инвентарный номер']"
CABLE_ENTRY_FIELD = "//input[@aria-label='Ввод кабеля']"
STATUS_FIELD = "//input[@aria-label='Состояние']"
HEIGHT_FIELD = "//input[@aria-label='Высота в юнитах']"
OWNER_FIELD = "//input[@aria-label='Владелец']"
SERVICE_ORG_FIELD = "//input[@aria-label='Обслуживающая организация']"
PROJECT_FIELD = "//input[@aria-label='Проект/Титул']"
# Локаторы для отображения сторон стойки
FRONT_SIDE_CONTAINER = "//div[contains(@class, 'cabinet') and not(contains(@class, 'back'))]"
BACK_SIDE_CONTAINER = "//div[contains(@class, 'cabinet') and contains(@class, 'back')]"
FRONT_SIDE_TITLE = "//span[contains(@class, 'subheading') and contains(text(), 'Лицевая сторона')]"
BACK_SIDE_TITLE = "//span[contains(@class, 'subheading') and contains(text(), 'Обратная сторона')]"
# Юниты на лицевой стороне
FRONT_SIDE_UNITS = ".cabinet:not(.back) .unit, .unit:not(.back)"
# Юниты на обратной стороне
BACK_SIDE_UNITS = ".cabinet.back .unit"
# Локатор для всех юнитов
ALL_UNITS = ".unit"
# Устройства на лицевой стороне
FRONT_SIDE_DEVICES = "//*[contains(@class, 'parent-class')]"
# Устройства на обратной стороне
BACK_SIDE_DEVICES = "//*[contains(@class, 'parent-class')]"
# Позиции юнитов
UNIT_POSITIONS = "//div[contains(@class, 'unit-positions')]"
# Контейнер с обеими сторонами
SIDES_CONTAINER = "//div[contains(@class, 'layout row shrink fill-height ma-0 pa-0')]"
# ЛОКАТОРЫ ДЛЯ СТРУКТУРЫ СТОРОН
# Основные секции сторон
FRONT_SIDE_SECTION = "//span[contains(text(), 'Лицевая сторона')]//ancestor::div[contains(@class, 'flex shrink')]"
BACK_SIDE_SECTION = "//span[contains(text(), 'Обратная сторона')]//ancestor::div[contains(@class, 'flex shrink')]"
# Основной контейнер стойки
MAIN_CONTAINER = "//div[contains(@class, 'layout row')]"