Files
2024-02-12 22:54:20 -05:00

702 lines
27 KiB
PHP

<?php
namespace Modules\MenuPlus\Http\Controllers;
use App\Traits\GenerateSlug;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Menu\Entities\Menu;
use Modules\Menu\Entities\MenuColumn;
use Modules\Menu\Entities\MenuElement;
use Modules\Menu\Repositories\MenuRepository;
use Modules\Menu\Services\MenuService;
use Modules\MenuPlus\Entities\Meta;
use Modules\MenuPlus\Repositories\MetaRepository;
use Modules\MenuPlus\Services\AugmentationService;
use Modules\PageBuilder\Repositories\PageBuilderRepository;
use Modules\Product\Entities\Category;
use Modules\Product\Repositories\CategoryRepository;
use Modules\Product\Repositories\ProductRepository;
use Modules\RolePermission\Entities\Role;
use Modules\RolePermission\Repositories\RoleRepository;
class MenuPlusController extends Controller
{
use GenerateSlug;
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index()
{
new AugmentationService();
return view('menuplus::index');
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('menuplus::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('menuplus::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('menuplus::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function allMenus(Request $request) {
if (isModuleActive('Menu')) {
//$repository = new MenuRepository();
//$menus = $repository->getAll();
//$menus = Menu::with('elements', 'elements.page', 'elements.category', 'elements.product', 'elements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product')->orderBy('order_by')->get();
$menus = Menu::with('allElements', 'allElements.page', 'allElements.gjspage', 'allElements.category', 'allElements.product', 'allElements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product')->orderBy('order_by')->get();
foreach ($menus as $menu) {
foreach ($menu->allElements as $element) {
$depth = $this->getElementDepth($element);
$element['depth'] = $depth;
}
}
return response()->json([
'menus' => $menus
]);
}
return response()->json([
'message' => 'Menu module not enabled.'
], 400);
}
private function getElementDepth($element, $depth = 0) {
if ($element->parent_id != null) {
$parent = MenuElement::find($element->parent_id);
if ($parent) {
$depth = $this->getElementDepth($parent, ++$depth);
}
}
return $depth;
}
public function allPages(Request $request) {
if (isModuleActive('PageBuilder')) {
$all_pages = [];
$menuService = new MenuService(new MenuRepository);
$pages = $menuService->getPages();
$native_pages = $pages->toArray();
for ($i = 0; $i < count($native_pages); $i++) {
$native_pages[$i]['_type'] = 'native';
}
$all_pages = array_merge($all_pages, $native_pages);
if (isModuleActive('PageBuilderPlus')) {
$gjspages = \Modules\PageBuilderPlus\Entities\GJSPage::orderBy('title')->get()->toArray();
for ($i = 0; $i < count($gjspages); $i++) {
$gjspages[$i]['_type'] = 'gjs';
}
$all_pages = array_merge($all_pages, $gjspages);
}
return response()->json([
'pages' => $all_pages
]);
}
return response()->json([
'message' => 'PageBuilder module not enabled.'
], 400);
}
public function allCategories(Request $request) {
if (isModuleActive('Product')) {
$repository = new CategoryRepository(new Category);
$categories = $repository->getAll();
return response()->json([
'categories' => $categories
]);
}
return response()->json([
'message' => 'Product module not enabled.'
], 400);
}
public function allProducts(Request $request) {
if (isModuleActive('Product')) {
$repository = new ProductRepository();
$products = $repository->getProduct()->get();
return response()->json([
'products' => $products
]);
}
return response()->json([
'message' => 'Product module not enabled.'
], 400);
}
public function allRoles(Request $request) {
if (isModuleActive('RolePermission')) {
//$repository = new RoleRepository();
//$roles = $repository->all();
$roles = Role::where('type', '!=','superadmin')->get();
return response()->json([
'roles' => $roles
]);
}
return response()->json([
'message' => 'RolePermission module not enabled.'
], 400);
}
public function storeMenu(Request $request) {
if (isModuleActive('Menu')) {
$data = $request->except('_token');
if (isset($data['name']) && $data['name'] != null) {
$data['slug'] = $this->productSlug($data['name']);
$menu = new Menu();
$menu->fill($data)->save();
if (isset($data['items'])) {
$menu_elements = [];
$menu_element = null;
$items = $data['items'];
foreach ($items as $key => $item) {
$item['menu_id'] = $menu->id;
$item['title'] = $item['label'];
$item['position'] = 100000 + $key;
if ($item['type'] == 'column') {
$item['column'] = $item['label'];
$cmenu = new MenuColumn();
$cmenu->fill($item);
$cmenu->save();
$citems = $item['items'];
foreach ($citems as $key => $citem) {
$citem['menu_id'] = $menu->id;
$citem['column_id'] = $cmenu->id;
$citem['title'] = $citem['label'];
$citem['position'] = 100000 + $key;
if (in_array($citem['type'], ['page', 'category', 'product'])) {
$citem['link'] = null;
$citem['element_id'] = [$citem['elementId']];
}
$this->addElement($citem);
}
}
else {
$item['column_id'] = null;
if (in_array($item['type'], ['page', 'gjspage', 'category', 'product'])) {
$item['link'] = null;
$item['element_id'] = [$item['elementId']];
}
$menu_element = $this->addElement($item);
$menu_element['depth'] = $item['depth'];
$menu_elements[] = $menu_element;
}
}
for ($i = 0; $i < count($menu_elements); $i++) {
$menu_element = $menu_elements[$i];
if ($menu_element['depth'] > 0) {
$parent_depth = $menu_element['depth'] - 1;
for ($j = $i; $j >= 0; $j--) {
if ($menu_elements[$j]['depth'] == $parent_depth) {
$element = MenuElement::find($menu_element->id);
if ($element) {
$element->parent_id = $menu_elements[$j]->id;
$element->update();
break;
}
}
}
}
}
}
//$menu->load(['elements', 'elements.page', 'elements.category', 'elements.product', 'elements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']);
$menu->load(['allElements', 'allElements.page', 'allElements.category', 'allElements.product', 'allElements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']);
foreach ($menu->allElements as $element) {
$depth = $this->getElementDepth($element);
$element['depth'] = $depth;
}
return response()->json([
'menu' => $menu,
'message' => 'New menu has been successfully created.'
]);
}
else {
return response()->json([
'message' => 'Please enter the menu name.'
], 400);
}
}
return response()->json([
'message' => 'Menu module not enabled.'
], 400);
}
public function updateMenu(Request $request) {
if (isModuleActive('Menu')) {
$data = $request->except('_token');
$data['slug'] = $this->productSlug($data['name']);
$menu = Menu::find($data['id']);
$menu->fill($data)->update();
if (isset($data['items'])) {
$menu_elements = [];
$menu_element = null;
$items = $data['items'];
if ($menu->menu_type == 'mega_menu') {
$elements = $menu->columns;
}
else {
$elements = $menu->elements;
}
foreach ($elements as $element) {
$discard = true;
foreach ($items as $item) {
if (isset($item['id'])) {
if ($item['id'] == $element->id) {
$discard = false;
break;
}
}
}
if ($discard) {
if ($menu->menu_type == 'mega_menu') {
$celements = $element->elements;
foreach ($celements as $celement) {
$metas = $celement->metas->pluck('id');
Meta::destroy($metas);
}
MenuElement::where('column_id', $element->id)->delete();
}
else {
$metas = $element->metas->pluck('id');
Meta::destroy($metas);
}
$element->delete();
}
}
foreach ($items as $key => $item) {
if ($item['type'] == 'column') {
$item['column'] = $item['label'];
if (isset($item['id'])) {
$cmenu = MenuColumn::find($item['id']);
if ($cmenu) {
$cmenu->fill($item);
$cmenu->update();
$elements = $cmenu->elements;
}
}
else {
$item['menu_id'] = $menu->id;
$item['position'] = 100000 + $key;
$cmenu = new MenuColumn();
$cmenu->fill($item);
$cmenu->save();
}
if ($cmenu) {
$citems = $item['items'];
if ($elements) {
foreach ($elements as $element) {
$discard = true;
foreach ($citems as $citem) {
if (isset($citem['id'])) {
if ($citem['id'] == $element->id) {
$discard = false;
break;
}
}
}
if ($discard) {
$metas = $element->metas->pluck('id');
Meta::destroy($metas);
$element->delete();
}
}
}
foreach ($citems as $key => $citem) {
$citem['menu_id'] = $menu->id;
$citem['column_id'] = $cmenu->id;
$citem['title'] = $citem['label'];
$citem['position'] = 100000 + $key;
if (in_array($citem['type'], ['page', 'category', 'product'])) {
$citem['link'] = null;
$citem['element_id'] = [$citem['elementId']];
}
if (isset($citem['id'])) {
$this->editElement($citem);
}
else {
$this->addElement($citem);
}
}
}
}
else {
$item['menu_id'] = $menu->id;
$item['title'] = $item['label'];
$item['position'] = 100000 + $key;
if (in_array($item['type'], ['page', 'gjspage', 'category', 'product'])) {
$item['link'] = null;
$item['element_id'] = [$item['elementId']];
}
if (isset($item['id'])) {
$menu_element = $this->editElement($item);
$menu_element['depth'] = $item['depth'];
$menu_elements[] = $menu_element;
}
else {
$menu_element = $this->addElement($item);
$menu_element['depth'] = $item['depth'];
$menu_elements[] = $menu_element;
}
}
}
for ($i = 0; $i < count($menu_elements); $i++) {
$menu_element = $menu_elements[$i];
if ($menu_element['depth'] > 0) {
$parent_depth = $menu_element['depth'] - 1;
for ($j = $i; $j >= 0; $j--) {
if ($menu_elements[$j]['depth'] == $parent_depth) {
$element = MenuElement::find($menu_element->id);
if ($element) {
$element->parent_id = $menu_elements[$j]->id;
$element->update();
break;
}
}
}
}
else {
$element = MenuElement::find($menu_element->id);
if ($element) {
$element->parent_id = null;
$element->update();
}
}
}
}
//$menu->load(['elements', 'elements.page', 'elements.category', 'elements.product', 'elements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']);
$menu->load(['allElements', 'allElements.page', 'allElements.category', 'allElements.product', 'allElements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']);
foreach ($menu->allElements as $element) {
$depth = $this->getElementDepth($element);
$element['depth'] = $depth;
}
return response()->json([
'menu' => $menu,
'message' => 'Menu has been successfully updated.'
]);
}
return response()->json([
'message' => 'Menu module not enabled.'
], 400);
}
public function destroyMenu(Request $request) {
if (isModuleActive('Menu')) {
$menu = Menu::where('id', $request->id)->first();
if(count($menu->allElements) > 0){
$elements = $menu->allElements;
foreach ($elements as $element) {
$metas = $element->metas->pluck('id');
Meta::destroy($metas);
}
}
$repository = new MenuRepository();
$result = $repository->deleteById($request->id);
if ($result == 'not_possible') {
return response()->json([
'message' => 'Unable to delete menu.'
], 400);
}
return response()->json([
'message' => 'Menu has been successfully deleted.'
]);
}
return response()->json([
'message' => 'Menu module not enabled.'
], 400);
}
public function setActiveMenu(Request $request) {
if (isModuleActive('Menu')) {
Menu::where('menu_position', $request->menu_position)->update(['status' => 0]);
$menu = Menu::find($request->id);
if ($menu) {
$menu->status = 1;
$menu->update();
}
return response()->json([
'message' => 'Menu has been successfully set active.'
]);
}
return response()->json([
'message' => 'Menu module not enabled.'
]);
}
public function addElement($item) {
if ($item['type'] != 'link' && $item['type'] != 'function') {
foreach($item['element_id'] as $element_id){
$icon = isset($item['icon']) ? $item['icon']['tags'][0] : null;
$requestData = [
'menu_id' => $item['menu_id'],
'column_id' => isset($item['column_id']) ? $item['column_id'] : null,
'type' => $item['type'],
'element_id' => $element_id,
'title' => $item['title'],
'position' => $item['position'],
'hash' => isset($item['hash']) ? $item['hash'] : null,
'class' => isset($item['class']) ? $item['class'] : null,
'audience' => isset($item['audience']) ? $item['audience'] : null,
'roles' => isset($item['roles']) && count($item['roles']) > 0 ? implode(',', $item['roles']) : null,
'icon' => $icon,
'normal_text_color' => isset($item['normalTextColor']) ? $item['normalTextColor'] : null,
'hover_text_color' => isset($item['hoverTextColor']) ? $item['hoverTextColor'] : null
];
return $this->saveElement($requestData);
}
}
elseif ($item['type'] == 'function') {
$requestData = [
'menu_id' => $item['menu_id'],
'type' => $item['type'],
'element_id' => $item['element_id'],
'title' => $item['title'],
'position' => $item['position']
];
return $this->saveElement($requestData);
}
else {
if (isset($item['roles']) && count($item['roles']) > 0 ) {
$item['roles'] = implode(',', $item['roles']);
}
if (isset($item['icon'])) {
$item['icon'] = $item['icon']['tags'][0];
}
if (isset($item['normalTextColor'])) {
$item['normal_text_color'] = $item['normalTextColor'];
}
if (isset($item['hoverTextColor'])) {
$item['hover_text_color'] = $item['hoverTextColor'];
}
return $this->saveElement($item);
}
}
public function editElement($item) {
if ($item['type'] != 'link' && $item['type'] != 'function') {
foreach($item['element_id'] as $element_id){
$icon = isset($item['icon']) ? $item['icon']['tags'][0] : null;
$requestData = [
'id' => $item['id'],
'menu_id' => $item['menu_id'],
'column_id' => isset($item['column_id']) ? $item['column_id'] : null,
'type' => $item['type'],
'element_id' => $element_id,
'title' => $item['title'],
'position' => $item['position'],
'hash' => isset($item['hash']) ? $item['hash'] : null,
'class' => isset($item['class']) ? $item['class'] : null,
'audience' => isset($item['audience']) ? $item['audience'] : null,
'roles' => isset($item['roles']) && count($item['roles']) > 0 ? implode(',', $item['roles']) : null,
'icon' => $icon,
'normal_text_color' => isset($item['normalTextColor']) ? $item['normalTextColor'] : null,
'hover_text_color' => isset($item['hoverTextColor']) ? $item['hoverTextColor'] : null
];
return $this->updateElement($requestData);
}
}
elseif ($item['type'] == 'function') {
$requestData = [
'id' => $item['id'],
'menu_id' => $item['menu_id'],
'type' => $item['type'],
'element_id' => $item['element_id'],
'title' => $item['title'],
'position' => $item['position']
];
return $this->updateElement($requestData);
}
else {
if (isset($item['roles']) && count($item['roles']) > 0 ) {
$item['roles'] = implode(',', $item['roles']);
}
if (isset($item['icon'])) {
$item['icon'] = $item['icon']['tags'][0];
}
if (isset($item['normalTextColor'])) {
$item['normal_text_color'] = $item['normalTextColor'];
}
if (isset($item['hoverTextColor'])) {
$item['hover_text_color'] = $item['hoverTextColor'];
}
return $this->updateElement($item);
}
}
public function saveElement($data) {
$element = new MenuElement();
$element->fill($data);
$element->save();
$repository = new MetaRepository();
if (isset($data['hash'])) {
$repository->update($element->id, 'hash', $data['hash']);
}
if (isset($data['class'])) {
$repository->update($element->id, 'class', $data['class']);
}
if (isset($data['audience'])) {
$repository->update($element->id, 'audience', $data['audience']);
}
if (isset($data['roles'])) {
$repository->update($element->id, 'roles', $data['roles']);
}
if (isset($data['icon'])) {
$repository->update($element->id, 'icon', $data['icon']);
}
if (isset($data['normal_text_color'])) {
$repository->update($element->id, 'normal_text_color', $data['normal_text_color']);
}
if (isset($data['hover_text_color'])) {
$repository->update($element->id, 'hover_text_color', $data['hover_text_color']);
}
return $element;
}
public function updateElement($data) {
$element = MenuElement::find($data['id']);
$element->fill($data);
$element->update();
$repository = new MetaRepository();
if (isset($data['hash'])) {
$repository->update($element->id, 'hash', $data['hash']);
}
if (isset($data['class'])) {
$repository->update($element->id, 'class', $data['class']);
}
if (isset($data['audience'])) {
$repository->update($element->id, 'audience', $data['audience']);
}
if (isset($data['roles'])) {
$repository->update($element->id, 'roles', $data['roles']);
}
if (isset($data['icon'])) {
$repository->update($element->id, 'icon', $data['icon']);
}
if (isset($data['normal_text_color'])) {
$repository->update($element->id, 'normal_text_color', $data['normal_text_color']);
}
if (isset($data['hover_text_color'])) {
$repository->update($element->id, 'hover_text_color', $data['hover_text_color']);
}
return $element;
}
}