¨4.0.1¨

This commit is contained in:
¨NW¨
2023-12-03 14:07:47 +00:00
parent c08b36d1b6
commit f35052522d
1112 changed files with 43019 additions and 24987 deletions

View File

@@ -23,6 +23,7 @@ class MenuItemTabs extends Tabs
->add($this->image());
}
private function general()
{
return tap(new Tab('general', trans('menu::menu_items.tabs.general')), function (Tab $tab) {
@@ -36,18 +37,21 @@ class MenuItemTabs extends Tabs
});
}
private function categories()
{
return Category::where('parent_id', null)->get()->sortBy('name')->pluck('name', 'id')
->prepend(trans('menu::menu_items.form.select_category'), '');
}
private function pages()
{
return Page::all()->sortBy('name')->pluck('name', 'id')
->prepend(trans('menu::menu_items.form.select_page'), '');
}
private function parentMenuItems()
{
$parentMenuItems = ['' => trans('menu::menu_items.form.select_parent')];
@@ -55,10 +59,11 @@ class MenuItemTabs extends Tabs
return $parentMenuItems += MenuItem::parents(request('menuId'), request('id'));
}
private function image()
{
return tap(new Tab('image', trans('menu::menu_items.tabs.image')), function (Tab $tab) {
if (! auth()->user()->hasAccess('admin.media.index')) {
if (!auth()->user()->hasAccess('admin.media.index')) {
return;
}

View File

@@ -20,6 +20,7 @@ class CreateMenusTable extends Migration
});
}
/**
* Reverse the migrations.
*

View File

@@ -24,6 +24,7 @@ class CreateMenuTranslationsTable extends Migration
});
}
/**
* Reverse the migrations.
*

View File

@@ -35,6 +35,7 @@ class CreateMenuitemsTable extends Migration
});
}
/**
* Reverse the migrations.
*

View File

@@ -24,6 +24,7 @@ class CreateMenuitemTranslationTable extends Migration
});
}
/**
* Reverse the migrations.
*

View File

@@ -18,6 +18,7 @@ class AddIconColumnToMenuItemsTable extends Migration
});
}
/**
* Reverse the migrations.
*

View File

@@ -3,6 +3,7 @@
namespace Modules\Menu\Entities;
use Modules\Admin\Ui\AdminTable;
use Illuminate\Http\JsonResponse;
use Modules\Support\Eloquent\Model;
use Modules\Support\Eloquent\Translatable;
@@ -40,15 +41,6 @@ class Menu extends Model
*/
protected $translatedAttributes = ['name'];
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
static::addActiveGlobalScope();
}
public static function for($menuId)
{
@@ -60,15 +52,28 @@ class Menu extends Model
->nest();
}
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
static::addActiveGlobalScope();
}
public function menuItems()
{
return $this->hasMany(MenuItem::class)->orderByRaw('-position DESC');
}
/**
* Get table data for the resource
*
* @return \Illuminate\Http\JsonResponse
* @return JsonResponse
*/
public function table()
{

View File

@@ -66,6 +66,43 @@ class MenuItem extends Model
*/
protected $translatedAttributes = ['name'];
/**
* Get the root menu item for the given menu id.
*
* @param int $menuId
*
* @return $this
*/
public static function root($menuId)
{
return static::withoutGlobalScope('not_root')
->where('menu_id', $menuId)
->firstOrFail();
}
/**
* Get the parents of the given menuId.
*
* @param int $menuId
* @param int $menuItemId
*
* @return array
*/
public static function parents($menuId, $menuItemId)
{
return static::withoutGlobalScope('active')
->where('id', '!=', $menuItemId)
->where('menu_id', $menuId)
->get()
->noCleaning()
->nest()
->setIndent('¦–– ')
->listsFlattened('name');
}
/**
* Perform any actions required after the model boots.
*
@@ -80,30 +117,36 @@ class MenuItem extends Model
static::addActiveGlobalScope();
}
public function menu()
{
return $this->belongsTo(Menu::class);
}
public function children()
{
return $this->hasMany(MenuItem::class, 'parent_id');
}
public function category()
{
return $this->belongsTo(Category::class);
}
public function page()
{
return $this->belongsTo(Page::class);
}
/**
* Set the menu item's page id.
*
* @param int $pageId
*
* @return void
*/
public function setPageIdAttribute($pageId)
@@ -111,10 +154,12 @@ class MenuItem extends Model
$this->attributes['page_id'] = $pageId;
}
/**
* Set the menu item's parent id.
*
* @param int $parentId
*
* @return void
*/
public function setParentIdAttribute($parentId)
@@ -122,16 +167,18 @@ class MenuItem extends Model
$this->attributes['parent_id'] = $parentId;
}
/**
* Get the menu item's background image.
*
* @return \Modules\Media\Entities\File
* @return File
*/
public function getBackgroundImageAttribute()
{
return $this->files->where('pivot.zone', 'background_image')->first() ?: new File;
}
/**
* Determine if the menu item has any children.
*
@@ -142,25 +189,6 @@ class MenuItem extends Model
return $this->items->isNotEmpty();
}
/**
* Determine if the menu item type is category.
*
* @return bool
*/
public function isCategoryType()
{
return $this->type === 'category';
}
/**
* Determine if the menu item type is page.
*
* @return bool
*/
public function isPageType()
{
return $this->type === 'page';
}
/**
* Determine if the menu item type is url.
@@ -172,6 +200,7 @@ class MenuItem extends Model
return $this->type === 'url';
}
/**
* Returns the public url for the menu item.
*
@@ -198,35 +227,25 @@ class MenuItem extends Model
return localized_url(locale(), $this->getAttributeFromArray('url'));
}
/**
* Get the root menu item for the given menu id.
*
* @param int $menuId
* @return $this
*/
public static function root($menuId)
{
return static::withoutGlobalScope('not_root')
->where('menu_id', $menuId)
->firstOrFail();
}
/**
* Get the parents of the given menuId.
* Determine if the menu item type is category.
*
* @param int $menuId
* @param int $menuItemId
* @return array
* @return bool
*/
public static function parents($menuId, $menuItemId)
public function isCategoryType()
{
return static::withoutGlobalScope('active')
->where('id', '!=', $menuItemId)
->where('menu_id', $menuId)
->get()
->noCleaning()
->nest()
->setIndent('¦–– ')
->listsFlattened('name');
return $this->type === 'category';
}
/**
* Determine if the menu item type is page.
*
* @return bool
*/
public function isPageType()
{
return $this->type === 'page';
}
}

