Improve search and display of results.

This commit is contained in:
James Cole
2017-07-15 17:19:12 +02:00
parent 22144b78ea
commit accbdea942
18 changed files with 225 additions and 587 deletions

View File

@@ -5,151 +5,93 @@
{% endblock %}
{% block content %}
{% if query == "" %}
<div class="row">
<div class="col-lg-12">
<p>{{ 'no_results_for_empty_search'|_ }}</p>
<div class="row">
<div class="col-lg-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">{{ 'search_box'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ 'search_box_intro'|_ }}
</p>
{# search form #}
<form class="form-horizontal" action="{{ route('search.index') }}" method="get">
<div class="form-group">
<label for="query" class="col-sm-1 control-label">Query</label>
<div class="col-sm-10">
<input type="text" name="q" id="query" value="{{ fullQuery }}" class="form-control" placeholder="{{ fullQuery }}">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-10">
<button type="submit" class="btn btn-default"><i class="fa fa-search"></i> Search</button>
</div>
</div>
</form>
</div>
</div>
</div>
{% endif %}
</div>
{% if query %}
<div class="row">
<div class="col-lg-12">
<div class="box box-primary">
<div class="row result_row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="box search_box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'advanced_search'|_ }}</h3>
<h3 class="box-title">{{ 'transactions'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ 'advanced_search_intro'|_ }}
<p class="search_ongoing text-center" style="margin-top:70px;">
{{ 'search_searching'|_ }}
</p>
{# search form #}
<form class="form-horizontal" action="{{ route('search.index') }}" method="get">
<div class="form-group">
<label for="query" class="col-sm-1 control-label">Query</label>
<div class="col-sm-10">
<input type="text" name="q" id="query" value="{{ rawQuery }}" class="form-control" placeholder="{{ rawQuery }}">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-10">
<button type="submit" class="btn btn-default"><i class="fa fa-search"></i> Search</button>
</div>
</div>
</form>
<p class="search_count" style="display: none;">
{{ 'search_found_transactions'|_ }} <span class="search_count"></span>
</p>
<div class="search_results" style="display: none;">
</div>
{# loading indicator #}
<div class="overlay">
<i class="fa fa-refresh fa-spin"></i>
</div>
</div>
</div>
<p>{{ trans('firefly.results_limited', {count: limit}) }}</p>
</div>
</div>
{% if hasModifiers %}
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'transactions'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ trans('firefly.search_found_transactions', {count: result.transactions|length}) }}
</p>
{% include 'search.partials.transactions-large' with {'journals' : result.transactions} %}
</div>
<div class="row error_row" style="display:none; ">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="box box-danger">
<div class="box-header with-border">
<h3 class="box-title">{{ 'search_error'|_ }}</h3>
</div>
<div class="box-body">
<p class="search_ongoing">
{{ 'general_search_error'|_ }}
</p>
</div>
</div>
</div>
{% else %}
<div class="row">
{% if result.transactions|length > 0 %}
<div class="col-lg-6 col-md-12 col-sm-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'transactions'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ trans('firefly.search_found_transactions', {count: result.transactions|length}) }}
</p>
{% include 'search.partials.transactions' with {'transactions' : result.transactions} %}
</div>
</div>
</div>
{% endif %}
{% if result.categories|length > 0 %}
<div class="col-lg-6 col-md-12 col-sm-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'categories'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ trans('firefly.search_found_categories', {count: result.categories|length}) }}
</p>
{% include 'search.partials.categories' %}
</div>
</div>
</div>
{% endif %}
{% if result.tags|length > 0 %}
<div class="col-lg-6 col-md-12 col-sm-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'tags'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ trans('firefly.search_found_tags', {count: result.tags|length}) }}
</p>
{% include 'search.partials.tags' %}
</div>
</div>
</div>
{% endif %}
{% if result.accounts|length > 0 %}
<div class="col-lg-6 col-md-12 col-sm-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'accounts'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ trans('firefly.search_found_accounts', {count: result.accounts|length}) }}
</p>
{% include 'search.partials.accounts' %}
</div>
</div>
</div>
{% endif %}
{% if result.budgets|length > 0 %}
<div class="col-lg-6 col-md-12 col-sm-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'budgets'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ trans('firefly.search_found_budgets', {count: result.budgets|length}) }}
</p>
{% include 'search.partials.budgets' %}
</div>
</div>
</div>
{% endif %}
</div>
{% endif %}
</div>
{% endif %}
{% if query == "" %}
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ 'search_results'|_ }}</h3>
</div>
<div class="box-body">
<p>{{ 'no_results_for_empty_search'|_ }}</p>
</div>
</div>
</div>
</div>
{% endif %}
{% endblock %}
{% block scripts %}
<script type="text/javascript" src="js/lib/bootstrap-sortable.js"></script>
<script type="text/javascript">
var query = '{{ query }}';
var searchQuery = "{{ fullQuery|escape('js') }}";
var searchUri = "{{ route('search.search') }}";
</script>
{% endblock %}
{% block styles %}
<link rel="stylesheet" href="css/bootstrap-sortable.css" type="text/css" media="all"/>
{% endblock %}
<script type="text/javascript" src="js/ff/search/index.js"></script>
{% endblock %}

