Remove category chart from report controller.

This commit is contained in:
James Cole 2016-05-15 16:13:05 +02:00
parent bd818b2dea
commit 6a750a998f
48 changed files with 30 additions and 434 deletions

View File

@ -40,6 +40,19 @@ class Journal implements JournalInterface
$this->user = $user; $this->user = $user;
} }
/**
* @param $journal
*
* @return bool
*/
public function markAsComplete(TransactionJournal $journal)
{
$journal->completed = 1;
$journal->save();
return true;
}
/** /**
* @param array $data * @param array $data
* *

View File

@ -21,6 +21,12 @@ use Illuminate\Support\Collection;
*/ */
interface JournalInterface interface JournalInterface
{ {
/**
* @param $journal
*
* @return bool
*/
public function markAsComplete(TransactionJournal $journal);
/** /**
* @param array $data * @param array $data

View File

@ -65,7 +65,6 @@ class Entry
$entry->category = new EntryCategory($journal->categories->first()); $entry->category = new EntryCategory($journal->categories->first());
$entry->bill = new EntryBill($journal->bill); $entry->bill = new EntryBill($journal->bill);
// TODO support split journals
$sources = TransactionJournal::sourceAccountList($journal); $sources = TransactionJournal::sourceAccountList($journal);
$entry->sourceAccount = new EntryAccount($sources->first()); $entry->sourceAccount = new EntryAccount($sources->first());
$destinations = TransactionJournal::destinationAccountList($journal); $destinations = TransactionJournal::destinationAccountList($journal);

View File

@ -44,7 +44,6 @@ class ConnectJournalToPiggyBank
$amount = TransactionJournal::amountPositive($journal); $amount = TransactionJournal::amountPositive($journal);
// if piggy account matches source account, the amount is positive // if piggy account matches source account, the amount is positive
// TODO support split journals
if ($piggyBank->account_id == TransactionJournal::sourceAccount($journal)->id) { if ($piggyBank->account_id == TransactionJournal::sourceAccount($journal)->id) {
$amount = bcmul($amount, '-1'); $amount = bcmul($amount, '-1');
} }

View File

@ -72,7 +72,7 @@ class Data
} }
/** /**
* FIXME may return null * FIXxME may return null
* *
* @return string * @return string
*/ */
@ -92,7 +92,7 @@ class Data
} }
/** /**
* FIXME may return null * FIXxME may return null
* *
* @return string * @return string
*/ */
@ -112,7 +112,7 @@ class Data
} }
/** /**
* FIXME may return null * FIXxME may return null
* *
* @return string * @return string
*/ */

View File

