diff --git a/app/Abstracts/Http/Controller.php b/app/Abstracts/Http/Controller.php index f366929d5..d1f7dce54 100644 --- a/app/Abstracts/Http/Controller.php +++ b/app/Abstracts/Http/Controller.php @@ -2,6 +2,7 @@ namespace App\Abstracts\Http; +use App\Abstracts\Http\Response; use App\Traits\Jobs; use App\Traits\Relationships; use Illuminate\Database\Eloquent\Collection; @@ -99,4 +100,25 @@ abstract class Controller extends BaseController return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options); } + + /** + * Generate a response based on request type like HTML, JSON, or anything else. + * + * @param string $view + * @param array $data + * + * @return \Illuminate\Http\Response + */ + public function response($view, $data = []) + { + $class_name = str_replace('Controllers', 'Responses', (new \ReflectionClass($this))->getName()); + + if (class_exists($class_name)) { + $response = new $class_name($view, $data); + } else { + $response = new class($view, $data) extends Response {}; + } + + return $response; + } } diff --git a/app/Abstracts/Http/Response.php b/app/Abstracts/Http/Response.php new file mode 100644 index 000000000..75a3dac50 --- /dev/null +++ b/app/Abstracts/Http/Response.php @@ -0,0 +1,55 @@ +view = $view; + $this->data = $data; + } + + public function toJson() + { + return response()->json([ + 'success' => true, + 'error' => false, + 'data' => Arr::first($this->data), + 'message' => '', + ]); + } + + public function toHtml() + { + return view($this->view, $this->data); + } + + public function toResponse($request) + { + foreach ($this->accepts as $accept) { + $request_method = 'expects' . Str::studly($accept); + $response_method = 'to' . Str::studly($accept); + + if (!method_exists($request, $request_method) || !method_exists($this, $response_method)) { + continue; + } + + if ($request->{$request_method}()) { + return $this->{$response_method}(); + } + } + + return $this->toHtml(); + } +} diff --git a/app/Abstracts/Model.php b/app/Abstracts/Model.php index f2fd309ea..460de969c 100644 --- a/app/Abstracts/Model.php +++ b/app/Abstracts/Model.php @@ -70,9 +70,16 @@ abstract class Model extends Eloquent $request = request(); $search = $request->get('search'); + + $query->usingSearchString($search)->sortable($sort); + + if ($request->expectsJson()) { + return $query->get(); + } + $limit = $request->get('limit', setting('default.list_limit', '25')); - return $query->usingSearchString($search)->sortable($sort)->paginate($limit); + return $query->paginate($limit); } /** diff --git a/app/Console/Stubs/Modules/controller.stub b/app/Console/Stubs/Modules/controller.stub index 4a62c49dd..1dcac0c56 100644 --- a/app/Console/Stubs/Modules/controller.stub +++ b/app/Console/Stubs/Modules/controller.stub @@ -3,7 +3,6 @@ namespace $CLASS_NAMESPACE$; use App\Abstracts\Http\Controller; -use App\Abstracts\Http\FormRequest; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -11,15 +10,17 @@ class $CLASS$ extends Controller { /** * Display a listing of the resource. + * * @return Response */ public function index() { - return view('$ALIAS$::index'); + return $this->response('$ALIAS$::index'); } /** * Show the form for creating a new resource. + * * @return Response */ public function create() @@ -29,6 +30,7 @@ class $CLASS$ extends Controller /** * Store a newly created resource in storage. + * * @param Request $request * @return Response */ @@ -39,6 +41,7 @@ class $CLASS$ extends Controller /** * Show the specified resource. + * * @param int $id * @return Response */ @@ -49,6 +52,7 @@ class $CLASS$ extends Controller /** * Show the form for editing the specified resource. + * * @param int $id * @return Response */ @@ -59,6 +63,7 @@ class $CLASS$ extends Controller /** * Update the specified resource in storage. + * * @param Request $request * @param int $id * @return Response @@ -70,6 +75,7 @@ class $CLASS$ extends Controller /** * Remove the specified resource from storage. + * * @param int $id * @return Response */ diff --git a/app/Http/Controllers/Auth/Permissions.php b/app/Http/Controllers/Auth/Permissions.php index 5fadd7f0a..555435dbb 100644 --- a/app/Http/Controllers/Auth/Permissions.php +++ b/app/Http/Controllers/Auth/Permissions.php @@ -20,7 +20,7 @@ class Permissions extends Controller { $permissions = Permission::collect(); - return view('auth.permissions.index', compact('permissions')); + return $this->response('auth.permissions.index', compact('permissions')); } /** diff --git a/app/Http/Controllers/Auth/Roles.php b/app/Http/Controllers/Auth/Roles.php index 53a74b561..ab4e042f5 100644 --- a/app/Http/Controllers/Auth/Roles.php +++ b/app/Http/Controllers/Auth/Roles.php @@ -21,7 +21,7 @@ class Roles extends Controller { $roles = Role::collect(); - return view('auth.roles.index', compact('roles')); + return $this->response('auth.roles.index', compact('roles')); } /** diff --git a/app/Http/Controllers/Auth/Users.php b/app/Http/Controllers/Auth/Users.php index c43aac6e7..dfff5b28a 100644 --- a/app/Http/Controllers/Auth/Users.php +++ b/app/Http/Controllers/Auth/Users.php @@ -37,7 +37,7 @@ class Users extends Controller { $users = User::with('media', 'roles')->collect(); - return view('auth.users.index', compact('users')); + return $this->response('auth.users.index', compact('users')); } /** diff --git a/app/Http/Controllers/Banking/Accounts.php b/app/Http/Controllers/Banking/Accounts.php index 08e9f89e4..0683c4e59 100644 --- a/app/Http/Controllers/Banking/Accounts.php +++ b/app/Http/Controllers/Banking/Accounts.php @@ -21,7 +21,7 @@ class Accounts extends Controller { $accounts = Account::collect(); - return view('banking.accounts.index', compact('accounts')); + return $this->response('banking.accounts.index', compact('accounts')); } /** diff --git a/app/Http/Controllers/Banking/Reconciliations.php b/app/Http/Controllers/Banking/Reconciliations.php index 81f0f8229..fe040cfdd 100644 --- a/app/Http/Controllers/Banking/Reconciliations.php +++ b/app/Http/Controllers/Banking/Reconciliations.php @@ -26,7 +26,7 @@ class Reconciliations extends Controller $accounts = collect(Account::enabled()->orderBy('name')->pluck('name', 'id')); - return view('banking.reconciliations.index', compact('reconciliations', 'accounts')); + return $this->response('banking.reconciliations.index', compact('reconciliations', 'accounts')); } /** diff --git a/app/Http/Controllers/Banking/Transactions.php b/app/Http/Controllers/Banking/Transactions.php index 7cfeded9c..9ec181b73 100644 --- a/app/Http/Controllers/Banking/Transactions.php +++ b/app/Http/Controllers/Banking/Transactions.php @@ -30,7 +30,7 @@ class Transactions extends Controller $transactions = Transaction::with('account', 'category', 'contact')->collect(['paid_at'=> 'desc']); - return view('banking.transactions.index', compact('transactions', 'accounts', 'types', 'categories')); + return $this->response('banking.transactions.index', compact('transactions', 'accounts', 'types', 'categories')); } /** diff --git a/app/Http/Controllers/Banking/Transfers.php b/app/Http/Controllers/Banking/Transfers.php index 64e7b7a71..b9febd0fd 100644 --- a/app/Http/Controllers/Banking/Transfers.php +++ b/app/Http/Controllers/Banking/Transfers.php @@ -52,10 +52,10 @@ class Transfers extends Controller ]; } - $special_key = array( + $special_key = [ 'expense_transaction.name' => 'from_account', 'income_transaction.name' => 'to_account', - ); + ]; $request = request(); @@ -77,12 +77,12 @@ class Transfers extends Controller array_multisort($sort_order, $sort_type, $data); } - $transfers = $this->paginate($data); + $transfers = $request->expectsJson() ? $data : $this->paginate($data); $accounts = collect(Account::enabled()->orderBy('name')->pluck('name', 'id')) ->prepend(trans('general.all_type', ['type' => trans_choice('general.accounts', 2)]), ''); - return view('banking.transfers.index', compact('transfers', 'accounts')); + return $this->response('banking.transfers.index', compact('transfers', 'accounts')); } /** diff --git a/app/Http/Controllers/Common/Companies.php b/app/Http/Controllers/Common/Companies.php index 2cd575a18..3876b7574 100644 --- a/app/Http/Controllers/Common/Companies.php +++ b/app/Http/Controllers/Common/Companies.php @@ -26,7 +26,7 @@ class Companies extends Controller { $companies = Company::collect(); - return view('common.companies.index', compact('companies')); + return $this->response('common.companies.index', compact('companies')); } /** diff --git a/app/Http/Controllers/Common/Dashboards.php b/app/Http/Controllers/Common/Dashboards.php index 53afd6784..99a77c24a 100644 --- a/app/Http/Controllers/Common/Dashboards.php +++ b/app/Http/Controllers/Common/Dashboards.php @@ -39,7 +39,7 @@ class Dashboards extends Controller { $dashboards = user()->dashboards()->collect(); - return view('common.dashboards.index', compact('dashboards')); + return $this->response('common.dashboards.index', compact('dashboards')); } /** diff --git a/app/Http/Controllers/Common/Items.php b/app/Http/Controllers/Common/Items.php index 58214e3ea..180a95499 100644 --- a/app/Http/Controllers/Common/Items.php +++ b/app/Http/Controllers/Common/Items.php @@ -30,7 +30,7 @@ class Items extends Controller { $items = Item::with('category', 'media')->collect(); - return view('common.items.index', compact('items')); + return $this->response('common.items.index', compact('items')); } /** diff --git a/app/Http/Controllers/Common/Reports.php b/app/Http/Controllers/Common/Reports.php index 93a5fcbf5..d846e96a8 100644 --- a/app/Http/Controllers/Common/Reports.php +++ b/app/Http/Controllers/Common/Reports.php @@ -45,7 +45,7 @@ class Reports extends Controller $categories[$class->getCategory()][] = $report; } - return view('common.reports.index', compact('categories', 'totals', 'icons')); + return $this->response('common.reports.index', compact('categories', 'totals', 'icons')); } /** diff --git a/app/Http/Controllers/Modules/Home.php b/app/Http/Controllers/Modules/Home.php index 4465cf47f..358f0c4ca 100644 --- a/app/Http/Controllers/Modules/Home.php +++ b/app/Http/Controllers/Modules/Home.php @@ -29,6 +29,6 @@ class Home extends Controller $free = $this->getFreeModules($data); $installed = Module::all()->pluck('enabled', 'alias')->toArray(); - return view('modules.home.index', compact('pre_sale', 'paid', 'new', 'free', 'installed')); + return $this->response('modules.home.index', compact('pre_sale', 'paid', 'new', 'free', 'installed')); } } diff --git a/app/Http/Controllers/Modules/My.php b/app/Http/Controllers/Modules/My.php index cf043fb6b..ded71f548 100644 --- a/app/Http/Controllers/Modules/My.php +++ b/app/Http/Controllers/Modules/My.php @@ -21,6 +21,6 @@ class My extends Controller $modules = $this->getInstalledModules(); $installed = Module::where('company_id', '=', session('company_id'))->pluck('enabled', 'alias')->toArray(); - return view('modules.my.index', compact('purchased', 'modules', 'installed')); + return $this->response('modules.my.index', compact('purchased', 'modules', 'installed')); } } diff --git a/app/Http/Controllers/Portal/Invoices.php b/app/Http/Controllers/Portal/Invoices.php index dc10e2a0f..e25e8c862 100644 --- a/app/Http/Controllers/Portal/Invoices.php +++ b/app/Http/Controllers/Portal/Invoices.php @@ -32,7 +32,7 @@ class Invoices extends Controller $statuses = $this->getInvoiceStatuses(); - return view('portal.invoices.index', compact('invoices', 'categories', 'statuses')); + return $this->response('portal.invoices.index', compact('invoices', 'categories', 'statuses')); } /** diff --git a/app/Http/Controllers/Portal/Payments.php b/app/Http/Controllers/Portal/Payments.php index 5357a2e74..82eefc662 100644 --- a/app/Http/Controllers/Portal/Payments.php +++ b/app/Http/Controllers/Portal/Payments.php @@ -20,7 +20,7 @@ class Payments extends Controller $payment_methods = Modules::getPaymentMethods('all'); - return view('portal.payments.index', compact('payments', 'payment_methods')); + return $this->response('portal.payments.index', compact('payments', 'payment_methods')); } /** diff --git a/app/Http/Controllers/Purchases/Bills.php b/app/Http/Controllers/Purchases/Bills.php index 0f2f8120b..a26f33f28 100644 --- a/app/Http/Controllers/Purchases/Bills.php +++ b/app/Http/Controllers/Purchases/Bills.php @@ -45,7 +45,7 @@ class Bills extends Controller $statuses = $this->getBillStatuses(); - return view('purchases.bills.index', compact('bills', 'vendors', 'categories', 'statuses')); + return $this->response('purchases.bills.index', compact('bills', 'vendors', 'categories', 'statuses')); } /** diff --git a/app/Http/Controllers/Purchases/Payments.php b/app/Http/Controllers/Purchases/Payments.php index e49d77f85..21b4cea43 100644 --- a/app/Http/Controllers/Purchases/Payments.php +++ b/app/Http/Controllers/Purchases/Payments.php @@ -38,7 +38,7 @@ class Payments extends Controller $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); - return view('purchases.payments.index', compact('payments', 'vendors', 'categories', 'accounts')); + return $this->response('purchases.payments.index', compact('payments', 'vendors', 'categories', 'accounts')); } /** diff --git a/app/Http/Controllers/Purchases/Vendors.php b/app/Http/Controllers/Purchases/Vendors.php index 39aaf9df4..766c315ce 100644 --- a/app/Http/Controllers/Purchases/Vendors.php +++ b/app/Http/Controllers/Purchases/Vendors.php @@ -30,7 +30,7 @@ class Vendors extends Controller { $vendors = Contact::with('bills.transactions')->vendor()->collect(); - return view('purchases.vendors.index', compact('vendors')); + return $this->response('purchases.vendors.index', compact('vendors')); } /** diff --git a/app/Http/Controllers/Sales/Customers.php b/app/Http/Controllers/Sales/Customers.php index af77ce983..179ac68e1 100644 --- a/app/Http/Controllers/Sales/Customers.php +++ b/app/Http/Controllers/Sales/Customers.php @@ -28,7 +28,7 @@ class Customers extends Controller { $customers = Contact::with('invoices.transactions')->customer()->collect(); - return view('sales.customers.index', compact('customers')); + return $this->response('sales.customers.index', compact('customers')); } /** diff --git a/app/Http/Controllers/Sales/Invoices.php b/app/Http/Controllers/Sales/Invoices.php index 059f3e16e..d15ff5847 100644 --- a/app/Http/Controllers/Sales/Invoices.php +++ b/app/Http/Controllers/Sales/Invoices.php @@ -46,7 +46,7 @@ class Invoices extends Controller $statuses = $this->getInvoiceStatuses(); - return view('sales.invoices.index', compact('invoices', 'customers', 'categories', 'statuses')); + return $this->response('sales.invoices.index', compact('invoices', 'customers', 'categories', 'statuses')); } /** diff --git a/app/Http/Controllers/Sales/Revenues.php b/app/Http/Controllers/Sales/Revenues.php index 14212e8f2..ead04da46 100644 --- a/app/Http/Controllers/Sales/Revenues.php +++ b/app/Http/Controllers/Sales/Revenues.php @@ -38,7 +38,7 @@ class Revenues extends Controller $accounts = Account::enabled()->orderBy('name')->pluck('name', 'id'); - return view('sales.revenues.index', compact('revenues', 'customers', 'categories', 'accounts')); + return $this->response('sales.revenues.index', compact('revenues', 'customers', 'categories', 'accounts')); } /** diff --git a/app/Http/Controllers/Settings/Categories.php b/app/Http/Controllers/Settings/Categories.php index 9a37b0298..b37a1132c 100644 --- a/app/Http/Controllers/Settings/Categories.php +++ b/app/Http/Controllers/Settings/Categories.php @@ -30,7 +30,7 @@ class Categories extends Controller 'other' => trans_choice('general.others', 1), ]); - return view('settings.categories.index', compact('categories', 'types', 'transfer_id')); + return $this->response('settings.categories.index', compact('categories', 'types', 'transfer_id')); } /** diff --git a/app/Http/Controllers/Settings/Currencies.php b/app/Http/Controllers/Settings/Currencies.php index 080d11e3f..de310271e 100644 --- a/app/Http/Controllers/Settings/Currencies.php +++ b/app/Http/Controllers/Settings/Currencies.php @@ -21,7 +21,7 @@ class Currencies extends Controller { $currencies = Currency::collect(); - return view('settings.currencies.index', compact('currencies')); + return $this->response('settings.currencies.index', compact('currencies')); } /** diff --git a/app/Http/Controllers/Settings/Settings.php b/app/Http/Controllers/Settings/Settings.php index 75b4e6c5e..90364505e 100644 --- a/app/Http/Controllers/Settings/Settings.php +++ b/app/Http/Controllers/Settings/Settings.php @@ -63,7 +63,7 @@ class Settings extends Controller $settings[$alias] = $setting; } - return view('settings.settings.index', ['modules' => $settings]); + return $this->response('settings.settings.index', ['modules' => $settings]); } /** diff --git a/app/Http/Controllers/Settings/Taxes.php b/app/Http/Controllers/Settings/Taxes.php index d7b75c974..500e32587 100644 --- a/app/Http/Controllers/Settings/Taxes.php +++ b/app/Http/Controllers/Settings/Taxes.php @@ -29,7 +29,7 @@ class Taxes extends Controller 'compound' => trans('taxes.compound'), ]; - return view('settings.taxes.index', compact('taxes', 'types')); + return $this->response('settings.taxes.index', compact('taxes', 'types')); } /** diff --git a/app/Http/Responses/Common/Items.php b/app/Http/Responses/Common/Items.php new file mode 100644 index 000000000..6437e644b --- /dev/null +++ b/app/Http/Responses/Common/Items.php @@ -0,0 +1,10 @@ +get('search'); + + $query = user()->companies()->usingSearchString($search)->sortable($sort); + + if ($request->expectsJson()) { + return $query->get(); + } + $limit = $request->get('limit', setting('default.list_limit', '25')); - return user()->companies()->usingSearchString($search)->sortable($sort)->paginate($limit); + return $query->paginate($limit); } /**