Реализовать конфигуратор стоимости доставки товара в разные регионы страны с наценками за вес посылки.
Основные элементы конфигуратора:
-
Список тарифных зон грузится с бэкенда асинхронно.
Бэкенд реализовывать не нужно — список зон нужно грузить из JSON-файла.
-
Элемент поддерживает фильтрацию по названию.
Достаточно реализовать простой поиск и показывать только те тарифные зоны, названия которых начинаются с введенного текста.
-
Нажатие на "Добавить" рядом с названием тарифной зоны добавляет ее в список настроенных тарифных зон.
-
Для тарифных зон, добавленных в список настроенных тарифных зон, вместо кнопки "Добавить" отображается кнопка "Удалить", которая отменяет доставку в данную тарифную зону и убирает ее из списка.
-
Тарифные зоны в списке упорядочены по алфавиту.
-
Для каждой позиции в списке задается базовая стоимость доставки.
Стоимость доставки задается в рублях с двумя знаками после запятой.
Поле поддерживает ввод только цифр и символа ".".
-
У каждой позиции списка есть кнопка "Добавить наценку", которая добавляет новую пустую позицию в список наценок тарифной зоны.
-
У каждой позиции списка есть кнопка "Удалить". Ее поведение описано в п. 1.4.
-
У каждой позиции списка есть поля для ввода диапазона веса посылки и поле для ввода наценки.
Вес посылки задается в килограммах с тремя знаками после запятой.
Поле поддерживает ввод только цифр и символов ".", "+" и "-".
Если задана положительная наценка, перед ней нужно выводить "+", если отрицательная — "-".
-
Для каждой позиции списка отображается конечная стоимость доставки.
Конечная стоимость — сумма базовой стоимости доставки в тарифную зону (п. 2.2) и наценки.
При измененнии базовой стоимости и наценки конечная стоимость доставки пересчитывается.
-
У каждой позиции списка есть кнопка "Удалить наценку", которая удаляет позицию списка.
- При нажатии на кнопку происходит проверка формы.
- Если список настроенных тарифных зон пустой, должно показываться сообщение "Доставка не настроена".
- Если для тарифной зоны не задана базовая стоимость — под полем ввода базовой стоимости должно отображаться сообщение "Укажите базовую стоимость".
- Если в списке наценок не указаны значения в полях веса — под пустым полем должно отображаться сообщение "Укажите вес".
- Если в списке наценок не указана наценка — под пустым полем должно отображаться сообщение "Укажите наценку".
- Если в списке наценок тарифной зоны диапазоны веса перекрывают друг друга — под тарифной зоной должно отображаться сообщение "Диапазоны веса перекрываются".
- Если форма не содержит ошибок — показывается сообщение "Сохранено" и в консоль логируется состояние формы в следующем формате:
[ { "rate_area_id": ID-тарифной-зоны, "base_charge_value": базовая-стоимость-доставки, "extra_charges": [ { "min_weight": минимальный-вес-диапазона, "max_weight": максимальный-вес-диапазона, "charge_value": величина-наценки }, ... ] } ]
- Реализовать на jQuery (допустимо использование любых плагинов) или чистом Javascript (ECMAScript 6).
- JSON-файл должен загружаться AJAX-запросом. Пока файл не загружен, никаких элементов UI, относящихся к фильтрам, не должно быть отрисовано.
- Код структурировать и разделять — должна просматриваться архитектура Javascript приложения.
- Использовать HTML шаблоны для элементов списков.
- Использовать семантическую верстку, именовать блоки и элементы по БЭМ.
- Старые браузеры не поддерживать: должно работать в самых новых версиях Firefox и Chrome.
- Результат оформить в виде репозитория на Github.