---
# System prepended metadata

title: CtrlHack. Тестовое задание Vue 2

---

# CtrlHack. Тестовое задание Vue 2

## Цель
Разработать прототип решения для динамического обновления элементов веб-интерфейса с функцией протоколирования событий.

## Подготовка
За основу взять стандартный проект **Vue 2** (создание через `vue cli`). Создать простейший интерфейс с элементами как на рисунке ниже:
```
┌──────────────────────────────────────────────────────────────────────────────────┐
│ ┌──────────────┐ ┌───────────────┐ ┌──────────────────┐   ┌───────────────────┐  │
│ │input  1      │ │input   2      │ │input   3         │   │button    4        │  │
│ └──────────────┘ └───────────────┘ └──────────────────┘   └───────────────────┘  │
│                                                                                  │
│  label  5         label  6          label   7              label    8            │
│                                                                                  │
│  │DIV─9───────────────────────────────────────────────────────────────────────┐  │
│  │                                                                            │  │
│  │ ────10────────────────────────────────────────────────────────────────     │  │
│  │                                                                            │  │
│  │ ──────────────────────────────────────────────────────────────────────     │  │
│  │                                                                            │  │
│  │ ──────────────────────────────────────────────────────────────────────     │  │
│  │                                                                            │  │
│  │                                                                            │  │
│  │                                                                            │  │
│  └────────────────────────────────────────────────────────────────────────────┘  │
│                                                                                  │
└──────────────────────────────────────────────────────────────────────────────────┘
```

Где:
1 - поле ввода "Цена" (price)
2 - поле ввода "Кол-во" (qty)
3 - поле ввода "Сумма" (amount)
4 - кнопка отправки данных
5 - лейбл, который отображает значение поля "Цена" (1)
6 - лейбл, который отображает значение поле "Кол-во" (2)
7 - лейбл, который отображает значение поля "Сумма" (3)
8 - лейбл, который отображает текущее состояние localStorage браузера 
9 - область, в которой отображается информация о возникших событиях
10 - непосредственно информация возникающих событиях

Типы событий для области (9):
- изменение полей ввода (1,2,3)
- нажатие кнопки (4)
- получение результата после нажатия кнопки (4)


## Поведение
- Пользователь вносит значения в поля ввода (1,2,3) в любом порядке
- По мере изменения полей ввода осуществляется пересчёт значений полей ввода, при этом пересчитывается поле, которое менялось раньше двух других
- Лейблы (5,6,7) отображают текущие значения полей ввода
- При нажатии кнопки (4) в localStorage сохраняется информация о значении всех полей ввода, а также последовательный номер операции (nonce)
- Соответствующие события отображаются в области (9) в порядке "новое сверху"
- Лейбл (8) отображает текущее состояние localStorage в виде json

## Параметры реализации
- Обновления полей ввода при перерасчете осуществляются с debounce 300мс (не чаще одного раза в 300мс)
- Начальное значение номера операции nonce = 0
- При нажатии на кнопку (4):
    -  результат возвращается с задержкой 1 секунда
    -  если "Сумма" четное число, то данные сохраняются и возвращается сообщение "{success:true}"
    -  если "Сумма" нечетное число, то данные не сохраняются и возвращается сообщение "{success:false}"

