33
common/Admin/Appearance/Themes/CrupdateCssTheme.php
Executable file
33
common/Admin/Appearance/Themes/CrupdateCssTheme.php
Executable file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Admin\Appearance\Themes;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class CrupdateCssTheme
|
||||
{
|
||||
public function execute(array $data, CssTheme $cssTheme = null): ?CssTheme
|
||||
{
|
||||
if (!$cssTheme) {
|
||||
$cssTheme = CssTheme::newInstance([
|
||||
'user_id' => Auth::id(),
|
||||
'values' => $data['is_dark']
|
||||
? config('common.themes.dark')
|
||||
: config('common.themes.light'),
|
||||
]);
|
||||
}
|
||||
|
||||
$attributes = Arr::only($data, [
|
||||
'name',
|
||||
'is_dark',
|
||||
'default_dark',
|
||||
'default_light',
|
||||
'values',
|
||||
]);
|
||||
|
||||
$cssTheme->fill($attributes)->save();
|
||||
|
||||
return $cssTheme;
|
||||
}
|
||||
}
|
||||
28
common/Admin/Appearance/Themes/CrupdateCssThemeRequest.php
Executable file
28
common/Admin/Appearance/Themes/CrupdateCssThemeRequest.php
Executable file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Admin\Appearance\Themes;
|
||||
|
||||
use Auth;
|
||||
use Common\Core\BaseFormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class CrupdateCssThemeRequest extends BaseFormRequest
|
||||
{
|
||||
public function rules(): array
|
||||
{
|
||||
$required = $this->getMethod() === 'POST' ? 'required' : '';
|
||||
$ignore = $this->getMethod() === 'PUT' ? $this->route('css_theme')->id : '';
|
||||
$userId = $this->route('css_theme') ? $this->route('css_theme')->user_id : Auth::id();
|
||||
|
||||
return [
|
||||
'name' => [
|
||||
$required, 'string', 'min:3',
|
||||
Rule::unique('css_themes')->where('user_id', $userId)->ignore($ignore)
|
||||
],
|
||||
'is_dark' => 'boolean',
|
||||
'default_dark' => 'boolean',
|
||||
'default_light' => 'boolean',
|
||||
'colors' => 'array',
|
||||
];
|
||||
}
|
||||
}
|
||||
75
common/Admin/Appearance/Themes/CssTheme.php
Executable file
75
common/Admin/Appearance/Themes/CssTheme.php
Executable file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Admin\Appearance\Themes;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class CssTheme extends Model
|
||||
{
|
||||
protected $guarded = ['id'];
|
||||
|
||||
protected $casts = [
|
||||
'id' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
'is_dark' => 'boolean',
|
||||
'default_dark' => 'boolean',
|
||||
'default_light' => 'boolean',
|
||||
'font' => 'json',
|
||||
];
|
||||
|
||||
const MODEL_TYPE = 'css_theme';
|
||||
|
||||
public static function getModelTypeAttribute(): string
|
||||
{
|
||||
return self::MODEL_TYPE;
|
||||
}
|
||||
|
||||
public function setValuesAttribute($value)
|
||||
{
|
||||
if ($value && is_array($value)) {
|
||||
$this->attributes['values'] = json_encode($value);
|
||||
}
|
||||
}
|
||||
|
||||
public function getValuesAttribute($value): array
|
||||
{
|
||||
if ($value && is_string($value)) {
|
||||
return json_decode($value, true);
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
public function getCssVariables(): string
|
||||
{
|
||||
// don't decode from json
|
||||
$values = $this->attributes['values'] ?? '';
|
||||
$values = preg_replace('/"/', '', $values);
|
||||
$values = preg_replace('/\\\/', '', $values);
|
||||
$values = preg_replace('/[{}]/', '', $values);
|
||||
$values = preg_replace('/, ?--/', ';--', $values);
|
||||
if ($family = $this->getFontFamily()) {
|
||||
$values .= ";--be-font-family: $family";
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
|
||||
public function getFontFamily(): string|null
|
||||
{
|
||||
return $this->font['family'] ?? null;
|
||||
}
|
||||
|
||||
public function isGoogleFont(): bool
|
||||
{
|
||||
return $this->font['google'] ?? false;
|
||||
}
|
||||
|
||||
public function getHtmlThemeColor()
|
||||
{
|
||||
if ($this->is_dark) {
|
||||
return $this->values['--be-background-alt'];
|
||||
} else {
|
||||
return $this->values['--be-primary'];
|
||||
}
|
||||
}
|
||||
}
|
||||
76
common/Admin/Appearance/Themes/CssThemeController.php
Executable file
76
common/Admin/Appearance/Themes/CssThemeController.php
Executable file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Admin\Appearance\Themes;
|
||||
|
||||
use Common\Core\BaseController;
|
||||
use Common\Database\Datasource\Datasource;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CssThemeController extends BaseController
|
||||
{
|
||||
/**
|
||||
* @var CssTheme
|
||||
*/
|
||||
private $cssTheme;
|
||||
|
||||
/**
|
||||
* @var Request
|
||||
*/
|
||||
private $request;
|
||||
|
||||
public function __construct(CssTheme $cssTheme, Request $request)
|
||||
{
|
||||
$this->cssTheme = $cssTheme;
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$userId = $this->request->get('userId');
|
||||
$this->authorize('index', [CssTheme::class, $userId]);
|
||||
|
||||
$builder = $this->cssTheme->newQuery();
|
||||
if ($userId) {
|
||||
$builder->where('user_id', $userId);
|
||||
}
|
||||
|
||||
$dataSource = new Datasource($this->cssTheme, $this->request->all());
|
||||
$pagination = $dataSource->paginate();
|
||||
|
||||
return $this->success(['pagination' => $pagination]);
|
||||
}
|
||||
|
||||
public function show(CssTheme $cssTheme)
|
||||
{
|
||||
$this->authorize('show', $cssTheme);
|
||||
|
||||
return $this->success(['theme' => $cssTheme]);
|
||||
}
|
||||
|
||||
public function store(CrupdateCssThemeRequest $request)
|
||||
{
|
||||
$this->authorize('store', CssTheme::class);
|
||||
|
||||
$cssTheme = app(CrupdateCssTheme::class)->execute($request->all());
|
||||
|
||||
return $this->success(['theme' => $cssTheme]);
|
||||
}
|
||||
|
||||
public function update(CssTheme $cssTheme, CrupdateCssThemeRequest $request)
|
||||
{
|
||||
$this->authorize('store', $cssTheme);
|
||||
|
||||
$cssTheme = app(CrupdateCssTheme::class)->execute($request->all(), $cssTheme);
|
||||
|
||||
return $this->success(['theme' => $cssTheme]);
|
||||
}
|
||||
|
||||
public function destroy(CssTheme $cssTheme)
|
||||
{
|
||||
$this->authorize('destroy', $cssTheme);
|
||||
|
||||
$cssTheme->delete();
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
46
common/Admin/Appearance/Themes/CssThemePolicy.php
Executable file
46
common/Admin/Appearance/Themes/CssThemePolicy.php
Executable file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Admin\Appearance\Themes;
|
||||
|
||||
use Common\Auth\BaseUser;
|
||||
use Common\Core\Policies\BasePolicy;
|
||||
|
||||
class CssThemePolicy extends BasePolicy
|
||||
{
|
||||
public function index(BaseUser $user, $userId = null)
|
||||
{
|
||||
return $user->hasPermission('cssTheme.view') || $user->id === (int) $userId;
|
||||
}
|
||||
|
||||
public function show(BaseUser $user, CssTheme $cssTheme)
|
||||
{
|
||||
return $user->hasPermission('cssTheme.view') || $cssTheme->user_id === $user->id;
|
||||
}
|
||||
|
||||
public function store(BaseUser $user)
|
||||
{
|
||||
return $user->hasPermission('cssTheme.create');
|
||||
}
|
||||
|
||||
public function update(BaseUser $user, CssTheme $cssTheme)
|
||||
{
|
||||
return $user->hasPermission('cssTheme.update') || $cssTheme->user_id === $user->id;
|
||||
}
|
||||
|
||||
public function destroy(BaseUser $user, CssTheme $theme)
|
||||
{
|
||||
if ($theme->default_dark && app(CssTheme::class)->where('default_dark', true)->count() < 2) {
|
||||
return $this->deny("Default dark theme can't be deleted");
|
||||
}
|
||||
|
||||
if ($theme->default_light && app(CssTheme::class)->where('default_light', true)->count() < 2) {
|
||||
return $this->deny("Default light theme can't be deleted");
|
||||
}
|
||||
|
||||
if (app(CssTheme::class)->count() <= 1) {
|
||||
return $this->deny("All themes can't be deleted");
|
||||
}
|
||||
|
||||
return $user->hasPermission('cssTheme.delete') || $theme->user_id === $user->id;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user