akaunting/app/Utilities/Widgets.php

215 lines
5.2 KiB
PHP
Raw Normal View History

2019-12-31 02:20:10 +03:00
<?php
namespace App\Utilities;
2020-01-04 11:49:59 +03:00
use App\Models\Common\Widget;
2019-12-31 02:20:10 +03:00
use App\Models\Module\Module;
use App\Traits\Modules;
2020-01-04 17:49:11 +03:00
use Illuminate\Support\Str;
2019-12-31 02:20:10 +03:00
class Widgets
{
use Modules;
2022-06-01 10:15:55 +03:00
public static $core_widgets = [
'App\Widgets\Receivables',
'App\Widgets\Payables',
'App\Widgets\CashFlow',
'App\Widgets\ProfitLoss',
'App\Widgets\ExpensesByCategory',
'App\Widgets\AccountBalance',
'App\Widgets\Currencies',
];
public static function getClasses($alias = 'core', $check_permission = true)
2019-12-31 02:20:10 +03:00
{
$classes = $list = [];
if (in_array($alias, ['core', 'all'])) {
2022-06-01 10:15:55 +03:00
$list = static::$core_widgets;
}
Module::enabled()->each(function ($module) use (&$list, $alias) {
if (! in_array($alias, [$module->alias, 'all'])) {
return;
}
2019-12-31 02:20:10 +03:00
$m = module($module->alias);
2022-06-18 00:36:59 +03:00
if (! $m || $m->disabled() || empty($m->get('widgets'))) {
2020-01-04 11:49:59 +03:00
return;
2019-12-31 02:20:10 +03:00
}
2020-01-04 11:49:59 +03:00
$list = array_merge($list, (array) $m->get('widgets'));
});
2019-12-31 02:20:10 +03:00
foreach ($list as $class) {
if (! class_exists($class) || ($check_permission && ! static::canRead($class))) {
continue;
}
2020-02-06 17:08:20 +03:00
$classes[$class] = static::getDefaultName($class);
2019-12-31 02:20:10 +03:00
}
2020-01-04 11:49:59 +03:00
return $classes;
2019-12-31 02:20:10 +03:00
}
2020-01-04 13:42:58 +03:00
public static function getClassInstance($model)
2019-12-31 02:20:10 +03:00
{
2020-01-04 11:49:59 +03:00
if (is_string($model)) {
2020-01-16 14:20:08 +03:00
$class_name = $model;
2020-01-04 11:49:59 +03:00
2022-06-01 10:15:55 +03:00
if (! class_exists($class_name)) {
2020-01-16 14:20:08 +03:00
return false;
}
$model = Widget::where('dashboard_id', session('dashboard_id'))->where('class', $class_name)->first();
if (! empty($model) && ($model->alias != 'core') && (new static)->moduleIsDisabled($model->alias)) {
return false;
}
if (! $model instanceof Widget) {
2020-01-16 14:20:08 +03:00
$class = (new $class_name());
2020-01-04 11:49:59 +03:00
2020-01-16 14:20:08 +03:00
$model = new Widget();
$model->id = 0;
2021-04-16 00:59:43 +03:00
$model->company_id = company_id();
2020-01-16 14:20:08 +03:00
$model->dashboard_id = session('dashboard_id');
$model->class = $class_name;
$model->name = $class->getDefaultName();
$model->sort = 99;
$model->settings = $class->getDefaultSettings();
}
} else {
2022-06-01 10:15:55 +03:00
if ((! $model instanceof Widget) || ! class_exists($model->class)) {
2020-01-16 14:20:08 +03:00
return false;
}
2022-06-18 00:36:59 +03:00
if (($model->alias != 'core') && (new static)->moduleIsDisabled($model->alias)) {
return false;
}
2020-01-16 14:20:08 +03:00
$class_name = $model->class;
}
2019-12-31 02:20:10 +03:00
2020-01-16 14:20:08 +03:00
return new $class_name($model);
2019-12-31 02:20:10 +03:00
}
2020-01-04 11:49:59 +03:00
public static function show($model, ...$arguments)
2019-12-31 02:20:10 +03:00
{
if (! $class = static::getClassInstance($model)) {
2020-01-04 11:49:59 +03:00
return '';
}
return $class->show(...$arguments);
2019-12-31 02:20:10 +03:00
}
2020-01-04 17:49:11 +03:00
2020-06-13 00:13:39 +03:00
public static function canShow($class)
{
return (static::isModuleEnabled($class) && static::canRead($class));
}
2022-06-01 10:15:55 +03:00
public static function cannotShow($class)
{
return ! static::canShow($class);
}
2020-01-04 17:49:11 +03:00
public static function canRead($class)
{
return user()->can(static::getPermission($class));
}
2022-06-01 10:15:55 +03:00
public static function cannotRead($class)
{
return ! static::canRead($class);
}
2020-01-04 17:49:11 +03:00
public static function getPermission($class)
{
$arr = explode('\\', $class);
2020-01-04 17:49:11 +03:00
$prefix = 'read-';
// Add module
2020-06-13 00:13:39 +03:00
if ($alias = static::getModuleAlias($arr)) {
$prefix .= $alias . '-';
}
$prefix .= 'widgets-';
$class_name = end($arr);
$permission = $prefix . Str::kebab($class_name);
2020-01-04 17:49:11 +03:00
2020-01-28 16:15:12 +03:00
return str_replace('--', '-', $permission);
2020-01-04 17:49:11 +03:00
}
2020-02-06 17:08:20 +03:00
public static function getDefaultName($class)
{
return (new $class())->getDefaultName();
}
2020-06-13 00:13:39 +03:00
public static function isModuleEnabled($class)
{
2022-06-01 10:15:55 +03:00
if (! $alias = static::getModuleAlias($class)) {
2020-06-13 00:13:39 +03:00
return true;
}
if (Module::alias($alias)->enabled()->first()) {
return true;
}
return false;
}
2022-06-01 10:15:55 +03:00
public static function isModuleDisabled($class)
{
return ! static::isModuleEnabled($class);
}
public static function isModule($class)
{
2020-06-13 00:13:39 +03:00
$arr = is_array($class) ? $class : explode('\\', $class);
return (strtolower($arr[0]) == 'modules');
}
2022-06-01 10:15:55 +03:00
public static function isNotModule($class)
{
return ! static::isModule($class);
}
public static function getModuleAlias($class)
{
2022-06-01 10:15:55 +03:00
if (static::isNotModule($class)) {
return false;
}
2020-06-13 00:13:39 +03:00
$arr = is_array($class) ? $class : explode('\\', $class);
return Str::kebab($arr[1]);
}
2022-06-01 10:15:55 +03:00
public static function getCoreWidgets()
{
return static::$core_widgets;
}
public static function setCoreWidgets($widgets)
{
static::$core_widgets = $widgets;
}
public static function optimizeCoreWidgets()
{
$core_widgets = collect(static::getCoreWidgets());
$core_widgets->pop();
$core_widgets->push('App\Widgets\BankFeeds');
static::setCoreWidgets($core_widgets->all());
}
2019-12-31 02:20:10 +03:00
}