akaunting/app/View/Components/EmptyPage.php
2022-11-07 11:41:54 +03:00

383 lines
10 KiB
PHP

<?php
namespace App\View\Components;
use App\Abstracts\View\Component;
use App\Traits\Modules;
use Illuminate\View\View;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
class EmptyPage extends Component
{
use Modules;
/** @var string */
public $alias;
/** @var string */
public $group;
/** @var string */
public $page;
/** @var string */
public $title;
/** @var string */
public $createButtonTitle;
/** @var string */
public $importButtonTitle;
/** @var string */
public $description;
/** @var string */
public $docsCategory;
/** @var string */
public $image;
/** @var string */
public $imageEmptyPage;
/** @var bool */
public $checkPermissionCreate;
/** @var string */
public $permissionCreate;
/** @var array */
public $buttons;
/** @var bool */
public $hideButtonCreate;
/** @var bool */
public $hideButtonImport;
/** @var bool */
public $hideDocsDescription;
/** @var string */
public $importRoute;
/** @var array */
public $importRouteParameters;
/** @var array */
public $suggestion;
/** @var array */
public $suggestions;
/**
* Create a new component instance.
*
* @return void
*/
public function __construct(
string $alias = '', string $group = '', string $page = '',
string $title = '', string $createButtonTitle = '', string $importButtonTitle = '',
string $description = '', string $docsCategory = 'accounting', string $image = '',
string $imageEmptyPage = '', bool $checkPermissionCreate = true, string $permissionCreate = '',
array $buttons = [], bool $hideButtonCreate = false, bool $hideButtonImport = false,
bool $hideDocsDescription = false, string $importRoute = '', array $importRouteParameters = []
) {
if (empty($alias) && ! empty($group)) {
$alias = $group;
}
$this->alias = (module($alias) === null) ? 'core': $alias;
$this->group = $group;
$this->page = $page;
$this->docsCategory = $docsCategory;
$this->title = $this->getTitle($title);
$this->createButtonTitle = $createButtonTitle;
$this->importButtonTitle = $importButtonTitle;
$this->description = $this->getDescription($description);
$this->imageEmptyPage = $imageEmptyPage;
$this->image = $this->getImage($page, $image);
$this->checkPermissionCreate = $checkPermissionCreate;
$this->permissionCreate = $this->getPermissionCreate($page, $group, $permissionCreate);
$this->hideButtonCreate = $hideButtonCreate;
$this->hideButtonImport = $hideButtonImport;
$this->hideDocsDescription = $hideDocsDescription;
$this->buttons = $this->getButtons($page, $group, $buttons);
$this->suggestions = $this->getSuggestionModules();
$this->suggestion = $this->getSuggestionModule();
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|string
*/
public function render()
{
return view('components.empty-page');
}
protected function getTitle($title = null, $number = 2)
{
if (! empty($title)) {
return $title;
}
switch ($this->alias) {
case 'core':
$text = 'general.' . $this->page;
$text2 = 'general.' . Str::replace('-', '_', $this->page);
break;
default:
$text = $this->alias . '::general.' . $this->page;
$text2 = $this->alias . '::general.' . Str::replace('-', '_', $this->page);
}
$title = trans_choice($text, $number);
if ($title == $text) {
$title = trans_choice($text2, $number);
}
return $title;
}
protected function getDescription($description)
{
if (! empty($description)) {
return $description;
}
switch ($this->alias) {
case 'core':
$text = 'general.empty.' . $this->page;
$text2 = 'general.empty.' . Str::replace('-', '_', $this->page);
break;
default:
$text = $this->alias . '::general.empty.' . $this->page;
$text2 = $this->alias . '::general.empty.' . Str::replace('-', '_', $this->page);
}
$description = trans($text);
if ($description == $text) {
$description = trans($text2);
}
if ($this->hideDocsDescription) {
$docs_url = $this->getDocsUrl();
if (! empty($docs_url)) {
$description .= ' ' . trans('general.empty.documentation', ['url' => $docs_url]);
}
}
return $description;
}
protected function getDocsUrl()
{
switch ($this->alias) {
case 'core':
$docs_path = 'user-manual/';
if (! empty($this->group)) {
$docs_path .= $this->group . '/';
}
$docs_path .= $this->page;
break;
default:
$docs_path = 'app-manual/' . $this->docsCategory . '/' . $this->alias;
}
return 'https://akaunting.com/docs/' . $docs_path;
}
protected function getImage($page, $image)
{
if (! empty($image)) {
return $image;
}
if (! empty($this->imageEmptyPage)) {
return asset($this->imageEmptyPage);
}
$path = 'public/img/empty_pages/' . $page . '.png';
if ($this->alias != 'core') {
$path = 'modules/' . Str::studly($this->alias) . '/Resources/assets/img/empty-' . $page . '.png';
if (! file_exists($path)) {
$path = 'public/img/empty_pages/default.png';
}
}
return asset($path);
}
protected function getPermissionCreate($page, $group, $permissionCreate)
{
if (! empty($permissionCreate)) {
return $permissionCreate;
}
$pages = [
'reconciliations' => 'create-banking-reconciliations',
'transfers' => 'create-banking-transfers',
'vendors' => 'create-purchases-vendors',
'customers' => 'create-sales-customers',
'taxes' => 'create-settings-taxes',
'items' => 'create-common-items',
];
if (array_key_exists($page, $pages)) {
$permissionCreate = $pages[$page];
}
if (empty($permissionCreate) && !empty($group)) {
$permissionCreate = 'create-' . $group . '-' . $page;
}
return $permissionCreate;
}
protected function getButtons($page, $group, $buttons)
{
if (! empty($buttons)) {
$suggestion = $this->getSuggestionModule();
if (! empty($suggestion)) {
return array_slice($buttons, 0, 2);
} else {
return array_slice($buttons, 0, 3);
}
}
if (! $this->hideButtonCreate) {
$buttons[] = $this->getCreateButton($page, $group);
}
if (! $this->hideButtonImport) {
$buttons[] = $this->getImportButton();
}
return $buttons;
}
protected function getCreateButton($page, $group)
{
try {
$route = route($group . '.' . $page . '.create');
} catch (\Exception $e) {
$route = route($page . '.create');
}
$title = $this->createButtonTitle;
if (! $title) {
$title = $this->getTitle(null, 1);
}
return [
'url' => $route,
'permission' => $this->permissionCreate,
'text' => trans('general.title.new', ['type' => $title]),
'description' => trans('general.empty.actions.new', ['type' => strtolower($title)]),
'active_badge' => true,
];
}
protected function getImportButton()
{
$importRoute = $this->getImportRoute($this->importRoute);
$importRouteParameters = $this->getImportRouteParameters($this->importRouteParameters);
$title = $this->importButtonTitle;
if (! $title) {
$title = $this->getTitle();
}
return [
'url' => route($importRoute, $importRouteParameters),
'permission' => $this->permissionCreate,
'text' => trans('import.title', ['type' => $title]),
'description' => trans('general.empty.actions.import', ['type' => strtolower($title)]),
'active_badge' => false,
];
}
protected function getImportRoute($importRoute)
{
if (! empty($importRoute)) {
return $importRoute;
}
$route = 'import.create';
return $route;
}
protected function getImportRouteParameters($importRouteParameters)
{
if (! empty($importRouteParameters)) {
return $importRouteParameters;
}
return array_slice(request()->segments(), -2, 2, true) ;
}
public function getSuggestionModule()
{
return ! empty($this->suggestions) ? Arr::random($this->suggestions) : false;
}
public function getSuggestionModules()
{
if ((! $user = user()) || $user->cannot('read-modules-home')) {
return [];
}
if (! $path = Route::current()->uri()) {
return [];
}
$path = str_replace('{company_id}/', '', $path);
if (! $suggestions = $this->getSuggestions($path)) {
return [];
}
$modules = [];
foreach ($suggestions->modules as $s_module) {
if ($this->moduleIsEnabled($s_module->alias)) {
continue;
}
$s_module->action_url = company_id() . '/' . $s_module->action_url;
$modules[] = $s_module;
}
if (empty($modules)) {
return [];
}
return $modules;
}
}