Необходимо разработать страницу TransactionsPage (файл public/js/ui/pages/TransactionsPage.js)
Класс TransactionsPage отвечает за единственную страницу приложения, которая:
- Отображает список транзакций счёта
- Позволяет удалить счёт или транзакцию
Содержимое страницы представлено HTML-кодом:
<div class="content-wrapper">
<section class="content-header">
<h1>
<!-- название счёта -->
<span class="content-title">Название счёта</span>
<small class="content-description">Счёт</small>
<!-- кнопка удаления счёта -->
<button class="btn btn-danger remove-account">
<span class="fa fa-trash"></span>
Удалить счёт
</button>
</h1>
</section>
<section class="content">
<!-- содержимое -->
</section>
</div>
Класс состоит из следующих методов:
- Конструктор
- registerEvents устанавливает обработчики событий для удаления транзакций и счетов
- removeAccount удаляет счёт
- removeTransaction удаляет конкретную транзакцию
- render отрисовывает все транзакции конкретного счета
- renderTitle отрисовывает заголовок
- update перерисовывает страницу в случае, если была добавлена новая транзакция или удалена имеющаяся
- clear очищает страницу
- formatDate - преобразует дату
- getTransactionHTML формирует HTML-код транзакции
- renderTransactions отрисовывает список транзакций
Важные детали:
- Если передан пустой элемент в конструктор, должна быть выброшена ошибка.
- Сохраните переданный элемент в свойство element
- Вызовите метод registerEvents()
Рассмотрим код для удаления счёта:
<button class="btn btn-danger remove-account">
<span class="fa fa-trash"></span>
Удалить счёт
</button>
И код для удаления транзакции:
<button class="btn btn-danger transaction__remove" data-id="41">
<i class="fa fa-trash"></i>
</button>
- При нажатии на кнопку удаления счёта .remove-account, необходимо вызвать метод removeAccount
- При нажатии на кнопку удаления транзакции .transaction__remove, необходимо вызвать метод removeTransaction и передать туда идентификатор транзакции
Принимает один аргумент options - объект с настройками вида, где account_id - идентификатор счёта:
{
"account_id": "23"
}
Если объект options не передан, метод не должен работать.
Для работы метода update следует сохранить options в свойство lastOptions.
Важные особенности:
- Метод получает данные о счёте через Account.get() и в случае успеха вызывает renderTitle для отрисовки названия счёта
- Метод получает список доходов и расходов пользователя через Transaction.list и отрисовывает данные через TransactionsPage.renderTransactions
Если свойство lastOptions (см. метод render) не задано, метод не должен ничего делать.
Вызывает Account.remove() для удаления счёта. При успехе вызывает App.updateWidgets() для обновления виджетов и App.updateForms() для обновления форм. Либо можно обновлять только виджет со счетами и формы создания дохода и расхода
Перед удалением метод должен показать диалоговое окно с текстом «Вы действительно хотите удалить счёт?»
Удаляет конкретную транзакцию
Для этого вызывает Transaction.remove и в случае успеха вызывает App.update() для обновления приложения. Либо используйте обновление текущей страницы (метод update) и обновления виджета со счетами
Перед удалением метод должен показать диалоговое окно с текстом «Вы действительно хотите удалить эту транзакцию?»
- Вызывает метод render()
- В случае, если метод render() был ранее вызван с какими-то опциями, при вызове update() эти опции необходимо передать повторно
- Очищает транзакции. Вызывает renderTransactions с пустым массивом
- Вызывает метод renderTitle. Задаёт заголовок счёта: «Название счёта»
- Удаляет содержимое из lastOptions
<span class="content-title">Название счёта</span>
<small class="content-description">Счёт</small>
Устанавливает заголовок в элемент .content-title
Форматирует дату в формате 2019-03-10 03:20:41 (строка) в формат «10 марта 2019 г. в 03:20»:
const page = new TransactionsPage( document.getElementById( '#content' ));
page.formatDate( '2019-03-10 03:20:41' ); // 10 марта 2019 г. в 03:20
Формирует HTML-код транзакции (дохода или расхода).
В метод передаётся объект item следующего формата, где type равно expense или income (доход или расход) :
{
"account_id": "1",
"created_at": "2019-09-19 20:12:02",
"id": "3",
"name": "Копилка",
"sum": 1500,
"type": "income",
"user_id": "1"
}
Метод обращается к formatDate для получения форматированной даты. Для таких данных метод должен выдать HTML-код вида:
<!-- либо transaction_expense, либо transaction_income -->
<div class="transaction transaction_expense row">
<div class="col-md-7 transaction__details">
<div class="transaction__icon">
<span class="fa fa-money fa-2x"></span>
</div>
<div class="transaction__info">
<h4 class="transaction__title">Новый будильник</h4>
<!-- дата -->
<div class="transaction__date">10 марта 2019 г. в 03:20</div>
</div>
</div>
<div class="col-md-3">
<div class="transaction__summ">
<!-- сумма -->
200 <span class="currency">₽</span>
</div>
</div>
<div class="col-md-2 transaction__controls">
<!-- в data-id нужно поместить id -->
<button class="btn btn-danger transaction__remove" data-id="12">
<i class="fa fa-trash"></i>
</button>
</div>
</div>
По массиву данных вида:
[
{
"account_id": "1",
"created_at": "2019-09-19 20:12:02",
"id": "3",
"name": "Копилка",
"sum": 1500,
"type": "income",
"user_id": "1"
},
{
"account_id": "1",
"created_at": "2019-09-17 15:53:02",
"id": "2",
"name": "Баланс на дебетовке",
"sum": 3200,
"type": "INCOME",
"user_id": "1"
}
]
необходимо сформировать HTML-код всех транзакций на счету с помощью метода getTransactionHTML и отобразить их в элементе .content:
<div class="content-wrapper">
<section class="content-header">
<h1>
<!-- ... -->
</h1>
</section>
<section class="content">
<!-- вот сюда! -->
</section>
</div>