@ -100,38 +100,6 @@ class ReportHelper implements ReportHelperInterface
return $collection; return $collection;
} }
/**
* Find all transactions and IF we have spent money in them
* with either transactions or journals.
*
* @param Carbon $start
* @param Carbon $end
* @param Collection $accounts
*
* @return Collection
*/
public function getCategoriesWithTransactions(Carbon $start, Carbon $end, Collection $accounts): Collection
{
/** @var CategoryRepositoryInterface $repository */
$repository = app(CategoryRepositoryInterface::class);
$categories = $repository->getCategories();
$return = new Collection;
foreach ($categories as $category) {
$lastUseDate = $repository->lastUseDate($category, $accounts);
if ($lastUseDate >= $start && $lastUseDate <= $end) {
$return->push($category);
}
}
$return = $return->sortBy(
function (Category $category) {
return $category->name;
}
);
return $return;
}
/** /**
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end

View File

@ -32,15 +32,6 @@ interface ReportHelperInterface
*/ */
public function getBillReport(Carbon $start, Carbon $end, Collection $accounts): BillCollection; public function getBillReport(Carbon $start, Carbon $end, Collection $accounts): BillCollection;
/**
* @param Carbon $start
* @param Carbon $end
* @param Collection $accounts
*
* @return Collection
*/
public function getCategoriesWithTransactions(Carbon $start, Carbon $end, Collection $accounts): Collection;
/** /**
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end

View File

@ -218,59 +218,6 @@ class CategoryController extends Controller
} }
/**
* @param Category $category
* @param Carbon $start
* @param Carbon $end
* @param Collection $accounts
*
* @return \Illuminate\Http\JsonResponse
*/
public function period(Category $category, Carbon $start, Carbon $end, Collection $accounts)
{
// chart properties for cache:
$cache = new CacheProperties();
$cache->addProperty($start);
$cache->addProperty($end);
$cache->addProperty($accounts);
$cache->addProperty($category->id);
$cache->addProperty('category');
$cache->addProperty('period');
if ($cache->has()) {
return Response::json($cache->get());
}
/** @var CRI $repository */
$repository = app(CRI::class);
$categoryCollection = new Collection([$category]);
// loop over period, add by users range:
$current = clone $start;
$viewRange = Preferences::get('viewRange', '1M')->data;
$format = strval(trans('config.month'));
$set = new Collection;
while ($current < $end) {
$currentStart = clone $current;
$currentEnd = Navigation::endOfPeriod($currentStart, $viewRange);
$spent = $repository->spentInPeriod($categoryCollection, $accounts, $currentStart, $currentEnd);
$earned = $repository->earnedInPeriod($categoryCollection, $accounts, $currentStart, $currentEnd);
$entry = [
$category->name,
$currentStart->formatLocalized($format),
$spent,
$earned,
];
$set->push($entry);
$currentEnd->addDay();
$current = clone $currentEnd;
}
$data = $this->generator->period($set);
$cache->store($data);
return Response::json($data);
}
/** /**
* @param CRI $repository * @param CRI $repository
* @param Category $category * @param Category $category

View File

@ -314,9 +314,6 @@ class ReportController extends Controller
// find the budgets we've spent money on this period with these accounts: // find the budgets we've spent money on this period with these accounts:
$budgets = $this->budgetHelper->getBudgetsWithExpenses($start, $end, $accounts); $budgets = $this->budgetHelper->getBudgetsWithExpenses($start, $end, $accounts);
// find the categories we've spent money on this period with these accounts:
$categories = $this->helper->getCategoriesWithTransactions($start, $end, $accounts);
Session::flash('gaEventCategory', 'report'); Session::flash('gaEventCategory', 'report');
Session::flash('gaEventAction', 'year'); Session::flash('gaEventAction', 'year');
Session::flash('gaEventLabel', $start->format('Y')); Session::flash('gaEventLabel', $start->format('Y'));
@ -333,7 +330,7 @@ class ReportController extends Controller
'reports.default.year', 'reports.default.year',
compact( compact(
'start', 'accountReport', 'incomes', 'reportType', 'accountIds', 'end', 'start', 'accountReport', 'incomes', 'reportType', 'accountIds', 'end',
'expenses', 'incomeTopLength', 'expenseTopLength', 'tags', 'budgets', 'categories' 'expenses', 'incomeTopLength', 'expenseTopLength', 'tags', 'budgets'
) )
); );
} }

View File

@ -31,7 +31,6 @@ use View;
* *
* @package FireflyIII\Http\Controllers\Transaction * @package FireflyIII\Http\Controllers\Transaction
* *
* TODO support piggy banks
*/ */
class SplitController extends Controller class SplitController extends Controller
{ {
@ -132,9 +131,7 @@ class SplitController extends Controller
$repository->storeTransaction($journal, $transaction); $repository->storeTransaction($journal, $transaction);
} }
// TODO move to repository $repository->markAsComplete($journal);
$journal->completed = 1;
$journal->save();
Session::flash('success', strval(trans('firefly.stored_journal', ['description' => e($journal->description)]))); Session::flash('success', strval(trans('firefly.stored_journal', ['description' => e($journal->description)])));
Preferences::mark(); Preferences::mark();

