Merge pull request #1035 from denisdulici/master

Fixed error pages
This commit is contained in:
Denis Duliçi 2019-12-26 10:54:37 +03:00 committed by GitHub
commit 6f3b774a9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 509 additions and 491 deletions

View File

@ -2,7 +2,6 @@
namespace App\Http\ViewComposers; namespace App\Http\ViewComposers;
use Auth;
use App\Utilities\Updater; use App\Utilities\Updater;
use Illuminate\View\View; use Illuminate\View\View;
use App\Traits\Modules as RemoteModules; use App\Traits\Modules as RemoteModules;
@ -21,42 +20,43 @@ class Header
{ {
$user = user(); $user = user();
$bills = []; $invoices = $bills = [];
$invoices = []; $updates = $notifications = 0;
$notifications = 0;
$company = null; $company = null;
// Get customer company if (!empty($user)) {
if ($user->can('read-client-portal')) { // Get customer company
$company = (object) [ if ($user->can('read-client-portal')) {
'company_name' => setting('company.name'), $company = (object) [
'company_email' => setting('company.email'), 'company_name' => setting('company.name'),
'company_address' => setting('company.address'), 'company_email' => setting('company.email'),
'company_logo' => setting('company.logo'), 'company_address' => setting('company.address'),
]; 'company_logo' => setting('company.logo'),
} ];
$undereads = $user->unreadNotifications;
foreach ($undereads as $underead) {
$data = $underead->getAttribute('data');
switch ($underead->getAttribute('type')) {
case 'App\Notifications\Expense\Bill':
$bills[$data['bill_id']] = $data['amount'];
$notifications++;
break;
case 'App\Notifications\Income\Invoice':
$invoices[$data['invoice_id']] = $data['amount'];
$notifications++;
break;
} }
$undereads = $user->unreadNotifications;
foreach ($undereads as $underead) {
$data = $underead->getAttribute('data');
switch ($underead->getAttribute('type')) {
case 'App\Notifications\Expense\Bill':
$bills[$data['bill_id']] = $data['amount'];
$notifications++;
break;
case 'App\Notifications\Income\Invoice':
$invoices[$data['invoice_id']] = $data['amount'];
$notifications++;
break;
}
}
$updates = count(Updater::all());
$this->loadSuggestions();
} }
$updates = count(Updater::all());
$this->loadSuggestions();
$view->with([ $view->with([
'user' => $user, 'user' => $user,
'notifications' => $notifications, 'notifications' => $notifications,

View File

@ -19,7 +19,7 @@ class Notifications
public function compose(View $view) public function compose(View $view)
{ {
// No need to add suggestions in console // No need to add suggestions in console
if (app()->runningInConsole() || !env('APP_INSTALLED')) { if (app()->runningInConsole() || !env('APP_INSTALLED') || !user()) {
return; return;
} }

View File

@ -26,26 +26,28 @@ class Suggestions
$modules = false; $modules = false;
$path = Route::current()->uri(); if (user()) {
$path = Route::current()->uri();
if ($path) { if ($path) {
$suggestions = $this->getSuggestions($path); $suggestions = $this->getSuggestions($path);
if ($suggestions) {
$suggestion_modules = $suggestions->modules;
foreach ($suggestion_modules as $key => $module) {
$installed = Module::where('company_id', session('company_id'))->where('alias', $module->alias)->first();
if ($suggestions) { if ($installed) {
$suggestion_modules = $suggestions->modules; unset($suggestion_modules[$key]);
}
foreach ($suggestion_modules as $key => $module) {
$installed = Module::where('company_id', '=', session('company_id'))->where('alias', '=', $module->alias)->first();
if ($installed) {
unset($suggestion_modules[$key]);
} }
}
if ($suggestion_modules) { if ($suggestion_modules) {
shuffle($suggestion_modules); shuffle($suggestion_modules);
$modules[] = $suggestion_modules[0]; $modules[] = $suggestion_modules[0];
}
} }
} }
} }

View File

@ -2,23 +2,22 @@
return [ return [
'forbidden_access' => 'Forbidden Access', 'title' => [
'error_page' => 'Error Page', '403' => 'Oops! Forbidden Access',
'page_not_found' => 'Page Not Found', '404' => 'Oops! Page not found',
'500' => 'Oops! Something went wrong',
'body' => [
'forbidden_access' => 'Oops! Forbidden Access.',
'error_page' => 'Oops! Something went wrong.',
'page_not_found' => 'Oops! Page not found.',
], ],
'messages' => [ 'header' => [
'forbidden_access' => 'You can not access this page. '403' => '403 Forbidden',
Meanwhile, you may <a href=":link">return to dashboard</a>.', '404' => '404 Not Found',
'error_page' => 'We will work on fixing that right away. '500' => '500 Internal Server Error',
Meanwhile, you may <a href=":link">return to dashboard</a>.', ],
'page_not_found' => 'We could not find the page you were looking for.
Meanwhile, you may <a href=":link">return to dashboard</a>.', 'message' => [
'403' => 'You can not access this page.',
'404' => 'We could not find the page you were looking for.',
'500' => 'We will work on fixing that right away.',
], ],
]; ];

View File

@ -1,16 +1,16 @@
@extends('layouts.admin') @extends('layouts.error')
@section('title', trans('errors.forbidden_access')) @section('title', trans('errors.title.403'))
@section('content') @section('content')
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h2 class="mb-0 text-warning">403 Forbidden</h2> <h2 class="mb-0 text-danger"><i class="fa fa-exclamation-triangle text-danger"></i>&nbsp;&nbsp;{{ trans('errors.header.403') }}</h2>
</div> </div>
<div class="card-body"> <div class="card-body">
<h3><i class="fa fa-exclamation-triangle text-danger"></i> {{ trans('errors.body.forbidden_access') }}</h3> <p>{{ trans('errors.message.403') }}</p>
<p>{!! trans('errors.messages.forbidden_access', ['link' => url('/') ]) !!}</p> <a href="{{ url('/') }}" class="btn btn-success header-button-top"><span class="fa fa-tachometer-alt"></span> &nbsp;{{ trans('general.go_to', ['name' => trans('general.dashboard')]) }}</a>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -1,16 +1,16 @@
@extends('layouts.admin') @extends('layouts.error')
@section('title', trans('errors.page_not_found')) @section('title', trans('errors.title.404'))
@section('content') @section('content')
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h2 class="mb-0 text-yellow">404 Not Found</h2> <h2 class="mb-0 text-warning"><i class="fa fa-exclamation-triangle text-warning"></i>&nbsp;&nbsp;{{ trans('errors.header.404') }}</h2>
</div> </div>
<div class="card-body"> <div class="card-body">
<h3><i class="fa fa-exclamation-triangle text-yellow"></i> {{ trans('errors.body.page_not_found') }}</h3> <p>{{ trans('errors.message.404') }}</p>
<p>{!! trans('errors.messages.page_not_found', ['link' => url('/')]) !!}</p> <a href="{{ url('/') }}" class="btn btn-success header-button-top"><span class="fa fa-tachometer-alt"></span> &nbsp;{{ trans('general.go_to', ['name' => trans('general.dashboard')]) }}</a>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -1,16 +1,17 @@
@extends('layouts.admin') @extends('layouts.error')
@section('title', trans('errors.error_page')) @section('title', trans('errors.title.500'))
@section('content') @section('content')
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h2 class="mb-0 text-danger">500 Internal Server Error</h2> <h2 class="mb-0 text-danger"><i class="fa fa-exclamation-triangle text-danger"></i>&nbsp;&nbsp;{{ trans('errors.header.500') }}</h2>
</div> </div>
<div class="card-body"> <div class="card-body">
<h3><i class="fa fa-exclamation-triangle text-danger"></i> {{ trans('errors.body.error_page') }}</h3> <p>{{ trans('errors.message.500') }}</p>
<p>{!! trans('errors.messages.error_page', ['link' => url('/') ]) !!}</p> <a href="{{ url('/') }}" class="btn btn-success header-button-top"><span class="fa fa-tachometer-alt"></span> &nbsp;{{ trans('general.go_to', ['name' => trans('general.dashboard')]) }}</a>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -3,35 +3,33 @@
@include('partials.admin.head') @include('partials.admin.head')
<body class="g-sidenav-show g-sidenav-pinned"> <body class="g-sidenav-show g-sidenav-pinned">
@stack('body_start') @stack('body_start')
@include('partials.admin.menu') @include('partials.admin.menu')
<div class="main-content" id="panel"> <div class="main-content" id="panel">
@include('partials.admin.navbar') @include('partials.admin.navbar')
<div id="main-body"> <div id="main-body">
@include('partials.admin.header') @include('partials.admin.header')
<div class="container-fluid content-layout mt--6"> <div class="container-fluid content-layout mt--6">
@include('partials.admin.content') @include('partials.admin.content')
@include('partials.admin.footer') @include('partials.admin.footer')
</div>
</div> </div>
</div> </div>
</div>
@stack('body_end') @stack('body_end')
@include('partials.admin.scripts') @include('partials.admin.scripts')
</body> </body>
</html> </html>

View File

@ -3,69 +3,67 @@
@include('partials.auth.head') @include('partials.auth.head')
<body class="login-page"> <body class="login-page">
@stack('body_start') @stack('body_start')
<div class="main-content"> <div class="main-content">
<div class="header py-5"> <div class="header py-5">
<div class="container"> <div class="container">
<div class="header-body text-center mb-5"> <div class="header-body text-center mb-5">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-xl-5 col-lg-6 col-md-8"> <div class="col-xl-5 col-lg-6 col-md-8">
<img class="pb-5" src="{{ asset('public/img/akaunting-logo-white.png') }}" width="22%" alt="Akaunting"/> <img class="pb-5" src="{{ asset('public/img/akaunting-logo-white.png') }}" width="22%" alt="Akaunting"/>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@stack('login_box_start') @stack('login_box_start')
<div class="container mt--7 pb-5"> <div class="container mt--7 pb-5">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-lg-5 col-md-7"> <div class="col-lg-5 col-md-7">
<div class="card mb-0 login-card-bg"> <div class="card mb-0 login-card-bg">
<div class="card-body px-lg-5 py-lg-5"> <div class="card-body px-lg-5 py-lg-5">
<div class="text-center text-white mb-4"> <div class="text-center text-white mb-4">
<small>@yield('message')</small> <small>@yield('message')</small>
</div> </div>
<div id="app"> <div id="app">
@stack('login_content_start') @stack('login_content_start')
@yield('content') @yield('content')
@stack('login_content_end') @stack('login_content_end')
<notifications></notifications> <notifications></notifications>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@stack('login_box_end') </div>
@stack('login_box_end')
@yield('forgotten-password') @yield('forgotten-password')
<footer> <footer>
<div class="container"> <div class="container">
<div class="row align-items-center justify-content-xl-between"> <div class="row align-items-center justify-content-xl-between">
<div class="col-xl-12"> <div class="col-xl-12">
<div class="copyright text-center text-lg-center text-white"> <div class="copyright text-center text-lg-center text-white">
<small> <small>
<a>{{ trans('footer.powered') }}:</a> <a class="text-success" href="{{ trans('footer.link') }}" target="_blank">{{ trans('footer.software') }}</a> <a>{{ trans('footer.powered') }}:</a> <a class="text-success" href="{{ trans('footer.link') }}" target="_blank">{{ trans('footer.software') }}</a>
</small> </small>
</div>
</div> </div>
</div> </div>
</div> </div>
</footer> </div>
</footer>
</div> </div>
@stack('body_end') @stack('body_end')
@include('partials.auth.scripts') @include('partials.auth.scripts')
</body> </body>
</html> </html>

View File

@ -0,0 +1,31 @@
<html lang="{{ app()->getLocale() }}">
@include('partials.admin.head')
<body class="g-sidenav-show g-sidenav-pinned">
@stack('body_start')
<div class="main-content" id="panel">
<div id="main-body">
@include('partials.admin.header')
<div class="container-fluid content-layout mt--6">
@include('partials.admin.content')
@include('partials.admin.footer')
</div>
</div>
</div>
@stack('body_end')
@include('partials.admin.scripts')
</body>
</html>

View File

@ -3,35 +3,33 @@
@include('partials.modules.head') @include('partials.modules.head')
<body class="g-sidenav-show g-sidenav-pinned"> <body class="g-sidenav-show g-sidenav-pinned">
@stack('body_start') @stack('body_start')
@include('partials.admin.menu') @include('partials.admin.menu')
<div class="main-content" id="panel"> <div class="main-content" id="panel">
@include('partials.admin.navbar') @include('partials.admin.navbar')
<div id="main-body"> <div id="main-body">
@include('partials.admin.header') @include('partials.admin.header')
<div class="container-fluid content-layout mt--6"> <div class="container-fluid content-layout mt--6">
@include('partials.admin.content') @include('partials.admin.content')
@include('partials.admin.footer') @include('partials.admin.footer')
</div>
</div> </div>
</div> </div>
</div>
@stack('body_end') @stack('body_end')
@include('partials.admin.scripts') @include('partials.admin.scripts')
</body> </body>
</html> </html>

View File

@ -3,35 +3,33 @@
@include('partials.portal.head') @include('partials.portal.head')
<body class="g-sidenav-show g-sidenav-pinned"> <body class="g-sidenav-show g-sidenav-pinned">
@stack('body_start') @stack('body_start')
@include('partials.portal.menu') @include('partials.portal.menu')
<div class="main-content" id="panel"> <div class="main-content" id="panel">
@include('partials.portal.navbar') @include('partials.portal.navbar')
<div id="main-body"> <div id="main-body">
@include('partials.portal.header') @include('partials.portal.header')
<div class="container-fluid content-layout mt--6"> <div class="container-fluid content-layout mt--6">
@include('partials.portal.content') @include('partials.portal.content')
@include('partials.portal.footer') @include('partials.portal.footer')
</div>
</div> </div>
</div> </div>
</div>
@stack('body_end') @stack('body_end')
@include('partials.portal.scripts') @include('partials.portal.scripts')
</body> </body>
</html> </html>

View File

@ -9,13 +9,11 @@
</style> </style>
<body onload="window.print();"> <body onload="window.print();">
@stack('body_start') @stack('body_start')
@yield('content') @yield('content')
@stack('body_end') @stack('body_end')
</body> </body>
</html> </html>

View File

@ -2,19 +2,17 @@
@include('partials.signed.head') @include('partials.signed.head')
<body> <body>
@stack('body_start') @stack('body_start')
<div class="container-fluid content-layout mt-4"> <div class="container-fluid content-layout mt-4">
@include('partials.signed.content') @include('partials.signed.content')
@include('partials.signed.footer') @include('partials.signed.footer')
</div> </div>
@stack('body_end') @stack('body_end')
</body> </body>
</html> </html>

View File

@ -4,21 +4,18 @@
<body class="wizard-page"> <body class="wizard-page">
<div class="container mt--5"> <div class="container mt--5">
@stack('body_start') @stack('body_start')
<div id="app"> <div id="app">
@include('partials.wizard.content') @include('partials.wizard.content')
</div> </div>
@stack('body_end') @stack('body_end')
</div> </div>
@include('partials.wizard.scripts') @include('partials.wizard.scripts')
</body> </body>
</html> </html>

View File

@ -1,31 +1,31 @@
@stack('header_start') @stack('header_start')
<div id="header" class="header pb-6"> <div id="header" class="header pb-6">
<div class="container-fluid content-layout"> <div class="container-fluid content-layout">
<div class="header-body"> <div class="header-body">
<div class="row py-4 align-items-center"> <div class="row py-4 align-items-center">
<div class="col-sm-4 col-md-5 align-items-center"> <div class="col-sm-4 col-md-5 align-items-center">
<h2 class="d-inline-flex mb-0 long-texts">@yield('title')</h2> <h2 class="d-inline-flex mb-0 long-texts">@yield('title')</h2>
@yield('dashboard_action') @yield('dashboard_action')
</div> </div>
<div class="col-sm-8 col-md-7"> <div class="col-sm-8 col-md-7">
<div class="text-right"> <div class="text-right">
@yield('new_button') @yield('new_button')
@permission('read-modules-home') @permission('read-modules-home')
@if (!empty($suggestion_modules)) @if (!empty($suggestion_modules))
@foreach($suggestion_modules as $s_module) @foreach($suggestion_modules as $s_module)
<span> <span>
<a href="{{ url($s_module->action_url) . '?' . http_build_query((array) $s_module->action_parameters) }}" class="btn btn-white btn-sm header-button-bottom" target="{{ $s_module->action_target }}"><span class="fa fa-rocket"></span> &nbsp;{{ $s_module->name }}</a> <a href="{{ url($s_module->action_url) . '?' . http_build_query((array) $s_module->action_parameters) }}" class="btn btn-white btn-sm header-button-bottom" target="{{ $s_module->action_target }}"><span class="fa fa-rocket"></span> &nbsp;{{ $s_module->name }}</a>
</span> </span>
@endforeach @endforeach
@endif @endif
@endpermission @endpermission
@stack('header_button') @stack('header_button')
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@stack('header_end') @stack('header_end')

View File

@ -1,46 +1,46 @@
@stack('menu_start') @stack('menu_start')
<nav class="sidenav navbar navbar-vertical fixed-left navbar-expand-xs navbar-light bg-default" id="sidenav-main"> <nav class="sidenav navbar navbar-vertical fixed-left navbar-expand-xs navbar-light bg-default" id="sidenav-main">
<div class="scrollbar-inner"> <div class="scrollbar-inner">
<div class="sidenav-header d-flex align-items-center ml-4"> <div class="sidenav-header d-flex align-items-center ml-4">
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="avatar avatar-xs background-unset"> <span class="avatar avatar-xs background-unset">
<img class="border-radius-0 border-0 mr-3" alt="Image placeholder" src="{{ setting('company.logo') ? Storage::url(setting('company.logo')) : asset('public/img/akaunting-logo-white.png') }}"> <img class="border-radius-0 border-0 mr-3" alt="Image placeholder" src="{{ setting('company.logo') ? Storage::url(setting('company.logo')) : asset('public/img/akaunting-logo-white.png') }}">
</span> </span>
<span class="nav-link-text long-texts pl-2 mwpx-100">{{ Str::limit(setting('company.name'), 22) }}</span> <span class="nav-link-text long-texts pl-2 mwpx-100">{{ Str::limit(setting('company.name'), 22) }}</span>
<i class="fas fa-sort-down pl-2"></i> <i class="fas fa-sort-down pl-2"></i>
</a> </a>
@permission('read-common-companies') @permission('read-common-companies')
<div class="dropdown-menu dropdown-menu-right menu-dropdown"> <div class="dropdown-menu dropdown-menu-right menu-dropdown">
@foreach($companies as $com) @foreach($companies as $com)
<a href="{{ route('companies.switch', $com->id) }}" class="dropdown-item"> <a href="{{ route('companies.switch', $com->id) }}" class="dropdown-item">
<i class="fas fa-building"></i> <i class="fas fa-building"></i>
<span>{{ Str::limit($com->name, 18) }}</span> <span>{{ Str::limit($com->name, 18) }}</span>
</a> </a>
@endforeach @endforeach
@permission('update-common-companies') @permission('update-common-companies')
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a href="{{ route('companies.index') }}" class="dropdown-item"> <a href="{{ route('companies.index') }}" class="dropdown-item">
<i class="fas fa-cogs"></i> <i class="fas fa-cogs"></i>
<span>{{ trans('companies.manage') }}</span> <span>{{ trans('companies.manage') }}</span>
</a> </a>
@endpermission @endpermission
</div>
@endpermission
</li>
</ul>
<div class="ml-auto left-menu-toggle-position">
<div class="sidenav-toggler d-none d-xl-block left-menu-toggle" data-action="sidenav-unpin" data-target="#sidenav-main">
<div class="sidenav-toggler-inner">
<i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i>
</div> </div>
@endpermission
</li>
</ul>
<div class="ml-auto left-menu-toggle-position">
<div class="sidenav-toggler d-none d-xl-block left-menu-toggle" data-action="sidenav-unpin" data-target="#sidenav-main">
<div class="sidenav-toggler-inner">
<i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i>
</div> </div>
</div> </div>
</div> </div>
{!! menu('admin') !!}
</div> </div>
</nav> {!! menu('admin') !!}
</div>
</nav>
@stack('menu_end') @stack('menu_end')

View File

@ -1,252 +1,252 @@
@stack('navbar_start') @stack('navbar_start')
<nav class="navbar navbar-top navbar-expand navbar-dark border-bottom"> <nav class="navbar navbar-top navbar-expand navbar-dark border-bottom">
<div class="container-fluid"> <div class="container-fluid">
<div class="collapse navbar-collapse" id="navbarSupportedContent"> <div class="collapse navbar-collapse" id="navbarSupportedContent">
@if (user()->can('read-common-search')) @permission('read-common-search')
<form class="navbar-search navbar-search-light form-inline mb-0" id="navbar-search-main" autocomplete="off"> <form class="navbar-search navbar-search-light form-inline mb-0" id="navbar-search-main" autocomplete="off">
<div id="global-search" class="form-group mb-0 mr-sm-3"> <div id="global-search" class="form-group mb-0 mr-sm-3">
<div class="input-group input-group-alternative input-group-merge"> <div class="input-group input-group-alternative input-group-merge">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-search"></i></span> <span class="input-group-text"><i class="fa fa-search"></i></span>
</div> </div>
<input type="text" name="search" v-model="keyword" @input="onChange" v-click-outside="closeResult" class="form-control" autocomplete="off" placeholder="Search"> <input type="text" name="search" v-model="keyword" @input="onChange" v-click-outside="closeResult" class="form-control" autocomplete="off" placeholder="Search">
<div class="dropdown-menu dropdown-menu-xl dropdown-menu-center" ref="menu" :class="[{show: show}]"> <div class="dropdown-menu dropdown-menu-xl dropdown-menu-center" ref="menu" :class="[{show: show}]">
<div class="list-group list-group-flush"> <div class="list-group list-group-flush">
<a class="list-group-item list-group-item-action" :href="item.href" v-for="(item, index) in items"> <a class="list-group-item list-group-item-action" :href="item.href" v-for="(item, index) in items">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col ml--2"> <div class="col ml--2">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<div> <div>
<div class="name" v-text="item.name"></div> <div class="name" v-text="item.name"></div>
</div> </div>
<div class="text-muted"> <div class="text-muted">
<span class="type" v-text="item.type"></span> <span class="type" v-text="item.type"></span>
</div>
</div> </div>
</div> </div>
</div> </div>
</a> </div>
</div> </a>
</div> </div>
</div> </div>
</div> </div>
<button type="button" class="close" data-action="search-close" data-target="#navbar-search-main" aria-label="Close"> </div>
<span aria-hidden="true">×</span> <button type="button" class="close" data-action="search-close" data-target="#navbar-search-main" aria-label="Close">
</button> <span aria-hidden="true">×</span>
</form> </button>
@endif </form>
@endpermission
<ul class="navbar-nav align-items-center ml-md-auto"> <ul class="navbar-nav align-items-center ml-md-auto">
<li class="nav-item d-xl-none"> <li class="nav-item d-xl-none">
<div class="pr-3 sidenav-toggler sidenav-toggler-dark" data-action="sidenav-pin" data-target="#sidenav-main"> <div class="pr-3 sidenav-toggler sidenav-toggler-dark" data-action="sidenav-pin" data-target="#sidenav-main">
<div class="sidenav-toggler-inner"> <div class="sidenav-toggler-inner">
<i class="sidenav-toggler-line"></i> <i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i> <i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i> <i class="sidenav-toggler-line"></i>
</div>
</div> </div>
</li> </div>
</li>
<li class="nav-item d-sm-none"> <li class="nav-item d-sm-none">
<a class="nav-link" href="#" data-action="search-show" data-target="#navbar-search-main"> <a class="nav-link" href="#" data-action="search-show" data-target="#navbar-search-main">
<i class="fa fa-search"></i> <i class="fa fa-search"></i>
</a> </a>
</li> </li>
@if (user()->can(['create-incomes-invoices', 'create-incomes-revenues', 'create-incomes-customers', 'create-expenses-bills', 'create-expenses-payments', 'create-expenses-vendors']))
<li class="nav-item dropdown">
<a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-plus"></i>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-dark dropdown-menu-right">
<div class="row shortcuts px-4">
@permission('create-incomes-invoices')
<a href="{{ route('invoices.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-info">
<i class="fa fa-money-bill"></i>
</span>
<small class="text-info">{{ trans_choice('general.invoices', 1) }}</small>
</a>
@endpermission
@permission('create-incomes-revenues')
<a href="{{ route('revenues.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-info">
<i class="fas fa-hand-holding-usd"></i>
</span>
<small class="text-info">{{ trans_choice('general.revenues', 1) }}</small>
</a>
@endpermission
@permission('create-incomes-customers')
<a href="{{ route('customers.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-info">
<i class="fas fa-user"></i>
</span>
<small class="text-info">{{ trans_choice('general.customers', 1) }}</small>
</a>
@endpermission
@permission('create-expenses-bills')
<a href="{{ route('bills.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-danger">
<i class="fa fa-shopping-cart"></i>
</span>
<small class="text-danger">{{ trans_choice('general.bills', 1) }}</small>
</a>
@endpermission
@permission('create-expenses-payments')
<a href="{{ route('payments.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-danger">
<i class="fas fa-hand-holding-usd"></i>
</span>
<small class="text-danger">{{ trans_choice('general.payments', 1) }}</small>
</a>
@endpermission
@permission('create-expenses-vendors')
<a href="{{ route('vendors.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-danger">
<i class="fas fa-user"></i>
</span>
<small class="text-danger">{{ trans_choice('general.vendors', 1) }}</small>
</a>
@endpermission
</div>
</div>
</li>
@endif
@permission(['create-incomes-invoices', 'create-incomes-revenues', 'create-incomes-customers', 'create-expenses-bills', 'create-expenses-payments', 'create-expenses-vendors'])
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-plus"></i>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-dark dropdown-menu-right">
<div class="row shortcuts px-4">
@permission('create-incomes-invoices')
<a href="{{ route('invoices.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-info">
<i class="fa fa-money-bill"></i>
</span>
<small class="text-info">{{ trans_choice('general.invoices', 1) }}</small>
</a>
@endpermission
@permission('create-incomes-revenues')
<a href="{{ route('revenues.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-info">
<i class="fas fa-hand-holding-usd"></i>
</span>
<small class="text-info">{{ trans_choice('general.revenues', 1) }}</small>
</a>
@endpermission
@permission('create-incomes-customers')
<a href="{{ route('customers.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-info">
<i class="fas fa-user"></i>
</span>
<small class="text-info">{{ trans_choice('general.customers', 1) }}</small>
</a>
@endpermission
@permission('create-expenses-bills')
<a href="{{ route('bills.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-danger">
<i class="fa fa-shopping-cart"></i>
</span>
<small class="text-danger">{{ trans_choice('general.bills', 1) }}</small>
</a>
@endpermission
@permission('create-expenses-payments')
<a href="{{ route('payments.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-danger">
<i class="fas fa-hand-holding-usd"></i>
</span>
<small class="text-danger">{{ trans_choice('general.payments', 1) }}</small>
</a>
@endpermission
@permission('create-expenses-vendors')
<a href="{{ route('vendors.create') }}" class="col-4 shortcut-item">
<span class="shortcut-media avatar rounded-circle bg-gradient-danger">
<i class="fas fa-user"></i>
</span>
<small class="text-danger">{{ trans_choice('general.vendors', 1) }}</small>
</a>
@endpermission
</div>
</div>
</li>
@endif
<li class="nav-item dropdown">
<a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span>
<i class="far fa-bell"></i>
</span>
@if ($notifications)
<span class="badge badge-md badge-circle badge-reminder badge-warning">{{ $notifications }}</span>
@endif
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right py-0 overflow-hidden">
@if ($notifications)
<div class="p-3">
<a class="text-sm text-muted">{{ trans_choice('header.notifications.counter', $notifications, ['count' => $notifications]) }}</a>
</div>
@endif
<div class="list-group list-group-flush">
@if (count($bills))
<a href="{{ route('users.read.bills', $user->id) }}" class="list-group-item list-group-item-action">
<div class="row align-items-center">
<div class="col-auto">
<i class="fa fa-shopping-cart"></i>
</div>
<div class="col ml--2">
<div class="d-flex justify-content-between align-items-center">
<h4 class="mb-0 text-sm">{{ trans_choice('header.notifications.upcoming_bills', count($bills), ['count' => count($bills)]) }}</h4>
</div>
</div>
</div>
</a>
@endif
@if (count($invoices))
<a href="{{ route('users.read.invoices', $user->id) }}" class="list-group-item list-group-item-action">
<div class="row align-items-center">
<div class="col-auto">
<i class="fa fa-money-bill"></i>
</div>
<div class="col ml--2">
<div class="d-flex justify-content-between align-items-center">
<h4 class="mb-0 text-sm">{{ trans_choice('header.notifications.overdue_invoices', count($invoices), ['count' => count($invoices)]) }}</h4>
</div>
</div>
</div>
</a>
@endif
</div>
@if ($notifications)
<a href="#" class="dropdown-item text-center text-primary font-weight-bold py-3">{{ trans('header.notifications.view_all') }}</a>
@else
<a class="dropdown-item text-center text-primary font-weight-bold py-3">{{ trans_choice('header.notifications.counter', $notifications, ['count' => $notifications]) }}</a>
@endif
</div>
</li>
@permission('read-install-updates')
<li class="nav-item">
<a class="nav-link" href="{{ route('updates.index') }}" title="{{ $updates }} Updates Available" role="button" aria-haspopup="true" aria-expanded="false">
<span> <span>
<i class="far fa-bell"></i> <i class="fa fa-sync-alt"></i>
</span> </span>
@if ($notifications) @if ($updates)
<span class="badge badge-md badge-circle badge-reminder badge-warning">{{ $notifications }}</span> <span class="badge badge-md badge-circle badge-update badge-warning">{{ $updates }}</span>
@endif @endif
</a> </a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right py-0 overflow-hidden">
@if ($notifications)
<div class="p-3">
<a class="text-sm text-muted">{{ trans_choice('header.notifications.counter', $notifications, ['count' => $notifications]) }}</a>
</div>
@endif
<div class="list-group list-group-flush">
@if (count($bills))
<a href="{{ route('users.read.bills', $user->id) }}" class="list-group-item list-group-item-action">
<div class="row align-items-center">
<div class="col-auto">
<i class="fa fa-shopping-cart"></i>
</div>
<div class="col ml--2">
<div class="d-flex justify-content-between align-items-center">
<h4 class="mb-0 text-sm">{{ trans_choice('header.notifications.upcoming_bills', count($bills), ['count' => count($bills)]) }}</h4>
</div>
</div>
</div>
</a>
@endif
@if (count($invoices))
<a href="{{ route('users.read.invoices', $user->id) }}" class="list-group-item list-group-item-action">
<div class="row align-items-center">
<div class="col-auto">
<i class="fa fa-money-bill"></i>
</div>
<div class="col ml--2">
<div class="d-flex justify-content-between align-items-center">
<h4 class="mb-0 text-sm">{{ trans_choice('header.notifications.overdue_invoices', count($invoices), ['count' => count($invoices)]) }}</h4>
</div>
</div>
</div>
</a>
@endif
</div>
@if ($notifications)
<a href="#" class="dropdown-item text-center text-primary font-weight-bold py-3">{{ trans('header.notifications.view_all') }}</a>
@else
<a class="dropdown-item text-center text-primary font-weight-bold py-3">{{ trans_choice('header.notifications.counter', $notifications, ['count' => $notifications]) }}</a>
@endif
</div>
</li> </li>
@endpermission
@permission('read-install-updates') <li class="nav-item d-none d-md-block">
<li class="nav-item"> <a class="nav-link" href="{{ url(trans('header.support_link')) }}" target="_blank" title="{{ trans('general.help') }}" role="button" aria-haspopup="true" aria-expanded="false">
<a class="nav-link" href="{{ route('updates.index') }}" title="{{ $updates }} Updates Available" role="button" aria-haspopup="true" aria-expanded="false"> <i class="far fa-life-ring"></i>
<span> </a>
<i class="fa fa-sync-alt"></i> </li>
</ul>
<ul class="navbar-nav align-items-center ml-auto ml-md-0">
<li class="nav-item dropdown">
<a class="nav-link pr-0" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<div class="media align-items-center">
<img src="{{ asset('public/img/user.png') }}" height="36" width="36" alt="User"/>
<div class="media-body ml-2 d-none d-lg-block">
<span class="mb-0 text-sm font-weight-bold">
@if (!empty($user->name))
{{ $user->name }}
@endif
</span> </span>
@if ($updates)
<span class="badge badge-md badge-circle badge-update badge-warning">{{ $updates }}</span>
@endif
</a>
</li>
@endpermission
<li class="nav-item d-none d-md-block">
<a class="nav-link" href="{{ url(trans('header.support_link')) }}" target="_blank" title="{{ trans('general.help') }}" role="button" aria-haspopup="true" aria-expanded="false">
<i class="far fa-life-ring"></i>
</a>
</li>
</ul>
<ul class="navbar-nav align-items-center ml-auto ml-md-0">
<li class="nav-item dropdown">
<a class="nav-link pr-0" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<div class="media align-items-center">
<img src="{{ asset('public/img/user.png') }}" height="36" width="36" alt="User"/>
<div class="media-body ml-2 d-none d-lg-block">
<span class="mb-0 text-sm font-weight-bold">
@if (!empty($user->name))
{{ $user->name }}
@endif
</span>
</div>
</div> </div>
</a>
<div class="dropdown-menu dropdown-menu-right">
<div class="dropdown-header noti-title">
<h6 class="text-overflow m-0">{{ trans('general.welcome') }}</h6>
</div>
@permission('update-auth-users')
<a href="{{ route('users.edit', $user->id) }}" class="dropdown-item">
<i class="fas fa-user"></i>
<span>{{ trans('auth.profile') }}</span>
</a>
@endpermission
@permission('read-auth-users')
<div class="dropdown-divider"></div>
<a href="{{ route('users.index') }}" class="dropdown-item">
<i class="fas fa-users"></i>
<span>{{ trans_choice('general.users', 2) }}</span>
</a>
@endpermission
@permission('read-auth-roles')
<a href="{{ route('roles.index') }}" class="dropdown-item">
<i class="fas fa-list"></i>
<span>{{ trans_choice('general.roles', 2) }}</span>
</a>
@endpermission
@permission('read-auth-permissions')
<a href="{{ route('permissions.index') }}" class="dropdown-item">
<i class="fas fa-key"></i>
<span>{{ trans_choice('general.permissions', 2) }}</span>
</a>
@endpermission
<div class="dropdown-divider"></div>
<a href="{{ route('logout') }}" class="dropdown-item">
<i class="fas fa-power-off"></i>
<span>{{ trans('auth.logout') }}</span>
</a>
</div> </div>
</li> </a>
</ul> <div class="dropdown-menu dropdown-menu-right">
</div> <div class="dropdown-header noti-title">
<h6 class="text-overflow m-0">{{ trans('general.welcome') }}</h6>
</div>
@permission('update-auth-users')
<a href="{{ route('users.edit', $user->id) }}" class="dropdown-item">
<i class="fas fa-user"></i>
<span>{{ trans('auth.profile') }}</span>
</a>
@endpermission
@permission('read-auth-users')
<div class="dropdown-divider"></div>
<a href="{{ route('users.index') }}" class="dropdown-item">
<i class="fas fa-users"></i>
<span>{{ trans_choice('general.users', 2) }}</span>
</a>
@endpermission
@permission('read-auth-roles')
<a href="{{ route('roles.index') }}" class="dropdown-item">
<i class="fas fa-list"></i>
<span>{{ trans_choice('general.roles', 2) }}</span>
</a>
@endpermission
@permission('read-auth-permissions')
<a href="{{ route('permissions.index') }}" class="dropdown-item">
<i class="fas fa-key"></i>
<span>{{ trans_choice('general.permissions', 2) }}</span>
</a>
@endpermission
<div class="dropdown-divider"></div>
<a href="{{ route('logout') }}" class="dropdown-item">
<i class="fas fa-power-off"></i>
<span>{{ trans('auth.logout') }}</span>
</a>
</div>
</li>
</ul>
</div> </div>
</nav> </div>
</nav>
@stack('navbar_end') @stack('navbar_end')

View File

@ -1,21 +1,21 @@
@stack('header_start') @stack('header_start')
<div id="header" class="header pb-6"> <div id="header" class="header pb-6">
<div class="container-fluid content-layout"> <div class="container-fluid content-layout">
<div class="header-body"> <div class="header-body">
<div class="row py-4 align-items-center"> <div class="row py-4 align-items-center">
<div class="col-sm-4 col-md-5 align-items-center"> <div class="col-sm-4 col-md-5 align-items-center">
<h2 class="d-inline-flex mb-0 long-texts">@yield('title')</h2> <h2 class="d-inline-flex mb-0 long-texts">@yield('title')</h2>
@yield('dashboard_action') @yield('dashboard_action')
</div> </div>
<div class="col-sm-8 col-md-7"> <div class="col-sm-8 col-md-7">
<div class="text-right"> <div class="text-right">
@yield('new_button') @yield('new_button')
@stack('header_button') @stack('header_button')
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@stack('header_end') @stack('header_end')

View File

@ -1,28 +1,28 @@
@stack('menu_start') @stack('menu_start')
<nav class="sidenav navbar navbar-vertical fixed-left navbar-expand-xs navbar-light bg-default" id="sidenav-main"> <nav class="sidenav navbar navbar-vertical fixed-left navbar-expand-xs navbar-light bg-default" id="sidenav-main">
<div class="scrollbar-inner"> <div class="scrollbar-inner">
<div class="sidenav-header d-flex align-items-center ml-4"> <div class="sidenav-header d-flex align-items-center ml-4">
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="nav-link" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="avatar avatar-xs background-unset"> <span class="avatar avatar-xs background-unset">
<img class="border-radius-0 border-0 mr-3" alt="Image placeholder" src="{{ setting('company.logo') ? Storage::url(setting('company.logo')) : asset('public/img/akaunting-logo-white.png') }}"> <img class="border-radius-0 border-0 mr-3" alt="Image placeholder" src="{{ setting('company.logo') ? Storage::url(setting('company.logo')) : asset('public/img/akaunting-logo-white.png') }}">
</span> </span>
<span class="nav-link-text long-texts pl-2 mwpx-100">{{ Str::limit(setting('company.name'), 22) }}</span> <span class="nav-link-text long-texts pl-2 mwpx-100">{{ Str::limit(setting('company.name'), 22) }}</span>
</a> </a>
</li> </li>
</ul> </ul>
<div class="ml-auto left-menu-toggle-position"> <div class="ml-auto left-menu-toggle-position">
<div class="sidenav-toggler d-none d-xl-block left-menu-toggle" data-action="sidenav-unpin" data-target="#sidenav-main"> <div class="sidenav-toggler d-none d-xl-block left-menu-toggle" data-action="sidenav-unpin" data-target="#sidenav-main">
<div class="sidenav-toggler-inner"> <div class="sidenav-toggler-inner">
<i class="sidenav-toggler-line"></i> <i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i> <i class="sidenav-toggler-line"></i>
<i class="sidenav-toggler-line"></i> <i class="sidenav-toggler-line"></i>
</div>
</div> </div>
</div> </div>
</div> </div>
{!! menu('portal') !!}
</div> </div>
</nav> {!! menu('portal') !!}
</div>
</nav>
@stack('menu_end') @stack('menu_end')