View File

@@ -1,36 +0,0 @@
<table class="table table-hover sortable">
<thead>
<tr>
<th class="hidden-sm hidden-xs" data-defaultsort="disabled">&nbsp;</th>
<th data-defaultsign="az">{{ trans('list.name') }}</th>
<th data-defaultsign="az" class="hidden-sm hidden-xs">{{ trans('list.type') }}</th>
<th data-defaultsign="az" class="hidden-sm hidden-xs">{{ trans('list.role') }}</th>
<th data-defaultsign="az" class="hidden-sm hidden-xs">{{ trans('list.iban') }}</th>
</tr>
</thead>
<tbody>
{% for account in result.accounts %}
<tr>
<td class="hidden-sm hidden-xs">
<div class="btn-group btn-group-xs">
<a class="btn btn-default btn-xs" href="{{ route('accounts.edit',account.id) }}"><i class="fa fa-fw fa-pencil"></i></a>
<a class="btn btn-danger btn-xs" href="{{ route('accounts.delete',account.id) }}"><i class="fa fa-fw fa-trash-o"></i></a>
</div>
</td>
<td data-value="{{ account.name }}">
<a href="{{ route('accounts.show',account.id) }}">{{ account.name }}</a>
</td>
<td>{{ trans('firefly.'~account.accountType.type) }}</td>
<td class="hidden-sm hidden-xs">
{% for entry in account.accountmeta %}
{% if entry.name == 'accountRole' %}
{{ ('account_role_'~entry.data)|_ }}
{% endif %}
{% endfor %}
</td>
<td class="hidden-sm hidden-xs">{{ account.iban }}</td>
</tr>
{% endfor %}
</tbody>
</table>

View File

@@ -1,24 +0,0 @@
<table class="table table-hover sortable">
<thead>
<tr>
<th class="hidden-sm hidden-xs" data-defaultsort="disabled">&nbsp;</th>
<th data-defaultsign="az">{{ trans('list.name') }}</th>
</tr>
</thead>
<tbody>
{% for budget in result.budgets %}
<tr>
<td class="hidden-sm hidden-xs" style="width:10%;">
<div class="btn-group btn-group-xs">
<a class="btn btn-default btn-xs" href="{{ route('budgets.edit', budget.id) }}"><i class="fa fa-fw fa-pencil"></i></a>
<a class="btn btn-danger btn-xs" href="{{ route('budgets.delete', budget.id) }}"><i class="fa fa-fw fa-trash-o"></i></a>
</div>
</td>
<td data-value="{{ budget.name }}">
<a href="{{ route('budgets.show',budget.id) }}">{{ budget.name }}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>

View File

@@ -1,24 +0,0 @@
<table class="table table-hover sortable">
<thead>
<tr>
<th class="hidden-sm hidden-xs" data-defaultsort="disabled">&nbsp;</th>
<th data-defaultsign="az">{{ trans('list.name') }}</th>
</tr>
</thead>
<tbody>
{% for category in result.categories %}
<tr>
<td class="hidden-sm hidden-xs" style="width:10%;">
<div class="btn-group btn-group-xs">
<a class="btn btn-default btn-xs" href="{{ route('categories.edit',category.id) }}"><i class="fa fa-fw fa-pencil"></i></a>
<a class="btn btn-danger btn-xs" href="{{ route('categories.delete',category.id) }}"><i class="fa fa-fw fa-trash-o"></i></a>
</div>
</td>
<td data-value="{{ category.name }}">
<a href="{{ route('categories.show',category.id) }}">{{ category.name }}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>

