diff --git a/app/Utilities/Widgets.php b/app/Utilities/Widgets.php index 1d4487bc5..c95c9ecba 100644 --- a/app/Utilities/Widgets.php +++ b/app/Utilities/Widgets.php @@ -2,6 +2,7 @@ namespace App\Utilities; +use App\Models\Common\Widget; use App\Models\Module\Module; class Widgets @@ -10,7 +11,7 @@ class Widgets { $classes = []; - $core_classes = [ + $list = [ 'App\Widgets\TotalIncome', 'App\Widgets\TotalExpenses', 'App\Widgets\TotalProfit', @@ -22,26 +23,16 @@ class Widgets 'App\Widgets\LatestExpenses', ]; - static::parseClasses($classes, $core_classes); - - $modules = Module::enabled()->get(); - - foreach ($modules as $module) { + Module::enabled()->each(function ($module) use (&$list) { $m = module($module->alias); - // Check if the module exists and has widgets if (!$m || empty($m->get('widgets'))) { - continue; + return; } - static::parseClasses($classes, $m->get('widgets')); - } + $list = array_merge($list, (array) $m->get('widgets')); + }); - return $classes; - } - - protected static function parseClasses(&$classes, $list) - { foreach ($list as $class) { if (!class_exists($class)) { continue; @@ -51,17 +42,31 @@ class Widgets $classes[$class] = $name; } + + return $classes; } public static function getInstance($model) { + if (is_string($model)) { + $model = Widget::where('class', $model)->first(); + } + + if ((!$model instanceof Widget) || !class_exists($model->class)) { + return false; + } + $class = $model->class; return new $class($model); } - public static function show($model) + public static function show($model, ...$arguments) { - return static::getInstance($model)->show(); + if (!$class = static::getInstance($model)) { + return ''; + } + + return $class->show(...$arguments); } } diff --git a/app/Utilities/helpers.php b/app/Utilities/helpers.php index 4dcc4b004..5c0c3f641 100644 --- a/app/Utilities/helpers.php +++ b/app/Utilities/helpers.php @@ -41,12 +41,16 @@ if (!function_exists('company_date')) { if (!function_exists('show_widget')) { /** - * Format the given date based on company settings. + * Show a widget. * * @return string */ - function show_widget($model) + function show_widget() { - return Widgets::show($model); + $arguments = func_get_args(); + + $model = array_shift($arguments); + + return Widgets::show($model, ...$arguments); } }