# Исходный код components_derived.modal_change_password

    """Модуль modal_change_password содержит класс для работы с окном изменения пароля текущего пользователя.

    Класс ChangePasswordModalWindow наследует базовый функционал ModalWindowComponent
    и реализует методы для изменения пароля пользователя.
    """

    from playwright.sync_api import Page
    from tools.logger import get_logger
    from locators.text_input_locators import TextInputLocators
    from locators.modal_window_locators import ModalWindowLocators
    from elements.text_element import Text
    from elements.text_input_element import TextInput
    from elements.icon_element import Icon
    from data.environment import host
    from components.modal_window_component import ModalWindowComponent
    from components.alert_component import AlertComponent

    logger = get_logger("CHANGE_PASSWORD_MODAL_WINDOW")

    class ChangePasswordModalWindow(ModalWindowComponent):
        """Модальное окно изменения пароля текущего пользователя.

        Наследует ModalWindowComponent и добавляет:
        - Поля задания пароля
        - Кнопки действий (Сохранить, Отменить)
        """

        def __init__(self, page: Page):
            """Инициализирует элементы формы редактирования пользователя."""

            super().__init__(page)

            modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)

            # Тулбар с заголовком
            user_name = host.get_current_user_name()
            self.add_toolbar_title(f"Изменить пароль для пользователя {user_name}?")

            # Поля ввода пароля
            loc = modal_window_locator.get_by_label("Введите текущий пароль *")
            old_password_input = TextInput(page, loc, "old_password_input")
            self.add_content_item("old_password_input", old_password_input)

            icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
            old_password_hidden_icon = Icon(page, icon_locator,
                                             "old password hidden icon")
            self.add_content_item("old_password_hidden_icon", old_password_hidden_icon)

            loc = modal_window_locator.get_by_label("Введите новый пароль *")
            new_password_input = TextInput(page, loc, "new_password_input")
            self.add_content_item("new_password_input", new_password_input)

            icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
            new_password_hidden_icon = Icon(page, icon_locator,
                                             "new password hidden icon")
            self.add_content_item("new_password_hidden_icon", new_password_hidden_icon)

            loc = modal_window_locator.get_by_label("Введите повторно новый пароль *")
            confirm_password_input = TextInput(page, loc, "confirm_password_input")
            self.add_content_item("confirm_password_input", confirm_password_input)

            icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
            confirm_password_hidden_icon = Icon(page, icon_locator,
                                               "confirm password hidden icon")
            self.add_content_item("confirm_password_hidden_icon", confirm_password_hidden_icon)

            input_form_error_message = Text(page,
                                           modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),
                                           "input form error message")
            self.add_content_item("input_form_error_message", input_form_error_message)

            # Добавление кнопок действий
            locator_button_save = self.page.get_by_role("button", name="Сохранить")
            self.add_button(locator_button_save, "save")

            locator_button_cancel = self.page.get_by_role("button", name="Отменить")
            self.add_button(locator_button_cancel, "cancel")

            # Alert при успешном добавлении пользователя
            self.alert = AlertComponent(page)

        # Действия:

        def click_cancel_button(self) -> None:
            """Нажимает кнопку 'Отменить'"""

            self.get_button_by_name("cancel").click()

        def click_old_password_hidden_icon(self) -> None:
            """Нажатие на иконку скрытия старого пароля."""

            self.get_content_item("old_password_hidden_icon").click()

        def click_new_password_hidden_icon(self) -> None:
            """Нажатие на иконку скрытия нового пароля."""

            self.get_content_item("new_password_hidden_icon").click()

        def click_confirm_password_hidden_icon(self) -> None:
            """Нажатие на иконку скрытия пароля подтверждения."""

            self.get_content_item("confirm_password_hidden_icon").click()

        def change_password(self, old_password: str, new_password: str):
            """Заполняет элементы формы, нажимает кнопку 'Сохранить'"""

            error = ""

            self.get_content_item("old_password_input").input_value(old_password)
            self.get_content_item("new_password_input").input_value(new_password)
            self.get_content_item("confirm_password_input").input_value(new_password)

            button_save = self.get_button_by_name("save")

            if button_save.is_disabled():
                error_message = self.get_content_item("input_form_error_message")
                error = error_message.get_text(0)
                return False, error

            button_save.click()

            is_changed = False

            alert_type = self.alert.get_alert_type()
            if alert_type == "success":
                self.alert.check_alert_presence(' Пароль успешно изменён ')
                self.alert.check_alert_absence(' Пароль успешно изменён ')
                is_changed = True
            elif alert_type == "error":
                self.alert.check_alert_presence(' Неверно указан текущий пароль ')
                self.alert.check_alert_absence(' Неверно указан текущий пароль ')

                error = "Old password is not equal real password"
            else:
                error = f"Got unexpected alert type {alert_type}"

            return is_changed, error

        def get_password_inputs(self) -> []:
            """Возвращает список полей ввода пароля (для тестовых целей)."""

            text_inputs = []
            text_inputs.append(self.get_content_item("old_password_input"))
            text_inputs.append(self.get_content_item("new_password_input"))
            text_inputs.append(self.get_content_item("confirm_password_input"))
            return text_inputs

        # Проверки:

        def check_content(self):
            """Проверяет наличие и корректность всех элементов формы."""

            self.check_by_window_title()

            self.get_content_item("old_password_input").check_visibility(
                                      "Old password input form is missing"
                                 )
            old_password_hidden_icon = self.get_content_item("old_password_hidden_icon")
            old_password_hidden_icon.check_visibility(
                                      "Old password hidden icon is missing"
                                 )
            is_hidden_state = old_password_hidden_icon.is_password_hidden()
            assert is_hidden_state, "Old password hidden icon should be in hidden state"

            self.get_content_item("new_password_input").check_visibility(
                                      "New password input form is missing"
                                 )
            new_password_hidden_icon = self.get_content_item("new_password_hidden_icon")
            new_password_hidden_icon.check_visibility(
                                      "New password hidden icon is missing"
                                 )
            is_hidden_state = new_password_hidden_icon.is_password_hidden()
            assert is_hidden_state, "New password hidden icon should be in hidden state"

            self.get_content_item("confirm_password_input").check_visibility(
                                      "Confirm password input form is missing"
                                 )
            confirm_password_hidden_icon = self.get_content_item("confirm_password_hidden_icon")
            confirm_password_hidden_icon.check_visibility(
                                      "Confirm password hidden icon is missing"
                                 )
            is_hidden_state = confirm_password_hidden_icon.is_password_hidden()
            assert is_hidden_state, "Confirm password hidden icon should be in hidden state"

            self.check_button_visibility("cancel")

            button_save = self.get_button_by_name("save")
            is_disabled = button_save.is_disabled()
            assert is_disabled, "Button 'Сохранить' should be hidden"

        def check_error_message(self, text: str) -> None:
            """Проверяет сообщение об ошибке, возникшее при заполнении полей формы."""

            error_message = self.get_content_item("input_form_error_message")
            error_message.check_have_text(text, "Unexpected error message")