View File

@ -18,6 +18,7 @@ use FireflyIII\Helpers\Attachments\AttachmentHelperInterface;
use FireflyIII\Http\Requests\JournalFormRequest; use FireflyIII\Http\Requests\JournalFormRequest;
use FireflyIII\Http\Requests\MassDeleteJournalRequest; use FireflyIII\Http\Requests\MassDeleteJournalRequest;
use FireflyIII\Http\Requests\MassEditJournalRequest; use FireflyIII\Http\Requests\MassEditJournalRequest;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
@ -165,13 +166,11 @@ class TransactionController extends Controller
'amount' => TransactionJournal::amountPositive($journal), 'amount' => TransactionJournal::amountPositive($journal),
]; ];
// TODO support split withdrawal if ($journal->isWithdrawal() && $destinationAccounts->first()->accountType->type == AccountType::CASH) {
if ($journal->isWithdrawal() && TransactionJournal::destinationAccountTypeStr($journal) == 'Cash account') {
$preFilled['destination_account_name'] = ''; $preFilled['destination_account_name'] = '';
} }
// TODO support split withdrawal if ($journal->isDeposit() && $sourceAccounts->first()->accountType->type == AccountType::CASH) {
if ($journal->isDeposit() && TransactionJournal::sourceAccountTypeStr($journal) == 'Cash account') {
$preFilled['source_account_name'] = ''; $preFilled['source_account_name'] = '';
} }

View File

@ -210,7 +210,6 @@ Route::group(
// categories: // categories:
Route::get('/chart/category/frontpage', ['uses' => 'Chart\CategoryController@frontpage']); Route::get('/chart/category/frontpage', ['uses' => 'Chart\CategoryController@frontpage']);
Route::get('/chart/category/period/{category}/default/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\CategoryController@period']);
// these three charts are for reports: // these three charts are for reports:
Route::get('/chart/category/multi-year/default/{start_date}/{end_date}/{accountList}/{categoryList}', ['uses' => 'Chart\CategoryController@multiYear']); Route::get('/chart/category/multi-year/default/{start_date}/{end_date}/{accountList}/{categoryList}', ['uses' => 'Chart\CategoryController@multiYear']);

View File

@ -164,7 +164,7 @@ class Account extends Model
} }
/** /**
* FIXME can return null * FIxxME can return null
* *
* @param $value * @param $value
* *

View File

@ -91,9 +91,6 @@ class ExportJobRepository implements ExportJobRepositoryInterface
} }
/** /**
*
* FIXME this may return null
*
* @param string $key * @param string $key
* *
* @return ExportJob|null * @return ExportJob|null

View File

@ -64,7 +64,7 @@ class RuleRepository implements RuleRepositoryInterface
} }
/** /**
* FIXME can return null * FIxXME can return null
* *
* @return RuleGroup * @return RuleGroup
*/ */

View File

