FEATURE: *in progress* working on menu widgets

This commit is contained in:
Michal Kváček
2016-03-22 15:53:23 +01:00
parent 6c7122b494
commit 7788a598f4
10 changed files with 317 additions and 31 deletions
@@ -3,5 +3,13 @@ namespace App\Widgets\Contracts;
interface MenuExtensionHandler {
public static function getPossibleValues();
public function getName();
public function getDescription();
public function getId();
public function getPossibleValues();
public function getFormExtensionTemplate();
public function save();
}
+27 -2
View File
@@ -4,8 +4,33 @@ namespace App\Widgets\Menu\Extensions;
use App\Widgets\Contracts\MenuExtensionHandler;
class URL implements MenuExtensionHandler {
public static function getPossibleValues()
public function getPossibleValues()
{
// TODO: Implement getPossibleValues() method.
return '*';
}
public function getId()
{
return 'url';
}
public function getName()
{
return trans('widgets/menu.extensionURL');
}
public function getDescription()
{
return trans('widgets/menu.extensionURLDescription');
}
public function getFormExtensionTemplate()
{
return 'admin.widgets.menu.extensions.url';
}
public function save()
{
// TODO: Implement save() method.
}
}
+5 -23
View File
@@ -3,9 +3,9 @@ namespace App\Widgets\Menu;
use App\Http\Requests\Request;
use App\Widgets\Contracts\WidgetRenderer;
use App\Widgets\Widget;
use App\Widgets\NonInstallableWidget;
class Menu extends Widget
class Menu extends NonInstallableWidget
{
/**
* Name getter
@@ -14,7 +14,7 @@ class Menu extends Widget
*/
public static function getName()
{
return 'widgets/menu.name';
return 'widgets/menu.widgetName';
}
/**
@@ -24,7 +24,7 @@ class Menu extends Widget
*/
public static function getDescription()
{
return 'widgets/menu.description';
return 'widgets/menu.widgetDescription';
}
/**
@@ -45,24 +45,6 @@ class Menu extends Widget
*/
public static function save(\App\Models\Widget $widget, Request $request)
{
// TODO: Implement save() method.
}
/**
* Function for installing given widget
*
* @return mixed
*/
public static function install()
{
// TODO: Implement install() method.
}
/**
* Function for uninstalling widget
*/
public static function uninstall()
{
// TODO: Implement uninstall() method.
return $widget;
}
}
+16 -3
View File
@@ -4,6 +4,7 @@ namespace App\Widgets\Menu\Presenters;
use App\Models\Widget;
use App\Models\WidgetType;
use App\Widgets\Contracts\WidgetRenderer;
use Illuminate\Support\Facades\App;
class Menu implements WidgetRenderer
{
@@ -18,7 +19,7 @@ class Menu implements WidgetRenderer
*/
public static function render($settings)
{
// TODO: Implement render() method.
return json_encode($settings);
}
/**
@@ -30,7 +31,16 @@ class Menu implements WidgetRenderer
*/
public static function renderAddForm(WidgetType $type)
{
// TODO: Implement renderAddForm() method.
$extensions = App::make('registerMenuExtension')
->get();
$widget = new Widget();
return view('admin.widgets.menu.new', [
'type' => $type,
'widget' => $widget,
'extensions' => $extensions
]);
}
/**
@@ -42,6 +52,9 @@ class Menu implements WidgetRenderer
*/
public static function renderEditForm(Widget $widget)
{
// TODO: Implement renderEditForm() method.
$extensions = App::make('registerMenuExtension')
->get();
return view('admin.widgets.menu.edit', ['widget' => $widget]);
}
}
+2 -2
View File
@@ -1,5 +1,5 @@
<?php
return [
'name' => 'Menu',
'description' => 'User defined menu'
'widgetName' => 'Menu',
'widgetDescription' => 'User defined menu'
];
@@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
label { display: inline-block; margin-right: 10px; }
a { display: inline-block; margin-right: 10px; }
</style>
</head>
<body>
<div id="zoznampoloziek">
​
</div>
<div class="jednapolozka" id="hlavnanovapolozka">
<input type="text" class="polozkamenu" data-id="0" data-parent="0">
<a href="javascript:void(0);" onclick="pridajPolozku(this.parentNode.getElementsByClassName('polozkamenu')[0])">pridaj
polozku</a>
</div>
<hr>
<a href="javascript:console.info(model)">printni model do conosoly</a>
<script type="text/javascript">
var model = {};
var counter = 0;
var zoznam = document.getElementById ('zoznampoloziek');
var hlavnapolozka = document.getElementById ('hlavnanovapolozka');
function pridajPolozku(element) {
if (element.value == '') {
alert ('prazdnu polozku nepridas');
return false;
}
counter++;
element.setAttribute ('data-id', counter);
model[element.getAttribute ('data-id')] = {
'name': element.value,
'parent': element.getAttribute ('data-parent'),
};
element.value = '';
aktualizujZoznam ();
}
function zmazat(element) {
var polozka = element.parentNode.getElementsByTagName ('LABEL')[0];
if (confirm ('naozaj zmazat id: ' + polozka.getAttribute ('data-id') + ' : "' + polozka.textContent + '" ?')) {
delete model[polozka.getAttribute ('data-id')];
aktualizujZoznam ();
}
}
function novePridajPolozku(element) {
var polozka = element.parentNode.getElementsByTagName ('LABEL')[0],
subpolozkainput = hlavnapolozka.cloneNode (true),
subinput = subpolozkainput.getElementsByClassName ('polozkamenu')[0];
counter++;
subpolozkainput.removeAttribute ('id');
subinput.setAttribute ('data-id', counter.toString ());
subinput.setAttribute ('data-parent', polozka.getAttribute ('data-id'));
element.parentNode.appendChild (subpolozkainput);
}
function novyDomPrePolozky(id, parent, name) {
var div = document.createElement ('div'),
popis = document.createElement ('label'),
zmaz = document.createElement ('a'),
sub = document.createElement ('a');
popis.textContent = name;
popis.setAttribute ('data-id', id);
popis.setAttribute ('data-parent', parent);
zmaz.textContent = 'zmaz';
zmaz.href = 'javascript:void(0);';
zmaz.setAttribute ('onclick', 'zmazat(this);');
sub.textContent = 'pridaj sub';
sub.href = 'javascript:void(0)';
sub.setAttribute ('onclick', 'novePridajPolozku(this);');
div.appendChild (popis);
div.appendChild (zmaz);
div.appendChild (sub);
return div;
}
function aktualizujZoznam() {
var key,
novydom,
zoznamitems = zoznam.childNodes,
zoznamitems_i = zoznamitems.length;
while (zoznamitems_i--) {
zoznam.removeChild (zoznamitems[zoznamitems_i]);
}
for (key in model) {
if (model.hasOwnProperty (key)) {
novydom = novyDomPrePolozky (key, model[key].parent, model[key].name);
if (model[key].parent == 0) {
zoznam.appendChild (novydom);
} else {
zoznam.insertBefore (novydom, zoznam.querySelector ('[data-id="' + model[key].parent + '"]').parentNode.nextSibling);
}
}
}
zoznam.appendChild (document.createElement ('div'));
}
</script>
</body>
</html>
@@ -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,17 @@
<label>
@lang('widgets.url')
<input type="text" name="url" id="urlField"/>
</label>
<label>
@lang('widgets.anchor')
<input type="text" name="anchor" id="anchorField"/>
</label>
<label>
@lang('widgets.openInNewWindow')
<input type="checkbox" checked="checked" name="openInNewWindow" id="openInNewWindowField"/>
</label>
@@ -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