281 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\View\Presenters;
 | |
| 
 | |
| use Akaunting\Menu\Presenters\Presenter;
 | |
| use Illuminate\Support\Str;
 | |
| 
 | |
| class Menu extends Presenter
 | |
| {
 | |
|     /**
 | |
|      * {@inheritdoc }.
 | |
|      */
 | |
|     public function getOpenTagWrapper()
 | |
|     {
 | |
|         return PHP_EOL . '<div class="navbar-inner">
 | |
|             <!-- Collapse -->
 | |
|             <div id="sidenav-collapse-main">
 | |
|                 <!-- Nav items -->
 | |
|                 <ul class="flex flex-col justify-center">' . PHP_EOL;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc }.
 | |
|      */
 | |
|     public function getCloseTagWrapper()
 | |
|     {
 | |
|         return PHP_EOL . '</ul>
 | |
|             </div>
 | |
|         </div>' . PHP_EOL;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc }.
 | |
|      */
 | |
|     public function getMenuWithoutDropdownWrapper($item)
 | |
|     {
 | |
|         return '<li class="group relative pb-2.5 text-sm">
 | |
|                     <a id="' . $this->getId($item) . '" class="' . $this->getClass($item) . ''. $this->getActiveState($item) . '" href="' . $item->getUrl() . '" ' . $item->getAttributes() . '>
 | |
|                         ' . $this->getIcon($item) . '
 | |
|                         ' . $item->title . '
 | |
|                         <span class="bg-purple absolute h-5 -right-5 rounded-tl-lg rounded-bl-lg opacity-0 group-hover:opacity-100 transition-all pointer-events-none" style="width: 5px;"></span>
 | |
|                     </a>
 | |
|                 </li>'
 | |
|                 . PHP_EOL;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc }.
 | |
|      */
 | |
|     public function getActiveState($item, $state = ' font-semibold')
 | |
|     {
 | |
|         return $item->isActive() ? $state : '';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get active state on child items.
 | |
|      *
 | |
|      * @param $item
 | |
|      * @param string $state
 | |
|      *
 | |
|      * @return null|string
 | |
|      */
 | |
|     public function getActiveStateOnChild($item, $state = 'open')
 | |
|     {
 | |
|         return $item->hasActiveOnChild() ? $state : '';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get active state on child items.
 | |
|      *
 | |
|      * @param $item
 | |
|      * @param string $state
 | |
|      *
 | |
|      * @return null|string
 | |
|      */
 | |
|     public function getShowStateOnChild($item, $state = 'open')
 | |
|     {
 | |
|         return $item->hasActiveOnChild() ? $state : ' ';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc }.
 | |
|      */
 | |
|     public function getDividerWrapper()
 | |
|     {
 | |
|         return '<hr class="my-3">';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc }.
 | |
|      */
 | |
|     public function getHeaderWrapper($item)
 | |
|     {
 | |
|         return '<h6 class="navbar-heading p-0 text-muted">' . $item->title . '</h6>';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc }.
 | |
|      */
 | |
|     public function getMenuWithDropDownWrapper($item)
 | |
|     {
 | |
|         $id = Str::slug($item->title);
 | |
| 
 | |
|         return '
 | |
|         <details ' . $this->getActiveStateOnChild($item) . '>
 | |
|             <summary class="block" href="#navbar-' . $id . '">
 | |
|                 <div class="relative pb-2.5 flex items-center cursor-pointer text-purple text-sm">
 | |
|                     ' . $this->getIcon($item) . '
 | |
|                     ' . $item->title . '
 | |
|                     ' . $this->getChevron($item) . '
 | |
|                 </div>
 | |
|             </summary>
 | |
|             <div class="mt-2 ml-8 menu__submenu" id="navbar-' . $id . '">
 | |
|                 <ul class="relative pb-2.5">
 | |
|                     ' . $this->getChildMenuItems($item) . '
 | |
|                 </ul>
 | |
|             </div>
 | |
|         </details>'
 | |
|         . PHP_EOL;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get multilevel menu wrapper.
 | |
|      *
 | |
|      * @param \Akaunting\Menu\MenuItem $item
 | |
|      *
 | |
|      * @return string`
 | |
|      */
 | |
|     public function getMultiLevelDropdownWrapper($item)
 | |
|     {
 | |
|         $id = Str::slug($item->title);
 | |
| 
 | |
|         return '<details class="relative">
 | |
|                     <summary class="' . $this->getClass($item). '" href="#navbar-' . $id . '" aria-controls="navbar-' . $id . '">
 | |
|                         <div class="pb-2.5 flex items-center cursor-pointer text-purple text-sm '. $this->getActiveState($item) .'">
 | |
|                             ' . $this->getIcon($item) . '
 | |
|                             ' . $item->title . '
 | |
|                             <span class="bg-purple absolute h-5 -right-5 rounded-tl-lg rounded-bl-lg opacity-0 group-hover:opacity-100 transition-all pointer-events-none" style="width: 5px;"></span>
 | |
|                             ' . $this->getChevron($item) . '
 | |
|                         </div>
 | |
|                     </summary>
 | |
|                     <div class="mt-2 ml-8 menu__submenu' . $this->getShowStateOnChild($item) . '" id="navbar-' . $id . '">
 | |
|                         <ul class="relative pb-2.5">
 | |
|                             ' . $this->getChildMenuItems($item) . '
 | |
|                         </ul>
 | |
|                     </div>
 | |
|                 </details>'
 | |
|         . PHP_EOL;
 | |
|     }
 | |
| 
 | |
|     public function iconState($item, $state = '')
 | |
|     {
 | |
|         return $item->isActive() ? $state : '-outlined';
 | |
|     }
 | |
| 
 | |
|     public function iconChildState($item, $state = '')
 | |
|     {
 | |
|         return $item->hasActiveOnChild() ? $state : '-outlined';
 | |
|     }
 | |
| 
 | |
|     public function getId($item)
 | |
|     {
 | |
|         $id = Str::of($item->getUrl())
 | |
|                 ->replace(url('/'), '-')
 | |
|                 ->replace('/' . company_id(), '')
 | |
|                 ->replace(['/', '?', '='], '-')
 | |
|                 ->trim('-')
 | |
|                 ->squish();
 | |
| 
 | |
|         return 'menu-' . $id;
 | |
|     }
 | |
| 
 | |
|     public function getClass($item)
 | |
|     {
 | |
|         $class = 'flex items-center text-purple';
 | |
| 
 | |
|         $attributes = $item->attributes;
 | |
| 
 | |
|         if (!empty($attributes['class'])) {
 | |
|             $class .= ' ' . $attributes['class'];
 | |
|         }
 | |
| 
 | |
|         return $class;
 | |
|     }
 | |
| 
 | |
|     public function getIcon($item)
 | |
|     {
 | |
|         if (empty($item->icon)) {
 | |
|             return '';
 | |
|         }
 | |
| 
 | |
|         $state = empty($item->getChilds()) ? $this->iconState($item) : $this->iconChildState($item);
 | |
| 
 | |
|         if (Str::startsWith($item->icon, 'simple-icons-')) {
 | |
|             $slug = Str::replace('simple-icons-', '', $item->icon);
 | |
| 
 | |
|             $path = base_path('vendor/simple-icons/simple-icons/icons/' . $slug . '.svg');
 | |
| 
 | |
|             $icon_content = file_get_contents($path);
 | |
| 
 | |
|             $style = '';
 | |
|             $styles= [];
 | |
| 
 | |
|             foreach (['width', 'height', 'stroke-width'] as $css) {
 | |
|                 if (empty($item->attributes['simple-icons-' . $css])) {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 $styles[] .= $css . ':' . $item->attributes['simple-icons-' . $css] . ';';
 | |
|             }
 | |
| 
 | |
|             if ($styles) {
 | |
|                 $style = 'style="';
 | |
|                 $style .= implode(' ', $styles);
 | |
|                 $style .= '"';
 | |
|             }
 | |
| 
 | |
|             $find_str = 'xmlns="http://www.w3.org/2000/svg"';
 | |
| 
 | |
|             $icon_content = Str::replace($find_str, $find_str . $style, $icon_content);
 | |
|         } elseif (Str::startsWith($item->icon, 'custom-')) {
 | |
|             $path = $this->getCustomIcon($item);
 | |
| 
 | |
|             $icon_content = file_get_contents($path);
 | |
|         } else {
 | |
|             $icon_content = '<span class="material-icons' . $state . ' text-purple text-2xl">' . $item->icon . '</span>';
 | |
|         }
 | |
| 
 | |
|         return '<div class="w-8 h-8 flex items-center justify-center ltr:mr-2 rtl:ml-2 pointer-events-none">
 | |
|                     ' . $icon_content . '
 | |
|                 </div>' . PHP_EOL;
 | |
|     }
 | |
| 
 | |
|     public function getChevron($item)
 | |
|     {
 | |
|         $state = $this->chevronState($item);
 | |
| 
 | |
|         return '<span class="material-icons text-purple absolute ltr:-right-1.5 rtl:-left-1.5 transform transition-all">expand' . $state . '</span>' . PHP_EOL;
 | |
|     }
 | |
| 
 | |
|     public function chevronState($item, $state = '_less')
 | |
|     {
 | |
|         return $item->hasActiveOnChild() ? $state : '_more';
 | |
|     }
 | |
| 
 | |
|     protected function getCustomIcon($item)
 | |
|     {
 | |
|         $slug = Str::replace('custom-', '', $item->icon);
 | |
| 
 | |
|         $base_path = 'public/img/icons/';
 | |
| 
 | |
|         $module_alias = '';
 | |
| 
 | |
|         if (! empty($item->properties['route'])) {
 | |
|             $route = $item->properties['route'][0];
 | |
| 
 | |
|             $module_alias = explode('.', $route)[0];
 | |
|         } elseif (! empty($item->properties['url'])) {
 | |
|             $url_paths = explode('/', $item->properties['url']);
 | |
| 
 | |
|             $module_alias = count($url_paths) >= 1 ? $url_paths[1] : $url_paths[0];
 | |
|         } elseif (! empty($item->childs[0])) {
 | |
|             $route = $item->childs[0]->route[0];
 | |
| 
 | |
|             $module_alias = explode('.', $route)[0];
 | |
|         }
 | |
| 
 | |
|         if (module($module_alias) != null) {
 | |
|             $base_path = 'modules/' . Str::studly($module_alias) . '/Resources/assets/img/icons/';
 | |
|         }
 | |
| 
 | |
|         $path = base_path($base_path . $slug . '.svg');
 | |
| 
 | |
|         if (! file_exists($path)) {
 | |
|             $path = 'public/img/akaunting-logo-purple.svg';
 | |
|         }
 | |
| 
 | |
|         return $path;
 | |
|     }
 | |
| }
 |