Show piggy banks [skip ci]

This commit is contained in:
James Cole 2015-05-02 11:32:45 +02:00
parent 5cd2ef4a5e
commit 81a2975f1a
13 changed files with 430 additions and 14 deletions

View File

@ -108,7 +108,7 @@ class ConfigServiceProvider extends ServiceProvider
| `Twig_Extension_Debug` is enabled automatically if twig.debug is TRUE.
|
*/
'enabled' => [
'enabled' => [
'TwigBridge\Extension\Loader\Facades',
'TwigBridge\Extension\Loader\Filters',
'TwigBridge\Extension\Loader\Functions',
@ -154,7 +154,7 @@ class ConfigServiceProvider extends ServiceProvider
| in order to be marked as safe.
|
*/
'facades' => [
'facades' => [
'Breadcrumbs' => [
'is_safe' => [
'renderIfExists'
@ -166,12 +166,12 @@ class ConfigServiceProvider extends ServiceProvider
'Config',
'ExpandedForm' => [
'is_safe' => [
'date','text','select','balance','optionsList','checkbox'
'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount'
]
],
'Form' => [
'Form' => [
'is_safe' => [
'input','select','checkbox','model','open'
'input', 'select', 'checkbox', 'model', 'open'
]
],
],
@ -205,10 +205,10 @@ class ConfigServiceProvider extends ServiceProvider
|
*/
'functions' => [
'elixir',
'head',
'last',
],
'elixir',
'head',
'last',
],
/*
|--------------------------------------------------------------------------

View File

@ -11,7 +11,8 @@ use FireflyIII\Support\Preferences;
use FireflyIII\Support\Steam;
use FireflyIII\Support\Twig\Budget;
use FireflyIII\Support\Twig\General;
use FireflyIII\Support\Twig\Journals;
use FireflyIII\Support\Twig\Journal;
use FireflyIII\Support\Twig\PiggyBank;
use FireflyIII\Validation\FireflyValidator;
use Illuminate\Support\ServiceProvider;
use Twig;
@ -38,8 +39,9 @@ class FireflyServiceProvider extends ServiceProvider
$config = App::make('config');
Twig::addExtension(new Functions($config));
Twig::addExtension(new PiggyBank);
Twig::addExtension(new General);
Twig::addExtension(new Journals);
Twig::addExtension(new Journal);
Twig::addExtension(new Budget);
}

View File

@ -9,11 +9,11 @@ use Twig_SimpleFilter;
use Twig_SimpleFunction;
/**
* Class Journals
* Class Journal
*
* @package FireflyIII\Support\Twig
*/
class Journals extends Twig_Extension
class Journal extends Twig_Extension
{
public function getFilters()

View File

@ -0,0 +1,41 @@
<?php
namespace FireflyIII\Support\Twig;
use Twig_Extension;
use Twig_SimpleFunction;
use FireflyIII\Models\PiggyBank as PB;
/**
* Class PiggyBank
*
* @package FireflyIII\Support\Twig
*/
class PiggyBank extends Twig_Extension
{
/**
*
*/
public function getFunctions()
{
$functions = [];
$functions[] = new Twig_SimpleFunction(
'currentRelevantRepAmount', function (PB $piggyBank) {
return $piggyBank->currentRelevantRep()->currentamount;
}
);
return $functions;
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'FireflyIII\Support\Twig\PiggyBank';
}
}

View File

@ -0,0 +1,23 @@
<div class="{{ classes }}">
<label for="{{ options.id }}" class="col-sm-4 control-label">{{ label }}</label>
<div class="col-sm-8">
<div class="input-group">
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle amountCurrencyDropdown" data-toggle="dropdown" aria-expanded="false">
<span id="amountCurrentSymbol">{{ defaultCurrency.symbol|raw }}</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
{% for currency in currencies %}
<li><a href="#" class="currencySelect" data-id="{{ currency.id }}" data-field="amount" data-currency="{{ currency.code }}" data-symbol="{{ currency.symbol|raw }}">{{ currency.name }}</a></li>
{% endfor %}
</ul>
</div>
{{ Form.input('number', name, value, options) }}
</div>
{% include 'form/feedback.twig' %}
</div>
<input type="hidden" name="amount_currency_id" value="{{ defaultCurrency.id }}" />
</div>

View File

@ -0,0 +1,33 @@
<table class="table table-bordered table-striped">
<tr>
{% if showPiggyBank %}
<th>Piggy bank</th>
{% endif %}
<th>Date</th>
<th>Amount</th>
</tr>
{% for event in events %}
<tr>
{% if showPiggyBank %}
<td>
<a href="{{ route('piggyBanks.show',event.piggyBank_id) }}">{{ event.piggyBank.name }}</a>
</td>
{% endif %}
<td>
{% if event.transaction_journal_id %}
<a href="{{ route('transactions.show',event.transaction_journal_id) }}" title="{{ event.transactionJournal.description }}">{{ event.date.format('j F Y') }}</a>
{% else %}
{{ event.date.format('j F Y') }}
{% endif %}
</td>
<td>
{% if event.amount < 0 %}
<span class="text-danger">Removed {{ event.amount*-1|formatAmountPlain }}</span>
{% else %}
<span class="text-success">Added {{ event.amount|formatAmountPlain }}</span>
{% endif %}
</td>
</tr>
{% endfor %}
</table>

View File

@ -0,0 +1,27 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
<h4 class="modal-title" id="myModalLabel">Add money to {{ piggyBank.name }}</h4>
</div>
<form style="display: inline;" id="add" action="{{ route('piggy-banks.add', piggyBank.id) }}" method="POST">
<div class="modal-body">
<p>
The maximum amount you can add is {{ maxAmount|formatAmount }}.
</p>
<div class="input-group">
<div class="input-group-addon">{{ getCurrencySymbol() }}</div>
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
<input step="any" class="form-control" id="amount" autocomplete="off" name="amount" max="{{ maxAmount|round(2) }}" type="number" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Add</button>
</div>
</form>
</div>
</div>

View File

@ -0,0 +1,57 @@
{% extends "./layout/default.twig" %}
{% block content %}
{{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName) }}
{{ Form.open({'class' : 'form-horizontal','id' : 'store','url' : route('piggy-banks.store')}) }}
<input type="hidden" name="repeats" value="0" />
<div class="row">
<div class="col-lg-6 col-md-12 col-sm-6">
<div class="panel panel-primary">
<div class="panel-heading">
<i class="fa fa-fw fa-exclamation"></i> Mandatory fields
</div>
<div class="panel-body">
{{ ExpandedForm.text('name') }}
{{ ExpandedForm.select('account_id',accounts,null,{'label' : 'Save on account'}) }}
{{ ExpandedForm.amount('targetamount') }}
</div>
</div>
</div>
<div class="col-lg-6 col-md-12 col-sm-12">
<!-- panel for optional fields -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-smile-o"></i> Optional fields
</div>
<div class="panel-body">
{{ ExpandedForm.date('targetdate') }}
{{ ExpandedForm.checkbox('remind_me','1',false,{'label' : 'Remind me'}) }}
{{ ExpandedForm.select('reminder',periods,'month',{'label' : 'Remind every'}) }}
</div>
</div>
<!-- panel for options -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-bolt"></i> Options
</div>
<div class="panel-body">
{{ ExpandedForm.optionsList('create','piggy bank') }}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<p>
<button type="submit" class="btn btn-lg btn-success">
<i class="fa fa-plus-circle"></i> Store new piggy bank
</button>
</p>
</div>
</div>
</form>
{% endblock %}

View File

@ -0,0 +1,26 @@
{% extends "./layout/default.twig" %}
{% block content %}
{{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, piggyBank) }}
{{ Form.open({'class' : 'form-horizontal','id' : 'destroy','url' : route('piggy-banks.destroy',piggyBank.id)}) }}
<div class="row">
<div class="col-lg-6 col-md-12 col-sm-12">
<div class="panel panel-red">
<div class="panel-heading">
Delete piggy bank "{{ piggyBank.name }}"
</div>
<div class="panel-body">
<p>
Are you sure?
</p>
<p>
<button type="submit" class="btn btn-default btn-danger">Delete permanently</button>
<a href="{{ URL.previous() }}" class="btn-default btn">Cancel</a >
</p>
</div>
</div>
</div>
</div>
</form>
{% endblock %}

View File

@ -0,0 +1,61 @@
{% extends "./layout/default.twig" %}
{% block content %}
{{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, piggyBank) }}
{{ Form.model(piggyBank, {'class' : 'form-horizontal','id' : 'update','url' : route('piggy-banks.update',piggyBank.id)}) }}
<input type="hidden" name="repeats" value="0" />
<input type="hidden" name="id" value="{{ piggyBank.id }}" />
<div class="row">
<div class="col-lg-6 col-md-12 col-sm-6">
<div class="panel panel-primary">
<div class="panel-heading">
<i class="fa fa-fw fa-exclamation"></i> Mandatory fields
</div>
<div class="panel-body">
{{ ExpandedForm.text('name') }}
{{ ExpandedForm.select('account_id',accounts,null,{'label' : 'Save on account'}) }}
{{ ExpandedForm.amount('targetamount') }}
</div>
</div>
</div>
<div class="col-lg-6 col-md-12 col-sm-12">
<!-- panel for optional fields -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-smile-o"></i> Optional fields
</div>
<div class="panel-body">
{{ ExpandedForm.date('targetdate') }}
{{ ExpandedForm.checkbox('remind_me','1',preFilled.remind_me,{'label' : 'Remind me'}) }}
{{ ExpandedForm.select('reminder',periods,preFilled.reminder,{'label' : 'Remind every'}) }}
</div>
</div>
<!-- panel for options -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-bolt"></i> Options
</div>
<div class="panel-body">
{{ ExpandedForm.optionsList('update','piggy bank') }}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<p>
<button type="submit" class="btn btn-lg btn-success">
<i class="fa fa-pencil"></i> Update piggy bank
</button>
</p>
</div>
</div>
</form>
{% endblock %}

View File

@ -4,7 +4,7 @@
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<p>
<i class="fa fa-sort-amount-asc fa-fw"></i> <a href="{{ route('piggy-banks.create') }}" class="btn btn-success">Create new piggy bank</a>
<a href="{{ route('piggy-banks.create') }}" class="btn btn-success"><i class="fa fa-sort-amount-asc fa-fw"></i> Create new piggy bank</a>
</p>
</div>
</div>

View File

@ -0,0 +1,26 @@
<div class="modal-dialog">
<div class="modal-content">
<form style="display: inline;" id="remove" action="{{ route('piggy-banks.remove', piggyBank.id) }}" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
<h4 class="modal-title" id="myModalLabel">Remove money from {{ piggyBank.name }}</h4>
</div>
<div class="modal-body">
<p>
The maximum amount you can remove is {{ currentRelevantRepAmount(piggyBank)|formatAmount }}
</p>
<div class="input-group">
<div class="input-group-addon">{{ getCurrencySymbol() }}</div>
<input step="any" class="form-control" id="amount" autocomplete="off" name="amount" max="{{ currentRelevantRepAmount(piggyBank)|round(2) }}" type="number">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Remove</button>
</div>
</form>
</div>
</div>

View File

@ -0,0 +1,120 @@
{% extends "./layout/default.twig" %}
{% block content %}
{{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, piggyBank) }}
<div class="row">
<div class="col-lg-8 col-md-8 col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-fw fa-clock-o"></i> Events
</div>
<div class="panel-body">
<div id="piggy-bank-history"></div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-4 col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-fw fa-info-circle"></i> Details
<!-- ACTIONS MENU -->
<div class="pull-right">
<div class="btn-group">
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
Actions
<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-right" role="menu">
<li><a href="{{ route('piggy-banks.edit', piggyBank.id) }}"><i class="fa fa-pencil fa-fw"></i> Edit</a></li>
<li><a href="{{ route('piggy-banks.delete', piggyBank.id) }}"><i class="fa fa-trash fa-fw"></i> Delete</a></li>
</ul>
</div>
</div>
</div>
<table class="table table-bordered table-striped">
<tr>
<td>Account</td>
<td><a href="{{ route('accounts.show', piggyBank.account_id) }}">{{ piggyBank.account.name }}</a></td>
</tr>
<tr>
<td>Target amount</td>
<td>{{ piggyBank.targetAmount|formatAmount }}</td>
</tr>
<tr>
<td>Saved so far</td>
<td>{{ currentRelevantRepAmount(piggyBank)|formatAmount }}</td>
</tr>
<tr>
<td>Left to save</td>
<td>{{ piggyBank.targetamount - currentRelevantRepAmount(piggyBank)|formatAmount }}</td>
</tr>
<tr>
<td>Start date</td>
<td>
{% if piggyBank.startdate %}
{{ piggyBank.startdate.format('jS F Y')}}
{% else %}
<em>No start date</em>
{% endif %}
</td>
</tr>
<tr>
<td>Target date</td>
<td>
{% if piggyBank.targetdate %}
{{ piggyBank.targetdate.format('jS F Y') }}
{% else %}
<em>No start date</em>
{% endif %}
</td>
</tr>
{% if piggyBank.reminder %}
<tr>
<td>Reminder</td>
<td>
{% if piggyBank.remind_me == 0 %}
<em>(no reminder)</em>
{% else %}
Every
{% if piggyBank.reminder_skip != 0 %}
{{ piggyBank.reminder_skip }}
{% else %}
{{ piggyBank.reminder }}(s)
{% endif %}
{% endif %}
</td>
</tr>
{% endif %}
<tr>
<td>Reminders left</td>
<td>(in progress...)</td>
</tr>
<tr>
<td>Expected amount per reminder</td>
<td>(in progress...)</td>
</tr>
</table>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-fw fa-clock-o"></i> Table
</div>
{% include 'list/piggy-bank-events' %}
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script type="text/javascript">
var piggyBankID = {{ piggyBank.id }};
</script>
<!-- load the libraries and scripts necessary for Google Charts: -->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="js/gcharts.options.js"></script>
<script type="text/javascript" src="js/gcharts.js"></script>
<script type="text/javascript" src="js/piggy-banks.js"></script>
{% endblock %}