Любое модальное окно имеет возможность отображаться и закрываться. Это поведение релизовано в классе BaseModal
. Поэтому перед началом реализации модального окна загрузки изображений, необходимо реализовать базовый класс модального окна.
Класс BaseModal
состоит из:
- Конструктора, в котором необходимо выполнить:
- Сохраните переданный элемент в свойство объекта класса для дальнейшего взаимодействия. ВАЖНО!!! В приложении есть взаимодействия к двум элементам: (1) к семантик элементу и (2) к DOM элементу. DOM элемент находится на нулевой позиции элемента семантика. Для удобства элементы можно сохранить в разные свойства объекта класса.
- Метод
open
, который вызывает методmodal
на семантик элементе. Аргументом передаётся'show'
. - Метод
close
, который вызывает методmodal
на семантик элементе. Аргументом передаётся'hide'
.
Класс FileUploaderModal
должен наследоваться от класса BaseModal
и иметь следующий функционал:
-
Конструктор, в котором необходимо:
- Вызвать конструктор родителя для предварительных настроек.
- Выполнить регистрацию событий с помощью метода
registerEvents
. - Для удобства взаимодействия с блоками загрузки изображений, их можно сразу найти и сохранить в отдельное свойство класса (если использовать
HTMLCollection
, то элементы в свойстве объекта класса будут отжать состояние в DOM).
-
Метод
registerEvents
, который выполняет подписки на события кликов по элементам:- Клик по элементу крестика (в заголовке модалки) должен закрывать модальное окно.
- Клик по кнопке "Закрыть" должен закрывать модальное окно.
- Клик по кнопке "Отправить все файлы" должен вызывать метод
sendAllImages
, который будет отправлять все файлы на ЯДиск. - Так как мы изначально не знаем сколько элементов изображений будет отображаться в модалке (сколько полей ввода и кнопок будет), то добавим обработчик события на весь блок тела модалки (с классом
content
). А внутри обработчка клика будем конкретно проверять, на каком элементе был клик:- Если клик был на элементе с классом
input
, то необходимо удалить классerror
у этого блока. - Если клик был на кнопке отправки, то необходимо вызывать класс
sendImage
и передавать весь блок контейнер изображения (из которого будем получать исходный путь изображения для загрузки и путь куда необходимо загружать изображение (из поля ввода)).
- Если клик был на элементе с классом
-
Метод
showImages
получает все изображения, меняет порядок на противоположный (с помощью методаreverse
). Для каждого изображения получает блок контейнер (с изображением, полем ввода и кнопкной загрузки). Объединяет все полученные разметки (с помощью методаjoin
) и сохраняет полученую разметку (из блоков контейнеров ко всем изображениям) в свойствоinnerHTML
содержимого модального окна (блокаcontent
). -
Метод
getImageHTML
возвращает строку формата:
<div class="image-preview-container">
<img src='XXX' />
<div class="ui action input">
<input type="text" placeholder="Путь к файлу">
<button class="ui button"><i class="upload icon"></i></button>
</div>
</div>
где XXX
путь к изображению.
-
Метод
sendAllImages
перебирает все блоки контейнеры изображений и для каждого вызывает методsendImage
для отправки на сервер. -
Метод
sendImage
выполняет отправку изображений на ЯДиск по следующему алгоритму:- Получает значение поля ввода и валидирует строку пути для загрузки изображения.
- Если поле ввода пустое, то необходимо добавить класс
error
блоку с классомinput
(не поле ввода, а родительский элемент). И завершить выполнение метода. Дальнейшие действия не актуальны, если путь к файлу не введён. - Добавьте класс
disabled
семантик элементу поля ввода (блоку с классомinput
). - Получите путь добавляемого изображения. Необходимо загружать изображение, путь которого находится в аттрибуте
src
элемента изображения. Путь добавляемого изображения используйте из поля ввода (которое валидировалось в п.п. 6.1 - 6.2). - Выполните запрос на отправку изображения (с помощью метода
Yandex.uploadFile
). После выполнения запроса (в колбеке) выполняйте следующие действия:- Удалите блок контейнер добавленного изображения.
- Если не осталось никаких изображений в модалке, то закрывайте модальное окно.