@ -1,63 +0,0 @@
<?php
declare(strict_types = 1);
namespace FireflyIII\Repositories\Shared;
use Carbon\Carbon;
use DB;
use FireflyIII\Models\TransactionType;
use Illuminate\Support\Collection;
/**
* Class ComponentRepository
*
* @package FireflyIII\Repositories\Shared
*/
class ComponentRepository
{
/**
* @param $object
* @param Carbon $start
* @param Carbon $end
* @param Collection $accounts
*
* @return string
*/
protected function commonBalanceInPeriod($object, Carbon $start, Carbon $end, Collection $accounts)
{
// all balances based on transaction journals:
// TODO somehow exclude those with transactions below?
// TODO needs a completely new query.
$ids = $accounts->pluck('id')->toArray();
$entry = $object->transactionjournals()
->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id')
->whereIn('accounts.id', $ids)
->transactionTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::OPENING_BALANCE])
->before($end)
->after($start)
->first([DB::raw('SUM(`transactions`.`amount`) as `journalAmount`')]);
$amount = $entry->journalAmount ?? '0';
// all balances based on individual transactions (at the moment, it's an "or or"):
$entry = $object
->transactions()
// left join journals to get some meta-information.
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
// also left join transaction types so we can do the same type of filtering.
->leftJoin('transaction_types', 'transaction_journals.transaction_type_id', '=', 'transaction_types.id')
// need to do these manually.
->whereIn('transaction_types.type', [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::OPENING_BALANCE])
->where('transaction_journals.date', '>=', $start->format('Y-m-d 00:00:00'))
->where('transaction_journals.date', '<=', $end->format('Y-m-d 00:00:00'))
->whereIn('transactions.account_id', $ids)
->first([DB::raw('SUM(`transactions`.`amount`) as `journalAmount`')]);
// sum of amount:
$extraAmount = $entry->journalAmount ?? '0';
$result = bcadd($amount, $extraAmount);
return $result;
}
}

View File

@ -229,11 +229,9 @@ class TagRepository implements TagRepositoryInterface
// $checkAccount is the source_account for a withdrawal // $checkAccount is the source_account for a withdrawal
// $checkAccount is the destination_account for a deposit // $checkAccount is the destination_account for a deposit
// TODO match split journals
if ($check->isWithdrawal() && TransactionJournal::sourceAccount($check)->id != TransactionJournal::destinationAccount($journal)->id) { if ($check->isWithdrawal() && TransactionJournal::sourceAccount($check)->id != TransactionJournal::destinationAccount($journal)->id) {
$match = false; $match = false;
} }
// TODO match split journals
if ($check->isDeposit() && TransactionJournal::destinationAccount($check)->id != TransactionJournal::destinationAccount($journal)->id) { if ($check->isDeposit() && TransactionJournal::destinationAccount($check)->id != TransactionJournal::destinationAccount($journal)->id) {
$match = false; $match = false;
} }

View File

@ -52,7 +52,6 @@ final class FromAccountContains extends AbstractTrigger implements TriggerInterf
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split withdrawals
$fromAccountName = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name); $fromAccountName = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);
$strpos = strpos($fromAccountName, $search); $strpos = strpos($fromAccountName, $search);

View File

@ -52,7 +52,6 @@ final class FromAccountEnds extends AbstractTrigger implements TriggerInterface
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split withdrawals
$name = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name); $name = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name);
$nameLength = strlen($name); $nameLength = strlen($name);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);

View File

@ -52,7 +52,6 @@ final class FromAccountIs extends AbstractTrigger implements TriggerInterface
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split withdrawals
$name = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name); $name = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);

View File

@ -52,7 +52,6 @@ final class FromAccountStarts extends AbstractTrigger implements TriggerInterfac
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split withdrawals
$name = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name); $name = strtolower($journal->source_account_name ?? TransactionJournal::sourceAccount($journal)->name);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);

View File

@ -52,7 +52,6 @@ final class ToAccountContains extends AbstractTrigger implements TriggerInterfac
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split journals
$toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name); $toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);
$strpos = strpos($toAccountName, $search); $strpos = strpos($toAccountName, $search);

View File

@ -52,7 +52,6 @@ final class ToAccountEnds extends AbstractTrigger implements TriggerInterface
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split journals
$toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name); $toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name);
$toAccountNameLength = strlen($toAccountName); $toAccountNameLength = strlen($toAccountName);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);

View File

@ -52,7 +52,6 @@ final class ToAccountIs extends AbstractTrigger implements TriggerInterface
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split journals
$toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name); $toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);

View File