View File

@@ -10,7 +10,8 @@ class CreateRootMenuItem
/**
* Handle the event.
*
* @param \Modules\Menu\Entities\Menu $menu
* @param Menu $menu
*
* @return void
*/
public function handle(Menu $menu)

View File

@@ -2,6 +2,7 @@
namespace Modules\Menu\Http\Controllers\Admin;
use Illuminate\Http\Response;
use Modules\Menu\Entities\Menu;
use Modules\Admin\Traits\HasCrudActions;
use Modules\Menu\Http\Requests\SaveMenuRequest;
@@ -38,22 +39,13 @@ class MenuController
*/
protected $validation = SaveMenuRequest::class;
/**
* Redirect to url after saving a resource.
*
* @param \Modules\Menu\Entities\Menu $menu
* @return \Illuminate\Http\Response
*/
protected function redirectTo($menu)
{
return redirect()->route('admin.menus.edit', $menu);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*
* @return Response
*/
public function edit($id)
{
@@ -67,4 +59,17 @@ class MenuController
return view('menu::admin.menus.edit', compact('menu', 'menuItems'));
}
/**
* Redirect to url after saving a resource.
*
* @param Menu $menu
*
* @return Response
*/
protected function redirectTo($menu)
{
return redirect()->route('admin.menus.edit', $menu);
}
}

View File

