FEATURE #1496: add simple menu
This commit is contained in:
@@ -92,11 +92,11 @@ class AppServiceProvider extends ServiceProvider
|
||||
// register all available widgets
|
||||
$registrator->register(HtmlCode::class);
|
||||
$registrator->register(Menu::class);
|
||||
$registrator->register(OrbitSlider::class);
|
||||
|
||||
// register some menu extensions
|
||||
$menuExtensions = $this->app->make('registerMenuExtension');
|
||||
$menuExtensions->register(new URL());
|
||||
$registrator->register(OrbitSlider::class);
|
||||
// $menuExtensions = $this->app->make('registerMenuExtension');
|
||||
// $menuExtensions->register(new URL());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,6 +3,7 @@ namespace App\Widgets\Menu;
|
||||
|
||||
use App\Http\Requests\Request;
|
||||
use App\Widgets\Contracts\WidgetRenderer;
|
||||
use App\Widgets\Exceptions\MissingParameterException;
|
||||
use App\Widgets\NonInstallableWidget;
|
||||
|
||||
class Menu extends NonInstallableWidget
|
||||
@@ -45,6 +46,17 @@ class Menu extends NonInstallableWidget
|
||||
*/
|
||||
public static function save(\App\Models\Widget $widget, Request $request)
|
||||
{
|
||||
if (!isset($request->settings) || empty($request->settings) || !json_decode($request->settings)) {
|
||||
throw new MissingParameterException('settings');
|
||||
}
|
||||
|
||||
$settings = [
|
||||
'links' => json_decode($request->settings),
|
||||
'containerClass' => $request->containerClass
|
||||
];
|
||||
|
||||
$widget->settings = json_encode($settings);
|
||||
|
||||
return $widget;
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,30 @@
|
||||
<?php
|
||||
namespace App\Widgets\Menu\Presenters;
|
||||
|
||||
use App\Models\Content;
|
||||
use App\Models\Widget;
|
||||
use App\Models\WidgetType;
|
||||
use App\Widgets\Contracts\WidgetRenderer;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Request;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
class Menu implements WidgetRenderer
|
||||
{
|
||||
protected static function selectContentPages($ids)
|
||||
{
|
||||
$pages = Content::where('status', '!=', Content::STATUS_DELETED)
|
||||
->whereIn('id', $ids)
|
||||
->get();
|
||||
$used = [];
|
||||
|
||||
foreach ($pages as $page) {
|
||||
$used[$page->id] = $page;
|
||||
}
|
||||
|
||||
return $used;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used for displaying widget.
|
||||
*
|
||||
@@ -19,7 +36,43 @@ class Menu implements WidgetRenderer
|
||||
*/
|
||||
public static function render($settings)
|
||||
{
|
||||
return json_encode($settings);
|
||||
$links = (array)$settings->links;
|
||||
|
||||
$pageIds = array_keys($links);
|
||||
|
||||
// get pages
|
||||
$pages = self::selectContentPages($pageIds);
|
||||
|
||||
// sort links using "order"
|
||||
uasort($links, function ($a, $b) {
|
||||
return $a->order - $b->order;
|
||||
});
|
||||
|
||||
$route = Request::route()
|
||||
->getName();
|
||||
$parameters = Route::current()
|
||||
->parameters();
|
||||
|
||||
$code = '<ul class="menu ' . $settings->containerClass . '">';
|
||||
|
||||
foreach ($links as $pageId => $link) {
|
||||
$page = $pages[$pageId];
|
||||
|
||||
$active = false;
|
||||
if ($route == 'page.content' && isset($parameters['url']) && $parameters['url'] == $page->url) {
|
||||
$active = true;
|
||||
}
|
||||
|
||||
$code .= '<li';
|
||||
if ($active) {
|
||||
$code .= ' class="is-active"';
|
||||
}
|
||||
$code .= '><a href="' . route('page.content', ['url' => $page->url]) . '">' . e($page->title) . '</a></li>';
|
||||
}
|
||||
|
||||
$code .= "</ul>";
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -35,10 +88,19 @@ class Menu implements WidgetRenderer
|
||||
->get();
|
||||
|
||||
$widget = new Widget();
|
||||
$content = new Content();
|
||||
|
||||
// get list of all pages
|
||||
$pages = $content->getOverview()
|
||||
->get();
|
||||
|
||||
$widget->settingsObj = new \stdClass();
|
||||
$widget->settingsObj->links = new \stdClass();
|
||||
|
||||
return view('admin.widgets.menu.new', [
|
||||
'type' => $type,
|
||||
'widget' => $widget,
|
||||
'pages' => $pages,
|
||||
'extensions' => $extensions
|
||||
]);
|
||||
}
|
||||
@@ -52,9 +114,29 @@ class Menu implements WidgetRenderer
|
||||
*/
|
||||
public static function renderEditForm(Widget $widget)
|
||||
{
|
||||
$extensions = App::make('registerMenuExtension')
|
||||
// $extensions = App::make('registerMenuExtension')
|
||||
// ->get();
|
||||
$content = new Content();
|
||||
|
||||
// get list of all pages
|
||||
$pages = $content->getOverview()
|
||||
->get();
|
||||
|
||||
return view('admin.widgets.menu.edit', ['widget' => $widget]);
|
||||
// make object from JSON
|
||||
$widget->settingsObj = json_decode($widget->settings);
|
||||
if (!isset($widget->settingsObj->links)) {
|
||||
$links = new \stdClass();
|
||||
} else {
|
||||
$links = (array)$widget->settingsObj->links;
|
||||
}
|
||||
|
||||
// sort links using "order"
|
||||
uasort($links, function ($a, $b) {
|
||||
return $a->order - $b->order;
|
||||
});
|
||||
|
||||
$widget->settingsObj->links = (object)$links;
|
||||
|
||||
return view('admin.widgets.menu.edit', ['widget' => $widget, 'pages' => $pages]);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,14 @@
|
||||
<?php
|
||||
return [
|
||||
'widgetName' => 'Menu',
|
||||
'widgetDescription' => 'User defined menu'
|
||||
'widgetDescription' => 'User defined menu',
|
||||
'name' => 'Menu name',
|
||||
'description' => 'Menu description',
|
||||
'containerClass' => 'HTML class used for container of this widget',
|
||||
'addedPages' => 'Pages in menu',
|
||||
'save' => 'Save',
|
||||
'new' => 'New menu',
|
||||
'edit' => 'Edit menu',
|
||||
'preview' => 'Menu preview',
|
||||
'availablePages' => 'Available pages'
|
||||
];
|
||||
@@ -0,0 +1,20 @@
|
||||
@extends('admin.layout')
|
||||
|
||||
@section('pageName', @trans('widgets/menu.edit', ['name' => $widget->name]))
|
||||
|
||||
@section('content')
|
||||
<h1>@lang('widgets/menu.edit', ['name' => $widget->name])</h1>
|
||||
|
||||
<div class="row">
|
||||
<div class="column large-8">
|
||||
@include('admin.widgets.menu.form', ['formAction' => route('widgets.postEdit', ['id' => $widget->id])])
|
||||
|
||||
</div>
|
||||
<div class="column large-4">
|
||||
<h3>@lang('widgets/menu.preview')</h3>
|
||||
|
||||
@widgetPreview($widget)
|
||||
</div>
|
||||
</div>
|
||||
@stop
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
@if (!isset($hideMessages))
|
||||
@if (session('success'))
|
||||
<div class="callout success">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if (session('error'))
|
||||
<div class="callout alert">
|
||||
{{ session('error') }}
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
|
||||
<form action="{{$formAction}}" method="POST">
|
||||
{!! csrf_field() !!}
|
||||
<label>
|
||||
@lang('widgets/menu.name')
|
||||
|
||||
<input type="text" name="name" value="{{old("name", $widget->name)}}" placeholder="@lang('widgets/menu.name')" />
|
||||
|
||||
@if (isset($errors) && $errors->has('name'))
|
||||
<div class="callout alert">
|
||||
{{ $errors->first('name') }}
|
||||
</div>
|
||||
@endif
|
||||
</label>
|
||||
|
||||
<label>
|
||||
@lang('widgets/menu.description')
|
||||
|
||||
<input type="text" name="description" placeholder="@lang('widgets/menu.description')"
|
||||
value="{{old("description", $widget->description)}}" />
|
||||
|
||||
@if (isset($errors) && $errors->has('description'))
|
||||
<div class="callout alert">
|
||||
{{ $errors->first('description') }}
|
||||
</div>
|
||||
@endif
|
||||
</label>
|
||||
|
||||
<textarea name="moduleSettings" id="menuConfig">{}</textarea>
|
||||
|
||||
<button type="submit" class="button success">@lang('widgets/menu.createNew')</button>
|
||||
</form>
|
||||
|
||||
|
||||
<ul class="tabs" data-tabs id="createMenu">
|
||||
@foreach($extensions as $extension)
|
||||
<li class="tabs-title @if($extension->getId() == reset($extensions)->getId()) is-active @endif">
|
||||
<a href="#{{$extension->getId()}}" @if($extension->getId() == reset($extensions)->getId()) aria-selected="true" @endif>
|
||||
{{trans($extension->getName())}}
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="createMenu">
|
||||
@foreach($extensions as $extension)
|
||||
<div class="tabs-panel @if($extension->getId() == reset($extensions)->getId()) is-active @endif" id="{{$extension->getId()}}">
|
||||
<h4>{{$extension->getName()}}</h4>
|
||||
<p>{{$extension->getDescription()}}</p>
|
||||
|
||||
<form action="#" id="menuItem-{{$extension->getId()}}" class="menuItems" data-extension="{{$extension->getId()}}">
|
||||
@include($extension->getFormExtensionTemplate())
|
||||
|
||||
<div class="row">
|
||||
<button class="button" type="submit"><i class="fa fa-plus"></i></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@section('javascripts')
|
||||
<script type="text/javascript">
|
||||
$('.menuItems').submit(function () {
|
||||
var id = $(this).data('extension');
|
||||
var existingSettings = {};
|
||||
|
||||
try {
|
||||
existingSettings = JSON.parse ($ ('#menuConfig').val ());
|
||||
} catch (err) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
$(this).find(':input').each(function () {
|
||||
var name = $(this).attr('name');
|
||||
var value = $(this).val();
|
||||
|
||||
alert('name: '+name+", value: "+value);
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@@ -0,0 +1,10 @@
|
||||
@extends('admin.layout')
|
||||
|
||||
@section('pageName', @trans('widgets/menu.new'))
|
||||
|
||||
@section('content')
|
||||
<h1>@lang('widgets/menu.new')</h1>
|
||||
|
||||
@include('admin.widgets.menu.form', ['formAction' => route('widgets.postNew', ['type' => $type])])
|
||||
@stop
|
||||
|
||||
@@ -12,12 +12,13 @@
|
||||
@endif
|
||||
@endif
|
||||
|
||||
<form action="{{$formAction}}" method="POST">
|
||||
<form action="{{$formAction}}" id="widget-menu" method="POST">
|
||||
{!! csrf_field() !!}
|
||||
<label>
|
||||
@lang('widgets/menu.name')
|
||||
|
||||
<input type="text" name="name" value="{{old("name", $widget->name)}}" placeholder="@lang('widgets/menu.name')" />
|
||||
<input type="text" name="name" value="{{old("name", $widget->name)}}"
|
||||
placeholder="@lang('widgets/menu.name')" />
|
||||
|
||||
@if (isset($errors) && $errors->has('name'))
|
||||
<div class="callout alert">
|
||||
@@ -39,59 +40,87 @@
|
||||
@endif
|
||||
</label>
|
||||
|
||||
<textarea name="moduleSettings" id="menuConfig">{}</textarea>
|
||||
<label>
|
||||
@lang('widgets/menu.containerClass')
|
||||
|
||||
<button type="submit" class="button success">@lang('widgets/menu.createNew')</button>
|
||||
<input type="text" name="containerClass" placeholder="@lang('widgets/menu.containerClass')"
|
||||
value="{{old("containerClass")}}" />
|
||||
|
||||
@if (isset($errors) && $errors->has('containerClass'))
|
||||
<div class="callout alert">
|
||||
{{ $errors->first('description') }}
|
||||
</div>
|
||||
@endif
|
||||
</label>
|
||||
|
||||
<input type="hidden" name="settings" id="widgetSettings" value="{{json_encode($widget->settingsObj->links)}}" />
|
||||
|
||||
<div class="row column">
|
||||
<h3>@lang('widgets/menu.addedPages')</h3>
|
||||
|
||||
<div id="menu-items-container">
|
||||
@foreach($widget->settingsObj->links as $pageId => $details)
|
||||
<span class="label" data-page-id="{{$pageId}}" id="item-{{$pageId}}">{{$details->text}}</span>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row column">
|
||||
<button type="submit" class="button success">@lang('widgets/menu.save')</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="row column">
|
||||
<h3>@lang('widgets/menu.availablePages')</h3>
|
||||
|
||||
<ul class="tabs" data-tabs id="createMenu">
|
||||
@foreach($extensions as $extension)
|
||||
<li class="tabs-title @if($extension->getId() == reset($extensions)->getId()) is-active @endif">
|
||||
<a href="#{{$extension->getId()}}" @if($extension->getId() == reset($extensions)->getId()) aria-selected="true" @endif>
|
||||
{{trans($extension->getName())}}
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="createMenu">
|
||||
@foreach($extensions as $extension)
|
||||
<div class="tabs-panel @if($extension->getId() == reset($extensions)->getId()) is-active @endif" id="{{$extension->getId()}}">
|
||||
<h4>{{$extension->getName()}}</h4>
|
||||
<p>{{$extension->getDescription()}}</p>
|
||||
|
||||
<form action="#" id="menuItem-{{$extension->getId()}}" class="menuItems" data-extension="{{$extension->getId()}}">
|
||||
@include($extension->getFormExtensionTemplate())
|
||||
|
||||
<div class="row">
|
||||
<button class="button" type="submit"><i class="fa fa-plus"></i></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@foreach ($pages as $page)
|
||||
<a href="#" class="button primary @if(isset($widget->settingsObj->links->{$page->id})) secondary @endif menu-item"
|
||||
data-page-url="{{$page->url}}" data-page-id="{{$page->id}}" id="page-{{$page->id}}">{{$page->title}}</a>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
|
||||
@section('javascripts')
|
||||
<script type="text/javascript">
|
||||
$('.menuItems').submit(function () {
|
||||
var id = $(this).data('extension');
|
||||
var existingSettings = {};
|
||||
|
||||
try {
|
||||
existingSettings = JSON.parse ($ ('#menuConfig').val ());
|
||||
} catch (err) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
$(this).find(':input').each(function () {
|
||||
var name = $(this).attr('name');
|
||||
var value = $(this).val();
|
||||
|
||||
alert('name: '+name+", value: "+value);
|
||||
$ ('#widget-menu').submit (function () {
|
||||
var items = {};
|
||||
var i = 0;
|
||||
$ ('#menu-items-container').children ().each (function () {
|
||||
var id = $ (this).data ('page-id');
|
||||
items[id] = {
|
||||
id: id,
|
||||
type: 'content',
|
||||
text: $ (this).text (),
|
||||
order: i++,
|
||||
children: {}
|
||||
};
|
||||
});
|
||||
|
||||
return false;
|
||||
// check if menu is not empty
|
||||
if (i == 0) {
|
||||
alert ('@lang('widget/menu.noLinks')');
|
||||
return false;
|
||||
}
|
||||
|
||||
$ ('#widgetSettings').val (JSON.stringify (items));
|
||||
});
|
||||
|
||||
$ ('.menu-item').click (function () {
|
||||
var url = $ (this).data ('page-url');
|
||||
var text = $ (this).text ();
|
||||
var id = $ (this).data ('page-id');
|
||||
|
||||
if ($ (this).hasClass ('secondary')) {
|
||||
// remove
|
||||
$ ('#item-' + id).remove ();
|
||||
} else {
|
||||
// add
|
||||
$ ('#menu-items-container').append ('<span class="label" id="item-' + id + '" data-page-id="' + id + '">' + text + '</span> ');
|
||||
}
|
||||
|
||||
// distinguish between added and not-added page
|
||||
$ (this).toggleClass ('secondary');
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endsection
|
||||
@@ -1,10 +1,7 @@
|
||||
@extends('admin.layout')
|
||||
|
||||
@section('pageName', @trans('widgets/menu.new'))
|
||||
|
||||
@section('content')
|
||||
<h1>@lang('widgets/menu.new')</h1>
|
||||
|
||||
@include('admin.widgets.menu.form', ['formAction' => route('widgets.postNew', ['type' => $type])])
|
||||
@stop
|
||||
|
||||
@endsection
|
||||
Reference in New Issue
Block a user