mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Working on search
This commit is contained in:
parent
c6c837f4df
commit
aa8151edaf
@ -1,7 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use ninja\repositories\AccountRepository;
|
||||||
|
|
||||||
class AccountController extends \BaseController {
|
class AccountController extends \BaseController {
|
||||||
|
|
||||||
|
protected $accountRepo;
|
||||||
|
|
||||||
|
public function __construct(AccountRepository $accountRepo)
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->accountRepo = $accountRepo;
|
||||||
|
}
|
||||||
|
|
||||||
public function getStarted()
|
public function getStarted()
|
||||||
{
|
{
|
||||||
if (Auth::check())
|
if (Auth::check())
|
||||||
@ -45,6 +56,13 @@ class AccountController extends \BaseController {
|
|||||||
return Redirect::to('invoices/create');
|
return Redirect::to('invoices/create');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSearchData()
|
||||||
|
{
|
||||||
|
$data = $this->accountRepo->getSearchData();
|
||||||
|
|
||||||
|
return Response::json($data);
|
||||||
|
}
|
||||||
|
|
||||||
public function showSection($section = ACCOUNT_DETAILS)
|
public function showSection($section = ACCOUNT_DETAILS)
|
||||||
{
|
{
|
||||||
if ($section == ACCOUNT_DETAILS)
|
if ($section == ACCOUNT_DETAILS)
|
||||||
|
@ -25,12 +25,12 @@ class InvoiceEventHandler
|
|||||||
|
|
||||||
public function onViewed($invoice)
|
public function onViewed($invoice)
|
||||||
{
|
{
|
||||||
|
$this->sendNotifications($invoice, 'viewed');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onPaid($invoice)
|
public function onPaid($invoice)
|
||||||
{
|
{
|
||||||
|
$this->sendNotifications($invoice, 'paid');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function sendNotifications($invoice, $type)
|
private function sendNotifications($invoice, $type)
|
||||||
|
43
app/ninja/repositories/AccountRepository.php
Normal file
43
app/ninja/repositories/AccountRepository.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php namespace ninja\repositories;
|
||||||
|
|
||||||
|
use Client;
|
||||||
|
use Contact;
|
||||||
|
|
||||||
|
class AccountRepository
|
||||||
|
{
|
||||||
|
public function getSearchData()
|
||||||
|
{
|
||||||
|
$clients = \DB::table('clients')
|
||||||
|
->where('clients.deleted_at', '=', null)
|
||||||
|
->select(\DB::raw("'Clients' as type, clients.public_id, clients.name"));
|
||||||
|
|
||||||
|
$contacts = \DB::table('clients')
|
||||||
|
->join('contacts', 'contacts.client_id', '=', 'clients.id')
|
||||||
|
->where('clients.deleted_at', '=', null)
|
||||||
|
->select(\DB::raw("'Contacts' as type, clients.public_id, CONCAT(contacts.first_name, ' ', contacts.last_name) as name"));
|
||||||
|
|
||||||
|
$invoices = \DB::table('clients')
|
||||||
|
->join('invoices', 'invoices.client_id', '=', 'clients.id')
|
||||||
|
->where('clients.deleted_at', '=', null)
|
||||||
|
->where('invoices.deleted_at', '=', null)
|
||||||
|
->select(\DB::raw("'Invoices' as type, invoices.public_id, CONCAT(invoices.invoice_number, ': ', clients.name) as name"));
|
||||||
|
|
||||||
|
|
||||||
|
$data = [];
|
||||||
|
|
||||||
|
foreach ($clients->union($contacts)->union($invoices)->get() as $row)
|
||||||
|
{
|
||||||
|
if (!isset($data[$row->type]))
|
||||||
|
{
|
||||||
|
$data[$row->type] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$data[$row->type][] = [
|
||||||
|
'value' => $row->name,
|
||||||
|
'public_id' => $row->public_id
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
@ -58,7 +58,8 @@ Route::filter('auth', function()
|
|||||||
Route::group(array('before' => 'auth'), function()
|
Route::group(array('before' => 'auth'), function()
|
||||||
{
|
{
|
||||||
Route::get('home', function() { return View::make('header'); });
|
Route::get('home', function() { return View::make('header'); });
|
||||||
Route::get('account/{section?}', 'AccountController@showSection');
|
Route::get('account/getSearchData', array('as' => 'getSearchData', 'uses' => 'AccountController@getSearchData'));
|
||||||
|
Route::get('account/{section?}', 'AccountController@showSection');
|
||||||
Route::post('account/{section?}', 'AccountController@doSection');
|
Route::post('account/{section?}', 'AccountController@doSection');
|
||||||
Route::post('user/setTheme', 'UserController@setTheme');
|
Route::post('user/setTheme', 'UserController@setTheme');
|
||||||
|
|
||||||
|
@ -28,6 +28,10 @@
|
|||||||
|
|
||||||
<script src="{{ asset('js/bootstrap-datepicker.js') }}" type="text/javascript"></script>
|
<script src="{{ asset('js/bootstrap-datepicker.js') }}" type="text/javascript"></script>
|
||||||
<link rel="stylesheet" type="text/css" href="{{ asset('css/datepicker.css') }}"/>
|
<link rel="stylesheet" type="text/css" href="{{ asset('css/datepicker.css') }}"/>
|
||||||
|
|
||||||
|
<script src="{{ asset('js/typeahead.js') }}" type="text/javascript"></script>
|
||||||
|
<script src="{{ asset('js/hogan-2.0.0.js') }}" type="text/javascript"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ asset('css/typeahead.js-bootstrap.css') }}"/>
|
||||||
|
|
||||||
<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
|
<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
|
||||||
|
|
||||||
@ -485,7 +489,30 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$(function() {
|
$(function()
|
||||||
|
{
|
||||||
|
$('#search').focus(function(){
|
||||||
|
if (!window.hasOwnProperty('searchData')) {
|
||||||
|
$.get('{{ URL::route('getSearchData') }}', function(data) {
|
||||||
|
window.searchData = true;
|
||||||
|
var datasets = [];
|
||||||
|
for (var type in data)
|
||||||
|
{
|
||||||
|
if (!data.hasOwnProperty(type)) continue;
|
||||||
|
datasets.push({
|
||||||
|
name: type,
|
||||||
|
header: ' <b>' + type + '</b>',
|
||||||
|
local: data[type]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$('#search').typeahead(datasets).on('typeahead:selected', function(element, datum, name) {
|
||||||
|
var type = name == 'Contacts' ? 'clients' : name.toLowerCase();
|
||||||
|
window.location = '{{ URL::to('/') }}' + '/' + type + '/' + datum.public_id;
|
||||||
|
}).focus().typeahead('setQuery', $('#search').val());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
if (isStorageSupported()) {
|
if (isStorageSupported()) {
|
||||||
@if (Auth::check() && !Auth::user()->registered)
|
@if (Auth::check() && !Auth::user()->registered)
|
||||||
|
@ -641,7 +641,6 @@ function wordWrapText(value, width)
|
|||||||
return lines.slice(0, 6).join("\n");
|
return lines.slice(0, 6).join("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var CONSTS = {};
|
var CONSTS = {};
|
||||||
CONSTS.INVOICE_STATUS_DRAFT = 1;
|
CONSTS.INVOICE_STATUS_DRAFT = 1;
|
||||||
CONSTS.INVOICE_STATUS_SENT = 2;
|
CONSTS.INVOICE_STATUS_SENT = 2;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user