Rewrote frontend with AngularJS framework.

This commit is contained in:
Alexis Lahouze
2013-02-07 15:00:31 +01:00
parent 8807c6ae01
commit 1e44d67b3f
13 changed files with 17706 additions and 758 deletions

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="fr">
<html lang="fr" ng-app="$strap">
<head>
<!-- Title -->
<title>Entries</title>
@ -20,38 +20,39 @@
<div class="span12">
<!-- Navbar with accounts -->
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="navbar-inner" ng-controller="AccountController">
<!-- Title -->
<a class="brand" href="#">&nbsp;Comptes</a>
<!-- Account list -->
<div class="nav" data-bind="foreach: accounts, value: account">
<div class="nav" ng-repeat="account in accounts">
<div class="btn-group">
<!-- Account button -->
<button class="btn btn-nav" data-bind="css: { active: $data === $root.account() }, click: $parent.selectAccount"><span data-bind="text: name"></span>&nbsp;(<span data-bind="text: current, css: {'text-warning': $data.current < 0 && $data.current >= $data.authorized_overdraft, 'text-error': $data.current < $data.authorized_overdraft }"></span>&nbsp;/&nbsp;<span data-bind="text: pointed"></span>)</button>
<button class="btn btn-nav" ng-class="accountClass(account)" ng-click="selectAccount(account)">{{account.name}}&nbsp;(<span ng-class="valueClass(account, account.current)">{{account.current}}</span>&nbsp;/&nbsp;<span ng-class="valueClass(account, account.pointed)">{{account.pointed}}</span>)</button>
<!-- Dropdown button -->
<button class="btn btn-nav dropdown-toggle" data-toggle="dropdown"><b class="caret"></b></button>
<!-- Dropdown menu -->
<ul class="dropdown-menu">
<li><a href="#" data-bind="click: $root.editAccount">Modifier</a></li>
<li><a href="#" data-bind="click: $root.removeAccount">Supprimer</a></li>
<li><a href="#" ng-click="editAccount(account)" bs-modal="'templates/account_edit.html'">Modifier</a></li>
<li><a href="#" bs-modal="'templates/account_remove.html'">Supprimer</a></li>
</ul>
</div>
</div>
<!-- New account button -->
<div class="btn btn-nav">
<a data-bind="click: $root.addAccount" href="#"><i class="icon-plus"></i></a>
<a bs-modal="'templates/account_new.html'" href="#"><i class="icon-plus"></i></a>
</div>
</div>
</div>
<!-- Navbar with the months of the selected account -->
<div class="navbar navbar-fixed-bottom">
<div class="navbar-inner">
<ul data-bind="foreach: months()" class="nav">
<li data-bind="css: {'active': $data == $root.month()}"><a href="#" data-bind="click: $parent.selectMonth"><span data-bind="text: $data.year"></span>-<span data-bind="text: $data.month"></span></a></li>
<div class="navbar-inner" ng-controller="MonthController">
<ul ng-repeat="month in months" class="nav">
<li ng-class="monthClass(month)"><a href="#" ng-click="selectMonth(month)">{{month.year}}-{{month.month}}</a></li>
</ul>
</div>
</div>
@ -63,12 +64,12 @@
<div class="row-fluid">
<!-- Sold evolution chart placeholder -->
<div class="span8">
<div id="entries-chart-placeholder" data-bind="chart: $root.entriesChart"></div>
<div id="entries-chart-placeholder"></div>
</div>
<!-- Expense category piechart -->
<div class="span4">
<div id="expense-categories-chart-placeholder" data-bind="pieChart: $root.expenseCategoriesChart"></div>
<div id="expense-categories-chart-placeholder"></div>
</div>
</div>
@ -78,13 +79,12 @@
</div>
<!-- Row with entry table -->
<div class="row-fluid">
<div class="row-fluid" ng-controller="EntryController">
<table class="table table-striped table-condensed table-hover">
<!-- Head of the table containing column headers and size -->
<thead>
<tr>
<th style="width: 100px">Date de valeur</th>
<!--<th style="width: 100px">Date de l'op.</th>-->
<th style="width: 100px">Date d'op.</th>
<th>Libell&eacute; de l'op&eacute;ration</th>
<th style="width: 50px">Montant</th>
<th style="width: 50px">Solde</th>
@ -94,156 +94,48 @@
</thead>
<!-- Body of the table containing the entries -->
<tbody data-bind="template:{name: templateToUse, foreach: entries}"></tbody>
<tbody>
<tr id="entry_{{entry.id}}" class="form-inline" ng-class="entryRowClass(entry.sold)" ng-repeat="entry in entries">
<td>
<input ng-show="isEditing(entry)" type="text" class="input-small" ng-model="entry.operation_date" data-date-format="yyyy-mm-dd" bs-datepicker/>
<span ng-show="isDisplaying(entry)">{{entry.operation_date}}</span>
</td>
<td>
<input ng-show="isEditing(entry)" type="text" class="input-xxlarge" ng-model="entry.label"/>
<span ng-show="isDisplaying(entry)">{{entry.label}}</span>
</td>
<td>
<input ng-show="isEditing(entry)" type="text" class="input-mini" ng-model="entry.value"/>
<span ng-show="isDisplaying(entry)">{{entry.value}}</span>
</td>
<td ng-class="entryValueClass(entry.sold)">{{entry.sold}}</td>
<td>
<input ng-show="isEditing(entry)" type="text" class="input-small" ng-model="entry.category" bs-typeahead="categories"/>
<span ng-show="isDisplaying(entry)">{{entry.category}}</span>
</td>
<td>
<div class="btn-group" ng-show="isEditing(entry)">
<a class="btn btn-mini btn-success" ng-click="saveEntry(entry)" href="#entry_{{entry.id}}" title="Save"><i ng-class="iconSaveClass(entry)"><span style="display: none">Save</span></i></a>
<a class="btn btn-mini" ng-click="cancelEditEntry(entry)" href="#entry_{{entry.id}}" title="Cancel"><i ng-class="iconCancelClass(entry)"><span style="display: none">Cancel</span></i></a>
<a class="btn btn-mini" ng-click="pointEntry(entry)" ng-class="pointedEntryClass(entry)" href="#entry_{{entry.id}}" title="point"><i class="icon-pencil"><span style="display: none">Point</span></i></a>
</div>
<div class="btn-group" ng-show="isDisplaying(entry)">
<a class="btn btn-mini" ng-click="editEntry(entry)" href="#entry_{{entry.id}}" title="edit"><i class="icon-edit"><span style="display: none">Edit</span></i></a>
<a class="btn btn-mini" bs-modal="'templates/entry_remove.html'" href="#entry_{{entry.id}}" title="remove"><i class="icon-trash"><span style="display: none">Remove</span></i></a>
<a class="btn btn-mini" ng-click="pointEntry(entry)" ng-class="pointedEntryClass(entry)" href="#entry_{{entry.id}}" title="point"><i class="icon-pencil"><span style="display: none">Point</span></i></a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Emtpy row with bottom margin to avoid data undur the fixed bottom navbar -->
<!-- Emtpy row with bottom margin to avoid data under the fixed bottom navbar -->
<div class="row-fluid" style="margin-bottom: 21px"></div>
</div>
</div>
</div>
<!-- Confirm entry removal modal dialog -->
<div id="remove-confirm" class="modal hide fade">
<!-- Dialog header with title -->
<div class="modal-header">
<h3>Confirmer la suppression</h3>
</div>
<!-- Dialog body -->
<div class="modal-body">
<p>Confirmez-vous la suppression de cette entr&eacute;e ?</p>
</div>
<!-- Dialog footer with buttons -->
<div class="modal-footer">
<a href="#" class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Non</a>
<a href="#" class="btn" data-bind="click: confirmRemove">Oui</a>
</div>
</div>
<!-- Confirm account removal modal dialog -->
<div id="remove-account-confirm" class="modal hide fade">
<!-- Dialog header with title -->
<div class="modal-header">
<h3>Confirmer la suppression</h3>
</div>
<!-- Dialog body -->
<div class="modal-body">
<p>Confirmez-vous la suppression de ce compte ?</p>
</div>
<!-- Dialog footer with buttons -->
<div class="modal-footer">
<a href="#" class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Non</a>
<a href="#" class="btn" data-bind="click: confirmAccountRemove">Oui</a>
</div>
</div>
<!-- Account edit modal dialog -->
<div id="edit-account" class="modal hide fade">
<!-- Dialog header with title -->
<div class="modal-header">
<h3>&Eacute;diter le compte</h3>
</div>
<!-- Dialog body -->
<div class="modal-body">
<form class="form-horizontal" data-bind="with: editingAccount">
<div class="control-group">
<!-- Account name field -->
<label class="control-label" for="inputName">Nom du compte</label>
<div class="controls">
<input type="text" id="inputName" data-bind="value: name"></input>
</div>
<!-- Authorized overdraft field -->
<label class="control-label" for="inputAuthorizedOverdraft">D&eacute;couvert authoris&eacute;</label>
<div class="controls">
<input type="text" id="inputAuthorizedOverdraft" data-bind="value: authorized_overdraft"></input>
</div>
</div>
</form>
</div>
<!-- Dialog footer with buttons -->
<div class="modal-footer">
<a href="#" class="btn btn-primary" data-bind="click: saveAccount">OK</a>
<a href="#" class="btn" data-bind="click: cancelEditAccount">Annuler</a>
</div>
</div>
<!-- Displayed item template -->
<script id="itemsTmpl" type="text/html">
<tr data-bind="css: { 'warning': sold() < 0 && sold() >= $root.account().authorized_overdraft(), 'error': sold() < $root.account().authorized_overdraft() }">
<td data-bind="text: operation_date"></td>
<td data-bind="text: label"></td>
<td data-bind="text: value, css: {'text-error': value() < 0 }"></td>
<td data-bind="text: sold, css: {'text-warning': sold() < 0 && sold() >= $root.account().authorized_overdraft(), 'text-error': sold() < $root.account().authorized_overdraft() }"></td>
<td data-bind="text: category"></td>
<td>
<div class="btn-group">
<a class="btn btn-mini" data-bind="click: $root.edit" href="#" title="edit"><i class="icon-edit"></i></a>
<a class="btn btn-mini" data-bind="click: $root.remove" href="#" title="remove"><i class="icon-trash"></i></a>
<a class="btn btn-mini" data-bind="css: {'active': pointed}, click: $root.pointEntry" href="#" title="point"><i class="icon-pencil"></i></a>
</div>
</td>
</tr>
</script>
<!-- New item template -->
<script id="newTmpl" type="text/html">
<tr class="form-inline">
<td><input type="text" class="input-small" data-bind="value: operation_date" data-date-format="yyyy-mm-dd" id="new_operation_date" /></td>
<td><input type="text" class="input-xxlarge" data-bind="value: label"/></td>
<td><input type="text" class="input-mini" data-bind="value: value"/></td>
<td></td>
<td><input type="text" class="input-small" data-bind="value: category, typeahead: {source: $root.categories }"/></td>
<td>
<div class="btn-group">
<a class="btn btn-mini btn-success" data-bind="click: $root.save" href="#" title="Add"><i class="icon-plus"></i></a>
<a class="btn btn-mini" data-bind="click: $root.cancel" href="#" title="Clear"><i class="icon-remove"></i></a>
<a class="btn btn-mini" data-bind="css: {'active': pointed}, click: $root.pointEntry" href="#" title="point"><i class="icon-pencil"></i></a>
</div>
</td>
</tr>
</script>
<!-- Edit item template -->
<script id="editTmpl" type="text/html">
<tr class="form-inline" data-bind="css: { 'warning': sold() < 0 && sold() >= $root.account().authorized_overdraft(), 'error': sold() < $root.account().authorized_overdraft() }">
<td><input type="text" class="input-small" data-bind="value: operation_date" data-date-format="yyyy-mm-dd" id="operation_date" /></td>
<td><input type="text" class="input-xxlarge" data-bind="value: label"/></td>
<td><input type="text" class="input-mini" data-bind="value: value"/></td>
<td data-bind="text: sold, css: {'text-warning': sold() < 0 && sold() >= $root.account().authorized_overdraft(), 'text-error': sold() < $root.account().authorized_overdraft() }"></td>
<td><input type="text" class="input-small" data-bind="value: category, typeahead: {source: $root.categories }" /></td>
<td>
<div class="btn-group">
<a class="btn btn-mini btn-success" data-bind="click: $root.save" href="#" title="Save"><i class="icon-ok"></i></a>
<a class="btn btn-mini" data-bind="click: $root.cancel" href="#" title="Cancel"><i class="icon-ban-circle"></i></a>
<a class="btn btn-mini" data-bind="css: {'active': pointed}, click: $root.pointEntry" href="#" title="point"><i class="icon-pencil"></i></a>
</div>
</td>
</tr>
</script>
<!-- JQuery Javascript library -->
<script type="text/javascript" src="jquery/jquery.min.js"></script>
<script type="text/javascript" src="jquery/jquery-migrate.min.js"></script>
@ -253,9 +145,10 @@
<!-- Bootstrap datepicker module -->
<script type="text/javascript" src="datepicker/js/bootstrap-datepicker.js"></script>
<!-- Knockoutjs.com Javascript library -->
<script type="text/javascript" src="knockout/knockout.min.js"></script>
<script type="text/javascript" src="knockout/knockout-mapping.min.js"></script>
<!-- Angular Javascript library -->
<!--<script type="text/javascript" src="angular/angular.min.js"></script>-->
<script type="text/javascript" src="angular/angular.min.js"></script>
<script type="text/javascript" src="angular/angular-strap.min.js"></script>
<!-- JQPlot Javascript library and needed modules -->
<script type="text/javascript" src="jqplot/jquery.jqplot.js"></script>
@ -268,9 +161,11 @@
<script type="text/javascript" src="jqplot/plugins/jqplot.canvasOverlay.min.js"></script>
<!-- Custom Javascript library for date manipulation -->
<script type="text/javascript" src="js/date.js"></script>
<!--<script type="text/javascript" src="js/date.js"></script>-->
<!-- Custom Javascript library for entries -->
<script type="text/javascript" src="js/months.js"></script>
<script type="text/javascript" src="js/accounts.js"></script>
<script type="text/javascript" src="js/entries.js"></script>
</body>
</html>