@@ -2,18 +2,39 @@
namespace Modules\Menu\Http\Controllers\Admin;
use Modules\Menu\Entities\Menu;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Modules\Menu\Entities\MenuItem;
use Modules\Admin\Ui\Facades\TabManager;
use Modules\Menu\Http\Requests\SaveMenuItemRequest;
class MenuItemController
{
/**
* Store a newly created resource in storage.
*
* @param int $menuId
* @param Request $request
*
* @return Response
*/
public function store($menuId, SaveMenuItemRequest $request)
{
$menuItem = MenuItem::create(
$this->prepare($menuId, $request->all())
);
return redirect()->route('admin.menus.edit', $menuId)
->withSuccess(trans('admin::messages.resource_created', ['resource' => trans('menu::menu_items.menu_item')]));
}
/**
* Show the form for creating a new resource.
*
* @param int $menuId
* @return \Illuminate\Http\Response
*
* @return Response
*/
public function create($menuId)
{
@@ -23,29 +44,14 @@ class MenuItemController
return view('menu::admin.menu_items.create', compact('menuId', 'menuItem', 'tabs'));
}
/**
* Store a newly created resource in storage.
*
* @param int $menuId
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store($menuId, SaveMenuItemRequest $request)
{
$menuItem = MenuItem::create(
$this->prepare($menuId, $request->all())
);
return redirect()->route('admin.menus.edit', $menuId)
->withSuccess(trans('admin::messages.resource_saved', ['resource' => trans('menu::menu_items.menu_item')]));
}
/**
* Show the form for editing the specified resource.
*
* @param int $menuId
* @param int $id
* @return \Illuminate\Http\Response
*
* @return Response
*/
public function edit($menuId, $id)
{
@@ -55,13 +61,15 @@ class MenuItemController
return view('menu::admin.menu_items.edit', compact('menuId', 'menuItem', 'tabs'));
}
/**
* Update the specified resource in storage.
*
* @param int $menuId
* @param int $id
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
* @param Request $request
*
* @return Response
*/
public function update($menuId, $id, SaveMenuItemRequest $request)
{
@@ -72,13 +80,15 @@ class MenuItemController
);
return redirect()->route('admin.menus.edit', $menuId)
->withSuccess(trans('admin::messages.resource_saved', ['resource' => trans('menu::menu_items.menu_item')]));
->withSuccess(trans('admin::messages.resource_updated', ['resource' => trans('menu::menu_items.menu_item')]));
}
/**
* Remove the specified resource from storage.
*
* @param int $id
*
* @return void
*/
public function destroy($id)
@@ -86,11 +96,13 @@ class MenuItemController
MenuItem::withoutGlobalScope('active')->findOrFail($id)->delete();
}
/**
* Prepare menu item attributes for saving.
*
* @param int $menuId
* @param array $attributes
*
* @return array
*/
private function prepare($menuId, array $attributes)
@@ -102,10 +114,12 @@ class MenuItemController
return array_merge($attributes, ['menu_id' => $menuId]);
}
/**
* Get parent id for the given menu id.
*
* @param string string
*
* @return int
*/
private function parentId($menuId)

View File

@@ -9,7 +9,8 @@ class MenuItemOrderController
/**
* Update the specified resource in storage.
*
* @param \Modules\Menu\Services\MenuItemOrdener $ordener
* @param MenuItemOrdener $ordener
*
* @return void
*/
public function update(MenuItemOrdener $ordener)

View File