@ -52,7 +52,6 @@ final class ToAccountStarts extends AbstractTrigger implements TriggerInterface
*/ */
public function triggered(TransactionJournal $journal): bool public function triggered(TransactionJournal $journal): bool
{ {
// TODO support split journals
$toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name); $toAccountName = strtolower($journal->destination_account_name ?? TransactionJournal::destinationAccount($journal)->name);
$search = strtolower($this->triggerValue); $search = strtolower($this->triggerValue);

View File

@ -1,61 +0,0 @@
/*
* boxes.js
* Copyright (C) 2016 thegrumpydictator@gmail.com
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
$(function () {
"use strict";
$('button[data-widget="collapse"]').click(storeBoxState);
// restore boxes to their original state:
$.each($('.box'), function (i, v) {
var box = $(v);
if (box.attr('id')) {
var state = getBoxState(box.attr('id'));
console.log('Box ' + box.attr('id') + ' should be ' + state);
if(state == 'closed') {
$('button[data-widget="collapse"]', box).click();
}
}
});
});
function storeBoxState(e) {
"use strict";
//Find the box parent
var button = $(e.target);
var box = button.parents(".box").first();
var id = box.attr('id');
if (id) {
console.log('Box has id: ' + id);
if (box.hasClass('collapsed-box')) {
setBoxState(id, 'open');
console.log('Box "' + id + '" is now opening / open.');
} else {
setBoxState(id, 'closed');
console.log('Box "' + id + '" is now closing / closed.');
}
}
}
function setBoxState(id, state) {
"use strict";
var index = 'ff-box-state-' + id;
if (typeof(Storage) !== "undefined") {
localStorage.setItem(index, state);
}
}
function getBoxState(id) {
"use strict";
var index = 'ff-box-state-' + id;
if (typeof(Storage) !== "undefined") {
var state = localStorage.getItem(index);
if (state) {
return state;
}
}
return 'open';
}

View File

@ -27,15 +27,6 @@ function drawChart() {
columnChart('chart/budget/period/' + budgetId + '/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, id); columnChart('chart/budget/period/' + budgetId + '/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, id);
}); });
// and another loop
$.each($('.category_year_chart'), function (i, v) {
var holder = $(v);
var id = holder.attr('id');
var categoryId = holder.data('category');
columnChart('chart/category/period/' + categoryId + '/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, id);
});
} }

View File

@ -21,7 +21,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">

View File

@ -13,7 +13,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">

View File

@ -14,7 +14,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">

View File

@ -13,7 +13,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">

View File

@ -26,7 +26,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">

View File

@ -10,12 +10,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ periodStart }} &mdash; {{ periodEnd }}</h3> <h3 class="box-title">{{ periodStart }} &mdash; {{ periodEnd }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<div class="row"> <div class="row">
@ -68,11 +62,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'transactionsWithoutBudget'|_ }}</h3> <h3 class="box-title">{{ 'transactionsWithoutBudget'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<p> <p>
@ -86,11 +75,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'createBudget'|_ }}</h3> <h3 class="box-title">{{ 'createBudget'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<a href="{{ route('budgets.create') }}" class="btn btn-success pull-right">{{ 'createBudget'|_ }}</a> <a href="{{ route('budgets.create') }}" class="btn btn-success pull-right">{{ 'createBudget'|_ }}</a>
@ -116,7 +100,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
@ -200,10 +183,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'inactiveBudgets'|_ }}</h3> <h3 class="box-title">{{ 'inactiveBudgets'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{% for index,budget in inactive %} {% for index,budget in inactive %}

View File

@ -13,7 +13,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">

View File

@ -12,12 +12,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'csv_column_roles_title'|_ }}</h3> <h3 class="box-title">{{ 'csv_column_roles_title'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<p>{{ 'csv_column_roles_text'|_ }}</p> <p>{{ 'csv_column_roles_text'|_ }}</p>
@ -34,12 +28,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'csv_column_roles_table'|_ }}</h3> <h3 class="box-title">{{ 'csv_column_roles_table'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">

View File

@ -12,12 +12,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'csv_download_config_title'|_ }}</h3> <h3 class="box-title">{{ 'csv_download_config_title'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<p> <p>

View File

@ -12,12 +12,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'csv_index_title'|_ }}</h3> <h3 class="box-title">{{ 'csv_index_title'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{{ 'csv_index_text'|_ }} {{ 'csv_index_text'|_ }}
@ -44,12 +38,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'csv_upload_form'|_ }}</h3> <h3 class="box-title">{{ 'csv_upload_form'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">

View File

@ -12,12 +12,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'csv_map_title'|_ }}</h3> <h3 class="box-title">{{ 'csv_map_title'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<p> <p>
@ -38,12 +32,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ Config.get('csv.roles.'~columnName~'.name') }}</h3> <h3 class="box-title">{{ Config.get('csv.roles.'~columnName~'.name') }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body no-padding"> <div class="box-body no-padding">
<table class="table table-hover"> <table class="table table-hover">

View File

@ -12,12 +12,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'csv_process_title'|_ }}</h3> <h3 class="box-title">{{ 'csv_process_title'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<p> <p>

View File

@ -16,10 +16,6 @@
<div class="box box-primary"> <div class="box box-primary">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'yourAccounts'|_ }}</h3> <h3 class="box-title">{{ 'yourAccounts'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<canvas id="accounts-chart" style="width:100%;height:400px;" height="400" width="100%"></canvas> <canvas id="accounts-chart" style="width:100%;height:400px;" height="400" width="100%"></canvas>
@ -30,10 +26,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'budgetsAndSpending'|_ }}</h3> <h3 class="box-title">{{ 'budgetsAndSpending'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<canvas id="budgets-chart" style="width:100%;" height="400"></canvas> <canvas id="budgets-chart" style="width:100%;" height="400"></canvas>
@ -44,9 +36,6 @@
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'categories'|_ }}</h3> <h3 class="box-title">{{ 'categories'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<canvas id="categories-chart" style="width:100%;" height="400"></canvas> <canvas id="categories-chart" style="width:100%;" height="400"></canvas>
@ -59,10 +48,7 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'bills'|_ }}</h3> <h3 class="box-title">{{ 'bills'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<canvas id="bills-chart" style="width:100%;" height="250"></canvas> <canvas id="bills-chart" style="width:100%;" height="250"></canvas>
@ -77,7 +63,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
@ -111,9 +96,6 @@
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'expense_accounts'|_ }}</h3> <h3 class="box-title">{{ 'expense_accounts'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<canvas id="expense-accounts-chart" style="width:100%;" height="400"></canvas> <canvas id="expense-accounts-chart" style="width:100%;" height="400"></canvas>
@ -128,9 +110,6 @@
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'savings'|_ }}</h3> <h3 class="box-title">{{ 'savings'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{% if savings|length == 0 %} {% if savings|length == 0 %}
@ -195,9 +174,6 @@
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'piggyBanks'|_ }}</h3> <h3 class="box-title">{{ 'piggyBanks'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{% if piggyBankAccounts|length == 0 %} {% if piggyBankAccounts|length == 0 %}

View File

@ -195,7 +195,6 @@
</script> </script>
<script type="text/javascript" src="js/ff/firefly.js"></script> <script type="text/javascript" src="js/ff/firefly.js"></script>
<script type="text/javascript" src="js/ff/boxes.js"></script>
<script type="text/javascript" src="js/ff/help.js"></script> <script type="text/javascript" src="js/ff/help.js"></script>
{% block scripts %}{% endblock %} {% block scripts %}{% endblock %}

View File

@ -23,7 +23,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">

View File

@ -61,38 +61,12 @@
</div> </div>
</div> </div>
{% for category in categories %}
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="box" id="year-cat-{{ category.id }}">
<div class="box-header with-border">
<h3 class="box-title">{{ 'category'|_ }} {{ category.name }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div>
<div class="box-body">
<canvas height="400" id="categories_{{ category.id }}" class="category_year_chart" data-category="{{ category.id }}"
style="width:100%;height:400px;"></canvas>
</div>
</div>
</div>
</div>
{% endfor %}
{% for budget in budgets %} {% for budget in budgets %}
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-sm-12"> <div class="col-lg-12 col-md-12 col-sm-12">
<div class="box" id="year-budget-{{ budget.id }}"> <div class="box" id="year-budget-{{ budget.id }}">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'budget'|_ }} {{ budget.name }}</h3> <h3 class="box-title">{{ 'budget'|_ }} {{ budget.name }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<canvas height="400" id="budgets_{{ budget.id }}" class="budget_year_chart" data-budget="{{ budget.id }}" <canvas height="400" id="budgets_{{ budget.id }}" class="budget_year_chart" data-budget="{{ budget.id }}"

View File

@ -9,10 +9,6 @@
<div class="box box-primary"> <div class="box box-primary">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'rules'|_ }}</h3> <h3 class="box-title">{{ 'rules'|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<p> <p>
@ -38,7 +34,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i
class="fa fa-ellipsis-v"></i></button> class="fa fa-ellipsis-v"></i></button>

View File

@ -17,9 +17,6 @@
<div class="box box-danger"> <div class="box box-danger">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'errors'|_ }}</h3> <h3 class="box-title">{{ 'errors'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<ul> <ul>
@ -37,10 +34,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'transaction_meta_data'|_ }}</h3> <h3 class="box-title">{{ 'transaction_meta_data'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{{ ExpandedForm.text('journal_description', journal.description) }} {{ ExpandedForm.text('journal_description', journal.description) }}
@ -66,10 +59,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'transaction_dates'|_ }}</h3> <h3 class="box-title">{{ 'transaction_dates'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{{ ExpandedForm.date('date', journal.date) }} {{ ExpandedForm.date('date', journal.date) }}
@ -89,10 +78,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'splits'|_ }}</h3> <h3 class="box-title">{{ 'splits'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<table class="table table-bordered table-condensed table-striped split-table"> <table class="table table-bordered table-condensed table-striped split-table">

View File

@ -17,9 +17,6 @@
<div class="box box-danger"> <div class="box box-danger">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'errors'|_ }}</h3> <h3 class="box-title">{{ 'errors'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<ul> <ul>
@ -37,10 +34,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'transaction_meta_data'|_ }}</h3> <h3 class="box-title">{{ 'transaction_meta_data'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{{ ExpandedForm.text('journal_description', journal.description) }} {{ ExpandedForm.text('journal_description', journal.description) }}
@ -69,10 +62,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'transaction_dates'|_ }}</h3> <h3 class="box-title">{{ 'transaction_dates'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{{ ExpandedForm.date('date', journal.date) }} {{ ExpandedForm.date('date', journal.date) }}
@ -92,10 +81,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ 'splits'|_ }}</h3> <h3 class="box-title">{{ 'splits'|_ }}</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<table class="table table-bordered table-condensed table-striped split-table"> <table class="table table-bordered table-condensed table-striped split-table">

View File

@ -10,10 +10,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">Tags</h3> <h3 class="box-title">Tags</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<p> <p>
@ -40,10 +36,6 @@
<div class="box"> <div class="box">
<div class="box-header with-border"> <div class="box-header with-border">
<h3 class="box-title">{{ ('tag_title_'~type)|_ }}</h3> <h3 class="box-title">{{ ('tag_title_'~type)|_ }}</h3>
<!-- ACTIONS MENU -->
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
{% for year,months in collection[type] %} {% for year,months in collection[type] %}

View File

@ -15,7 +15,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
@ -53,7 +52,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
@ -85,7 +83,6 @@
<!-- ACTIONS MENU --> <!-- ACTIONS MENU -->
<div class="box-tools pull-right"> <div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="btn-group"> <div class="btn-group">
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button> <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">