View File

@@ -1,26 +0,0 @@
<table class="table table-hover sortable">
<thead>
<tr>
<th class="hidden-sm hidden-xs" data-defaultsort="disabled">&nbsp;</th>
<th data-defaultsign="az">{{ trans('list.name') }}</th>
<th data-defaultsign="az">{{ trans('list.type') }}</th>
</tr>
</thead>
<tbody>
{% for tag in result.tags %}
<tr>
<td class="hidden-sm hidden-xs" style="width:10%;">
<div class="btn-group btn-group-xs">
<a class="btn btn-default btn-xs" href="{{ route('tags.edit', tag.id) }}"><i class="fa fa-fw fa-pencil"></i></a>
<a class="btn btn-danger btn-xs" href="{{ route('tags.delete', tag.id) }}"><i class="fa fa-fw fa-trash-o"></i></a>
</div>
</td>
<td data-value="{{ tag.tag }}">
<a href="{{ route('tags.show',tag.id) }}">{{ tag.tag }}</a>
</td>
<td>{{ ('tag'~tag.tagMode)|_ }}</td>
</tr>
{% endfor %}
</tbody>
</table>

View File

@@ -1,130 +0,0 @@
{{ journals.render|raw }}
<table class="table table-hover table-condensed {% if sorting %}sortable-table{% endif %}">
<thead>
<tr class="ignore">
<th class="hidden-xs no_select_boxes" colspan="2">&nbsp;</th>
<th class="hidden-xs select_boxes" colspan="2" style="display: none;"><input name="select_all" class="select_all" type="checkbox"/></th>
<th>{{ trans('list.description') }}</th>
<th>{{ trans('list.amount') }}</th>
<th class="hidden-sm hidden-xs">{{ trans('list.date') }}</th>
<th class="hidden-xs">{{ trans('list.from') }}</th>
<th class="hidden-xs">{{ trans('list.to') }}</th>
<!-- Hide budgets? -->
{% if not hideBudgets %}
<th class="hidden-xs"><i class="fa fa-tasks fa-fw" title="{{ trans('list.budget') }}"></i></th>
{% endif %}
<!-- Hide categories? -->
{% if not hideCategories %}
<th class="hidden-xs"><i class="fa fa-bar-chart fa-fw" title="{{ trans('list.category') }}"></i></th>
{% endif %}
<!-- Hide bills? -->
{% if not hideBills %}
<th class="hidden-xs"><i class="fa fa-fw fa-rotate-right" title="{{ trans('list.bill') }}"></i></th>
{% endif %}
</tr>
</thead>
<tbody>
{% for transaction in journals %}
<tr class="drag" data-date="{{ transaction.date.format('Y-m-d') }}" data-id="{{ transaction.journal_id }}">
<td class="hidden-xs">
<div class="select_single" style="display:none;">
<input name="select_all_single[]" class="select_all_single" value="{{ transaction.journal_id }}" type="checkbox"/>
</div>
<div class="btn-group btn-group-xs edit_buttons edit_tr_buttons">{% if sorting %}<a href="#" class="handle btn btn-default btn-xs"><i
class="fa fa-fw fa-arrows-v"></i></a>{% endif %}<a href="{{ route('transactions.edit',transaction.journal_id) }}"
class="btn btn-xs btn-default"><i class="fa fa-fw fa-pencil"></i></a><a
href="{{ route('transactions.delete',transaction.journal_id) }}" class="btn btn-xs btn-danger"><i
class="fa fa-fw fa-trash-o"></i></a></div>
</td>
<td class="hidden-xs">
{{ transaction|typeIconTransaction }}
</td>
<td>
<a href="{{ route('transactions.show',transaction.journal_id) }}">
{% if transaction.transaction_description|length > 0 %}
{{ transaction.transaction_description }} ({{ transaction.description }})
{% else %}
{{ transaction.description }}
{% endif %}
</a>
{{ splitJournalIndicator(transaction.journal_id) }}
{% if transaction.transactionJournal.attachments|length > 0 %}
<i class="fa fa-paperclip"
title="{{ Lang.choice('firefly.nr_of_attachments', journal.attachments|length, {count: journal.attachments|length}) }}"></i>
{% endif %}
</td>
<td style="text-align: right;">
<span style="margin-right:5px;">
{# TODO replace with new format code #}
XX.XX
</span>
</td>
<td class="hidden-sm hidden-xs">
{{ transaction.date.formatLocalized(monthAndDayFormat) }}
</td>
<td class="hidden-xs">
{{ transactionSourceAccount(transaction) }}
</td>
<td class="hidden-xs">
{{ transactionDestinationAccount(transaction) }}
</td>
<!-- Do NOT hide the budget? -->
{% if not hideBudgets %}
<td class="hidden-xs">
{{ transactionBudgets(transaction) }}
</td>
{% endif %}
<!-- Do NOT hide the category? -->
{% if not hideCategories %}
<td class="hidden-xs">
{{ transactionCategories(transaction) }}
</td>
{% endif %}
<!-- Do NOT hide the bill? -->
{% if not hideBills %}
<td class="hidden-xs">
{% if transaction.bill_id %}
<a href="{{ route('bills.show',transaction.bill_id) }}">{{ transaction.bill_name }}</a>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
<div class="row mass_edit_all hidden-xs" style="display: none;">
<div class="col-lg-6 col-md-12 col-sm-12 col-xs-12">
<div class="mass_button_options btn-group btn-group" style="display:none;">
<a href="#" class="btn btn-default mass_edit"><i class="fa fa-fw fa-pencil"></i> <span>{{ 'edit_selected'|_ }}</span></a>
<a href="#" class="btn btn-danger mass_delete"><i class="fa fa-fw fa-trash"></i> <span>{{ 'delete_selected'|_ }}</span></a>
</div>
</div>
<div class="col-lg-6 col-md-12 col-sm-12 col-xs-12 hidden-xs">
<div class="mass_buttons btn-group btn-group pull-right">
<a href="#" class="btn btn-default mass_select"><i class="fa fa-fw fa-check-square-o"></i> {{ 'select_transactions'|_ }}</a>
<a href="#" class="btn btn-default mass_stop_select" style="display:none;"><i class="fa faw-fw fa-square-o"
aria-hidden="true"></i> {{ 'stop_selection'|_ }}</a>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
{{ journals.render|raw }}
</div>
</div>
<script type="text/javascript">
var edit_selected_txt = "{{ 'edit_selected'|_ }}";
var delete_selected_txt = "{{ 'delete_selected'|_ }}";
</script>

View File

@@ -1,78 +0,0 @@
{{ journals.render|raw }}
<table class="table table-hover table-compressed sortable">
<thead>
<tr class="ignore">
<th data-defaultsort="disabled" class="hidden-xs" colspan="2">&nbsp;</th>
<th data-defaultsort="disabled">{{ trans('list.description') }}</th>
<th data-defaultsign="_19">{{ trans('list.amount') }}</th>
<th data-defaultsign="month" class="hidden-sm hidden-xs">{{ trans('list.date') }}</th>
</tr>
</thead>
<tbody>
{% for transaction in transactions %}
<tr>
<td class="hidden-xs">
<div class="btn-group btn-group-xs edit_buttons">
<a href="{{ route('transactions.edit',transaction.journal_id) }}" class="btn btn-xs btn-default"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{{ route('transactions.delete',transaction.journal_id) }}" class="btn btn-xs btn-danger"><i class="fa fa-fw fa-trash-o"></i></a>
</div>
</td>
<td class="hidden-xs">
{{ transaction|typeIconTransaction }}
</td>
<td>
<a href="{{ route('transactions.show',transaction.journal_id) }}">
{% if transaction.transaction_description|length > 0 %}
{{ transaction.transaction_description }} ({{ transaction.description }})
{% else %}
{{ transaction.description }}
{% endif %}
</a>
{{ splitJournalIndicator(transaction.journal_id) }}
{% if transaction.transactionJournal.attachments|length > 0 %}
<i class="fa fa-paperclip"
title="{{ Lang.choice('firefly.nr_of_attachments', journal.attachments|length, {count: journal.attachments|length}) }}"></i>
{% endif %}
</td>
<td data-value="{{ transaction.transaction_amount }}">
{# TODO replace with new format code #}
XX.XX
</td>
<td class="hidden-sm hidden-xs" data-value="{{ transaction.date.format('Y-m-d H:i:s') }}">
{{ transaction.date.formatLocalized(monthAndDayFormat) }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="row mass_edit_all" style="display: none;">
<div class="col-lg-6 col-md-12 col-sm-12 col-xs-12">
<div class="mass_button_options btn-group btn-group" style="display:none;">
<a href="#" class="btn btn-default mass_edit"><i class="fa fa-fw fa-pencil"></i> <span>{{ 'edit_selected'|_ }}</span></a>
<a href="#" class="btn btn-danger mass_delete"><i class="fa fa-fw fa-trash"></i> <span>{{ 'delete_selected'|_ }}</span></a>
</div>
</div>
<div class="col-lg-6 col-md-12 col-sm-12 col-xs-12">
<div class="mass_buttons btn-group btn-group pull-right">
<a href="#" class="btn btn-default mass_select"><i class="fa fa-fw fa-check-square-o"></i> {{ 'select_transactions'|_ }}</a>
<a href="#" class="btn btn-default mass_stop_select" style="display:none;"><i class="fa faw-fw fa-square-o"
aria-hidden="true"></i> {{ 'stop_selection'|_ }}</a>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
{{ journals.render|raw }}
</div>
</div>
<script type="text/javascript">
var edit_selected_txt = "{{ 'edit_selected'|_ }}";
var delete_selected_txt = "{{ 'delete_selected'|_ }}";
</script>

View File

@@ -0,0 +1,72 @@
<table class="table table-hover table-condensed">
<thead>
<tr class="ignore">
<th class="hidden-xs" colspan="2">&nbsp;</th>
<th>{{ trans('list.description') }}</th>
<th>{{ trans('list.amount') }}</th>
<th class="hidden-sm hidden-xs">{{ trans('list.date') }}</th>
<th class="hidden-xs">{{ trans('list.from') }}</th>
<th class="hidden-xs">{{ trans('list.to') }}</th>
<th class="hidden-xs"><i class="fa fa-tasks fa-fw" title="{{ trans('list.budget') }}"></i></th>
<th class="hidden-xs"><i class="fa fa-bar-chart fa-fw" title="{{ trans('list.category') }}"></i></th>
<th class="hidden-xs"><i class="fa fa-fw fa-rotate-right" title="{{ trans('list.bill') }}"></i></th>
</tr>
</thead>
<tbody>
{% for transaction in transactions %}
<tr>
<td class="hidden-xs">
<div class="btn-group btn-group-xs">
<a href="{{ route('transactions.edit',transaction.journal_id) }}" class="btn btn-xs btn-default"><i
class="fa fa-fw fa-pencil"></i></a>
<a href="{{ route('transactions.delete',transaction.journal_id) }}" class="btn btn-xs btn-danger"><i
class="fa fa-fw fa-trash-o"></i></a></div>
</td>
<td class="hidden-xs">
{{ transaction|typeIconTransaction }}
</td>
<td>
<a href="{{ route('transactions.show',transaction.journal_id) }}">
{% if transaction.transaction_description|length > 0 %}
{{ transaction.transaction_description }} ({{ transaction.description }})
{% else %}
{{ transaction.description }}
{% endif %}
</a>
{{ splitJournalIndicator(transaction.journal_id) }}
{% if transaction.transactionJournal.attachments|length > 0 %}
<i class="fa fa-paperclip"
title="{{ Lang.choice('firefly.nr_of_attachments', journal.attachments|length, {count: journal.attachments|length}) }}"></i>
{% endif %}
</td>
<td style="text-align: right;">
<span style="margin-right:5px;">
{{ transactionAmount(transaction) }}
</span>
</td>
<td class="hidden-sm hidden-xs">
{{ transaction.date.formatLocalized(monthAndDayFormat) }}
</td>
<td class="hidden-xs">
{{ transactionSourceAccount(transaction) }}
</td>
<td class="hidden-xs">
{{ transactionDestinationAccount(transaction) }}
</td>
<td class="hidden-xs">
{{ transactionBudgets(transaction) }}
</td>
<td class="hidden-xs">
{{ transactionCategories(transaction) }}
</td>
<td class="hidden-xs">
{% if transaction.bill_id %}
<a href="{{ route('bills.show',transaction.bill_id) }}">{{ transaction.bill_name }}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>