@@ -14,6 +14,7 @@ class SaveMenuItemRequest extends Request
*/
protected $availableAttributes = 'menu::attributes';
/**
* Get the validation rules that apply to the request.
*

View File

@@ -13,6 +13,7 @@ class SaveMenuRequest extends Request
*/
protected $availableAttributes = 'menu::attributes';
/**
* Get the validation rules that apply to the request.
*

View File

@@ -9,11 +9,13 @@ class MegaMenu
{
private $menuId;
public function __construct($menuId)
{
$this->menuId = $menuId;
}
public function menus()
{
return Cache::tags(['mega_menu', 'menu_items', 'pages', 'categories'])
@@ -24,6 +26,7 @@ class MegaMenu
});
}
private function getMenus()
{
return MenuModel::for($this->menuId)->where('menu_id', $this->menuId);

View File

@@ -9,59 +9,70 @@ class Menu
private $menu;
private $subMenus;
public function __construct($menu)
{
$this->menu = $menu;
}
public function isFluid()
{
return $this->menu->is_fluid;
}
public function url()
{
return $this->menu->url();
}
public function hasIcon()
{
return ! is_null($this->icon());
return !is_null($this->icon());
}
public function icon()
{
return $this->menu->icon;
}
public function hasBackgroundImage()
{
return ! is_null($this->backgroundImage());
return !is_null($this->backgroundImage());
}
public function backgroundImage()
{
return $this->menu->background_image->path;
}
public function target()
{
return $this->menu->target;
}
public function name()
{
return $this->menu->name;
}
public function hasSubMenus()
{
return $this->subMenus()->isNotEmpty();
}
public function subMenus()
{
if (! is_null($this->subMenus)) {
if (!is_null($this->subMenus)) {
return $this->subMenus;
}
@@ -70,6 +81,7 @@ class Menu
});
}
private function getSubMenus()
{
if ($this->menu->isCategoryType()) {
@@ -79,6 +91,7 @@ class Menu
return $this->menu->items ?? collect();
}
private function getCategorySubMenus()
{
return Category::tree()

View File

@@ -9,16 +9,19 @@ class SubMenu
private $subMenu;
private $subMenuItems;
public function __construct($subMenu)
{
$this->subMenu = $subMenu;
}
public function url()
{
return $this->subMenu->url();
}
public function target()
{
if ($this->subMenu instanceof Category) {
@@ -28,19 +31,22 @@ class SubMenu
return $this->subMenu->target;
}
public function name()
{
return $this->subMenu->name;
}
public function hasItems()
{
return $this->items()->isNotEmpty();
}
public function items()
{
if (! is_null($this->subMenuItems)) {
if (!is_null($this->subMenuItems)) {
return $this->subMenuItems;
}

View File

@@ -3,14 +3,11 @@
namespace Modules\Menu\Providers;
use Modules\Menu\Admin\MenuItemTabs;
use Modules\Support\Traits\AddsAsset;
use Illuminate\Support\ServiceProvider;
use Modules\Admin\Ui\Facades\TabManager;
class MenuServiceProvider extends ServiceProvider
{
use AddsAsset;
/**
* Bootstrap any application services.
*
@@ -19,8 +16,5 @@ class MenuServiceProvider extends ServiceProvider
public function boot()
{
TabManager::register('menu_items', MenuItemTabs::class);
$this->addAdminAssets('admin.menus.(create|edit)', ['admin.menu.css', 'admin.menu.js']);
$this->addAdminAssets('admin.menus.items.(create|edit)', ['admin.media.css', 'admin.media.js', 'admin.menu.js']);
}
}

View File

@@ -86,7 +86,7 @@
.dd-handle-root,
.dd-handle {
font-family: "Roboto", sans-serif;
font-family: "Inter", sans-serif;
font-weight: 400;
font-size: 15px;
display: block;
@@ -135,7 +135,7 @@
.dd-item-root > button:before,
.dd-item > button:before {
content: '+';
content: "+";
display: block;
position: absolute;
width: 100%;
@@ -147,7 +147,7 @@
.dd-item-root > button[data-action="collapse"]:before,
.dd-item > button[data-action="collapse"]:before {
content: '-';
content: "-";
font-size: 20px;
line-height: 9px;
}
@@ -167,9 +167,42 @@
border: 1px dashed #bbb;
min-height: 100px;
background-color: #e5e5e5;
background-image: -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
background-image: -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
background-image: linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
background-image: -webkit-linear-gradient(
45deg,
#ffffff 25%,
transparent 25%,
transparent 75%,
#ffffff 75%,
#ffffff
),
-webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent
75%, #ffffff 75%, #ffffff);
background-image: -moz-linear-gradient(
45deg,
#ffffff 25%,
transparent 25%,
transparent 75%,
#ffffff 75%,
#ffffff
),
-moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent
75%, #ffffff 75%, #ffffff);
background-image: linear-gradient(
45deg,
#ffffff 25%,
transparent 25%,
transparent 75%,
#ffffff 75%,
#ffffff
),
linear-gradient(
45deg,
#ffffff 25%,
transparent 25%,
transparent 75%,
#ffffff 75%,
#ffffff
);
background-size: 60px 60px;
background-position: 0 0, 30px 30px;
}

View File

@@ -7,7 +7,7 @@ return [
'name' => 'Name',
],
'form' => [
'please_save_the_menu_first' => 'Please save the menu first to add menu items.',
'please_save_the_menu_first' => 'Please save the menu first to add menu items',
'enable_the_menu' => 'Enable the menu',
],
];

View File

@@ -1,6 +1,6 @@
<?php
return [
'menu_item_deleted' => 'Menu item has been deleted.',
'menu_items_order_updated' => 'Menu items order has been updated.',
'menu_item_deleted' => 'Menu item has been deleted',
'menu_items_order_updated' => 'Menu items order has been updated',
];

View File

@@ -17,3 +17,12 @@
@endsection
@include('menu::admin.menu_items.partials.shortcuts')
@push('globals')
@vite([
'Modules/Menu/Resources/assets/admin/sass/main.scss',
'Modules/Menu/Resources/assets/admin/js/main.js',
'Modules/Media/Resources/assets/admin/sass/main.scss',
'Modules/Media/Resources/assets/admin/js/main.js'
])
@endpush

View File

@@ -18,3 +18,12 @@
@endsection
@include('menu::admin.menu_items.partials.shortcuts')
@push('globals')
@vite([
'Modules/Menu/Resources/assets/admin/sass/main.scss',
'Modules/Menu/Resources/assets/admin/js/main.js',
'Modules/Media/Resources/assets/admin/sass/main.scss',
'Modules/Media/Resources/assets/admin/js/main.js'
])
@endpush

View File

@@ -6,7 +6,7 @@
@endpush
@push('scripts')
<script>
<script type="module">
keypressAction([
{ key: 'b', route: "{{ route('admin.menus.edit', $menuId) }}" },
]);

View File

@@ -17,11 +17,16 @@
</form>
@endsection
@include('menu::admin.menus.partials.shortcuts')
@push('globals')
<script>
FleetCart.langs['menu::messages.menu_item_deleted'] = '{{ trans('menu::messages.menu_item_deleted') }}';
FleetCart.langs['menu::messages.menu_items_order_updated'] = '{{ trans('menu::messages.menu_items_order_updated') }}';
</script>
@endpush
@include('menu::admin.menus.partials.shortcuts')
@vite([
'Modules/Menu/Resources/assets/admin/sass/main.scss',
'Modules/Menu/Resources/assets/admin/js/main.js'
])
@endpush

View File

@@ -31,7 +31,7 @@
@endpush
@push('scripts')
<script>
<script type="module">
keypressAction([
{ key: 'c', route: "{{ route('admin.menus.create') }}" },
]);

View File

@@ -13,7 +13,7 @@
@endpush
@push('scripts')
<script>
<script type="module">
keypressAction([
@isset($menu)
{ key: 'c', route: "{{ route('admin.menus.items.create', $menu) }}" },

View File

@@ -8,6 +8,12 @@ Route::get('menus', [
'middleware' => 'can:admin.menus.index',
]);
Route::get('menus/index/table', [
'as' => 'admin.menus.table',
'uses' => 'MenuController@table',
'middleware' => 'can:admin.menus.index',
]);
Route::get('menus/create', [
'as' => 'admin.menus.create',
'uses' => 'MenuController@create',

View File

@@ -10,6 +10,7 @@ class MenuItemOrdener
* Order the menu items.
*
* @param array $rootItem
*
* @return void
*/
public function order(array $rootItem)
@@ -17,11 +18,13 @@ class MenuItemOrdener
$this->orderChildren($rootItem['id'], $rootItem['children']);
}
/**
* Order child menu items recursively.
*
* @param int $parentId
* @param array $childItems
*
* @return void
*/
private function orderChildren($parentId, array $childItems)