FEATURE #1496: add simple menu

This commit is contained in:
Michal Kváček
2016-04-02 08:03:35 +02:00
parent bc73fbc208
commit 19e0977bbb
10 changed files with 312 additions and 56 deletions
+3 -3
View File
@@ -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());
}
/**
+12
View File
@@ -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;
}
}
+85 -3
View File
@@ -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]);
}
}
+10 -1
View File
@@ -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