<?php if (!defined('HTMLY')) die('HTMLy'); ?>
<?php
$menu = '';
$filename = "content/data/menu.json";
if (file_exists($filename)) {
$json = json_decode(file_get_contents('content/data/menu.json', true));
$menus = json_decode($json);
if (!empty($menus)) {
$menu = parseMenus($menus);
}
}
function parseMenus($menus) {
$ol = '<ol class="dd-list">';
foreach ($menus as $menu) {
$ol .= parseMenu($menu);
}
$ol .= '</ol>';
return $ol;
}
function parseMenu($menu) {
$li = '<li class="dd-item" data-class="'. $menu->class .'" data-id="'. $menu->id .'" data-name="'.$menu->name.'" data-slug="'.htmlspecialchars($menu->slug, FILTER_SANITIZE_URL).'">';
$li .= '<div class="dd-handle">'.$menu->name.'</div>';
$li .= '<span class="button-delete btn btn-danger btn-xs" style="margin-right:0.5rem" data-owner-id="'.$menu->id.'">'.i18n('Delete').'</span>';
$li .= '<span class="button-edit btn btn-primary btn-xs" data-owner-id="'.$menu->id.'">'.i18n('Edit').'</span>';
if (isset($menu->children)) {
$li .= parseMenus($menu->children);
}
$li .= '</li>';
return $li;
}
?>
<div class="row">
<div class="col-md-6">
<div class="dd nestable"><?php if (!empty($menu)) {echo '<h2>Drag & Drop</h2><br>'. $menu;} else {echo '<span>'.i18n('At_the_moment_you_are_using_auto_generated_menu').'</span><ol class="dd-list"></ol>';}?></div>
</div>
<div class="col-md-6">
<form id="menu-add">
<h4><?php echo i18n('Add_menu');?></h4>
<div class="form-group">
<label for="addInputName"><?php echo i18n('Name');?></label>
<input type="text" class="form-control" id="addInputName" placeholder="<?php echo i18n('Link_name')?>" required>
</div>
<div class="form-group">
<label for="addInputSlug"><?php echo i18n('Slug');?></label>
<input type="text" class="form-control" id="addInputSlug" placeholder="<?php echo i18n('item_slug');?>" required>
</div>
<div class="form-group">
<label for="addInputClass"><?php echo i18n('CSS_Class_Optional');?></label>
<input type="text" class="form-control" id="addInputClass" placeholder="<?php echo i18n('item_class');?>">
</div>
<button class="btn btn-primary btn-sm" id="addButton"><?php echo i18n('Add_link');?></button>
</form>
<form id="menu-editor" style="display: none;">
<h4>Editing <span id="currentEditName"></span></h4>
<div class="form-group">
<label for="addInputName"><?php echo i18n('Name')?></label>
<input type="text" class="form-control" id="editInputName" placeholder="<?php echo i18n('Link_name')?>" required>
</div>
<div class="form-group">
<label for="addInputSlug"><?php echo i18n('Slug');?></label>
<input type="text" class="form-control" id="editInputSlug" placeholder="<?php echo i18n('item_slug');?>">
</div>
<div class="form-group">
<label for="addInputClass"><?php echo i18n('CSS_Class_Optional');?></label>
<input type="text" class="form-control" id="editInputClass" placeholder="<?php echo i18n('item_class');?>">
</div>
<button class="btn btn-primary btn-sm" id="editButton"><?php echo i18n('Save_Edit');?></button>
</form>
</div>
</div>
<div class="row">
<div class="output-container">
<div class="col">
<button class="btn btn-primary" id="saveButton"><?php echo i18n('Save_Menu');?></button>
<form class="form" style="display:none;">
<textarea class="form-control" id="json-output" rows="5"></textarea>
</form>
</div>
</div>
</div>
<script src="<?php echo site_url() ?>system/resources/js/jquery.nestable.js"></script>
<script src="<?php echo site_url() ?>system/resources/js/jquery.nestable++.js"></script>
<script>
$('.dd.nestable').nestable({
maxDepth: 2
})
.on('change', updateOutput);
$('#addMenu').click(function() {
$('#menu-add').fadeIn();
});
$("#saveButton").click(function(){
updateOutput($('.dd.nestable').data('output', $('#json-output')));
var js = $('#json-output').val();
$.ajax({
type: 'POST',
url: '<?php echo site_url();?>admin/menu',
dataType: 'json',
data: {'json': js},
success: function (response) {
alert(response.message);
location.reload();
},
});
});
</script>
<style>
/**
* Nestable css
*/
.dd {
position: relative;
display: block;
margin: 0;
padding: 0;
max-width: 600px;
list-style: none;
font-size: 13px;
line-height: 20px;
}
.dd-list {
display: block;
position: relative;
margin: 0;
padding: 0;
list-style: none;
}
.dd-list .dd-list {
padding-left: 30px;
}
.dd-collapsed .dd-list {
display: none;
}
.dd-item,
.dd-empty,
.dd-placeholder {
display: block;
position: relative;
margin: 0;
padding: 0;
min-height: 20px;
font-size: 13px;
line-height: 20px;
}
.dd-handle {
display: block;
margin: 5px 0;
padding: 5px 10px;
color: #333;
text-decoration: none;
font-weight: bold;
border: 1px solid #ccc;
background: #fafafa;
background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);
background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);
background: linear-gradient(top, #fafafa 0%, #eee 100%);
-webkit-border-radius: 3px;
border-radius: 3px;
box-sizing: border-box;
-moz-box-sizing: border-box;
cursor: move;
}
.dd-handle:hover {
color: #2ea8e5;
background: #fff;
}
.dd-item > button {
display: block;
position: relative;
cursor: pointer;
float: left;
width: 25px;
height: 20px;
margin: 5px 0;
padding: 0;
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
border: 0;
background: transparent;
font-size: 12px;
line-height: 1;
text-align: center;
font-weight: bold;
}
.dd-item > button:before {
content: '+';
display: block;
position: absolute;
width: 100%;
text-align: center;
text-indent: 0;
}
.dd-item > button[data-action="collapse"]:before {
content: '-';
}
.dd-placeholder,
.dd-empty {
margin: 5px 0;
padding: 0;
min-height: 30px;
background: #f2fbff;
border: 1px dashed #b6bcbf;
box-sizing: border-box;
-moz-box-sizing: border-box;
}
.dd-empty {
border: 1px dashed #bbb;
min-height: 100px;
background-color: #e5e5e5;
background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff),
-webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
background-image: -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff),
-moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff),
linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
background-size: 60px 60px;
background-position: 0 0, 30px 30px;
}
.dd-dragel {
position: absolute;
pointer-events: none;
z-index: 9999;
}
.dd-dragel > .dd-item .dd-handle {
margin-top: 0;
}
.dd-dragel .dd-handle {
-webkit-box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, .1);
box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, .1);
}
/**
* Nestable Extras
*/
.nestable-lists {
display: block;
clear: both;
padding: 30px 0;
width: 100%;
border: 0;
border-top: 2px solid #ddd;
border-bottom: 2px solid #ddd;
}
#nestable-menu {
padding: 0;
margin: 20px 0;
}
#nestable-output,
#nestable2-output {
width: 100%;
height: 7em;
font-size: 0.75em;
line-height: 1.333333em;
font-family: Consolas, monospace;
padding: 5px;
box-sizing: border-box;
-moz-box-sizing: border-box;
}
#nestable2 .dd-handle {
color: #fff;
border: 1px solid #999;
background: #bbb;
background: -webkit-linear-gradient(top, #bbb 0%, #999 100%);
background: -moz-linear-gradient(top, #bbb 0%, #999 100%);
background: linear-gradient(top, #bbb 0%, #999 100%);
}
#nestable2 .dd-handle:hover {
background: #bbb;
}
#nestable2 .dd-item > button:before {
color: #fff;
}
.dd {
// float: left;
// width: 48 %;
width: 80%;
}
.dd + .dd {
margin-left: 2%;
}
.dd-hover > .dd-handle {
background: #2ea8e5 !important;
}
/**
* Nestable Draggable Handles
*/
.dd3-content {
display: block;
height: 30px;
margin: 5px 0;
padding: 5px 10px 5px 40px;
color: #333;
text-decoration: none;
font-weight: bold;
border: 1px solid #ccc;
background: #fafafa;
background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);
background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);
background: linear-gradient(top, #fafafa 0%, #eee 100%);
-webkit-border-radius: 3px;
border-radius: 3px;
box-sizing: border-box;
-moz-box-sizing: border-box;
}
.dd3-content:hover {
color: #2ea8e5;
background: #fff;
}
.dd-dragel > .dd3-item > .dd3-content {
margin: 0;
}
.dd3-item > button {
margin-left: 30px;
}
.dd3-handle {
position: absolute;
margin: 0;
left: 0;
top: 0;
cursor: pointer;
width: 30px;
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
border: 1px solid #aaa;
background: #ddd;
background: -webkit-linear-gradient(top, #ddd 0%, #bbb 100%);
background: -moz-linear-gradient(top, #ddd 0%, #bbb 100%);
background: linear-gradient(top, #ddd 0%, #bbb 100%);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.dd3-handle:before {
content: '≡';
display: block;
position: absolute;
left: 0;
top: 3px;
width: 100%;
text-align: center;
text-indent: 0;
color: #fff;
font-size: 20px;
font-weight: normal;
}
.dd3-handle:hover {
background: #ddd;
}
/*
* Nestable++
*/
.button-delete {
position: absolute;
top: 4px;
right: 40px;
}
.button-edit {
position: absolute;
top: 4px;
right: 5px;
}
#saveButton {
padding-right: 30px;
padding-left: 30px;
}
.output-container {
margin-top: 20px;
}
#json-output {
margin-top: 20px;
}
</style>