Nav-App fixes and improvements

* Inserted Logging
* Added Installer
* Enabled external links as nav entries
* Fix: Pages can't be their own parent
* Fix: Top table row can't be moved
This commit is contained in:
kolaente 2017-05-01 17:18:39 +02:00 committed by konrad
parent 97bd63177e
commit b365dc88ed
8 changed files with 173 additions and 73 deletions

View File

@ -79,14 +79,27 @@ if(is_loggedin())
{
if (is_numeric(intval($_POST['page'])) && is_numeric(intval($_POST['parent'])) && is_string(strval($_POST['title'])))
{
$db->setCol('nav_nav');
$db->data['title'] = $_POST['title'];
$db->data['page'] = $_POST['page'];
$db->data['parent'] = $_POST['parent'];
$success = $db->insert();
$pageval = $_POST['page'];
$send_ready = true;
if($_POST['external'] !== ''){
if (filter_var($_POST['external'], FILTER_VALIDATE_URL) === false) {
$send_ready = false;
echo 'url_invalid';
}
} $pageval = 0;
//Stream Message
stream_message('{user} created a nav entry ({extra})', 3, $_POST['page']);
if($send_ready)
{
$db->setCol('nav_nav');
$db->data['title'] = $_POST['title'];
$db->data['page'] = $pageval;
$db->data['external'] = $_POST['external'];
$db->data['parent'] = $_POST['parent'];
$success = $db->insert();
//Stream Message
stream_message('{user} created a nav entry ({extra})', 3, $_POST['page']);
}
}
}
}
@ -97,7 +110,7 @@ if(is_loggedin())
{
if(isset($_POST['id'], $_POST['parent']))
{
if (is_numeric(intval($_POST['id'])) && is_numeric(intval($_POST['parent'])))
if (is_numeric(intval($_POST['id'])) && is_numeric(intval($_POST['parent'])) && $_POST['parent'] != $_POST['id'])
{
$db->setCol('nav_nav');
$db->data['parent'] = $_POST['parent'];

View File

@ -4,8 +4,8 @@ $GLOBALS['lang']->set('Navigation', 'nav_title', 'de');
$GLOBALS['lang']->set('Navigation', 'nav_title', 'en');
$_CONF['app_name'] = 'Navigation';
$_CONF['app_build'] = 1;
$_CONF['app_version'] = 'v0.9 Beta';
$_CONF['app_build'] = 2;
$_CONF['app_version'] = 'v0.91 Beta';
$_CONF['base_file'] = 'nav.php';
$_CONF['type'] = 'static';

View File

@ -11,27 +11,36 @@ foreach ($db->data as $page)
$pages .= '<option value="' . $page['id'] . '">' . $page['title'] . '</option>';
}
//Get all parents and build a dropdown list
$parents = '<option value="0">--</option>';
$db->setCol('nav_nav');
$db->get();
$parentdata = $db->data;
foreach ($parentdata as $parent)
function getParents($exclude = null)
{
//If we don't have a parent from the Nav itself, take the page's title
if ($parent['title'] === '')
global $db;
//Get all parents and build a dropdown list
$parents = '<option value="0">--</option>';
$db->setCol('nav_nav');
$db->get(null, null, 'nav_order');
$parentdata = $db->data;
foreach ($parentdata as $parent)
{
$db->setCol('simplePages_pages');
$db->data['id'] = $parent['page'];
$db->get();
if (isset($db->data[0]))
if((isset($exclude) && $parent['id'] !== $exclude) || !isset($exclude))
{
$parents .= '<option value="' . $parent['id'] . '">' . $db->data[0]['title'] . '</option>';
//If we don't have a parent from the Nav itself, take the page's title
if ($parent['title'] === '')
{
$db->setCol('simplePages_pages');
$db->data['id'] = $parent['page'];
$db->get();
if (isset($db->data[0]))
{
$parents .= '<option value="' . $parent['id'] . '">' . $db->data[0]['title'] . '</option>';
}
} else
{
$parents .= '<option value="' . $parent['id'] . '">' . $parent['title'] . '</option>';
}
}
} else
{
$parents .= '<option value="' . $parent['id'] . '">' . $parent['title'] . '</option>';
}
return $parents;
}
//Show
@ -55,6 +64,7 @@ function buildNav($nav, $lvl = 0)
$title = $site['title'];
if ($title == '') $title = $db->data[0]['title'];
//Display Level
echo '<div class="col"><i class="fa fa-bars" aria-hidden="true" style="color: #ccc;"></i>&nbsp;&nbsp;&nbsp;&nbsp;';
for ($i = 1; $i <= $lvl; $i++)
{
@ -64,8 +74,21 @@ function buildNav($nav, $lvl = 0)
$title = $site['title'];
if ($title == '') $title = $db->data[0]['title'];
echo $title . '</div><div class="col"><a href="../SimplePages/backend/edit.php?id=' . $site['page'] . '"><i class="fa fa-pencil" aria-hidden="true"></i> ' . $db->data[0]['title'] . '</a></div>
<div class="col"><select id="parentChange_' . $site['id'] . '" data-nav-id="' . $site['id'] . '" onchange="update(\'' . $site['id'] . '\')">' . str_replace('value="' . $site['parent'] . '"', 'value="' . $site['parent'] . '" selected', $GLOBALS['parents']) . '</select></div>
echo $title . '</div><div class="col">';
//Don't show edit-link if the entry is external
if($site['external'] === '')
{
echo '<a href="../SimplePages/backend/edit.php?id=' . $site['page'] . '"><i class="fa fa-pencil" aria-hidden="true"></i> ' . $db->data[0]['title'] . '</a>';
}
else
{
echo substr($site['external'], 0, 30);
if(strlen($site['external']) > 30) echo '...';
}
echo '</div>
<div class="col"><select id="parentChange_' . $site['id'] . '" data-nav-id="' . $site['id'] . '" onchange="update(\'' . $site['id'] . '\')">' . str_replace('value="' . $site['parent'] . '"', 'value="' . $site['parent'] . '" selected', getParents($site['id'])) . '</select></div>
<div class="col"><a onclick="del(' . $site['id'] . ');" class="del" title="' . $GLOBALS['lang']->get('nav_delete') . '"><i class="fa fa-trash-o" aria-hidden="true"></i></a></div>';
echo "</div>\n";
@ -83,11 +106,6 @@ function buildNav($nav, $lvl = 0)
}
}
/*
* TODO:
* * mglkt zum "neuzuweisen" der Parents -> Dropdown
*/
if (hasPerm('edit_nav'))
{
?>
@ -97,7 +115,7 @@ if (hasPerm('edit_nav'))
aria-hidden="true"></i>&nbsp;&nbsp;<?php echo $lang->get('nav_create'); ?>
</a></p>
<div id="sortable" class="pseudo-table">
<div class="row top" id="top">
<div class="row top" id="top notSort">
<div class="col"><?php echo $lang->get('nav_pageTitle') ?></div>
<div class="col"><?php echo $lang->get('nav_page') ?></div>
<div class="col"><?php echo $lang->get('nav_parent') ?></div>
@ -117,7 +135,7 @@ if (hasPerm('edit_nav'))
<script src="js/nav.js"></script>
<script>
//Create Dropdowns
var parents = '<?php echo $parents;?>';
var parents = '<?php echo getParents();?>';
var pages = '<?php echo $pages;?>';
//Make Language Strings available in JS
var lang = {
@ -131,6 +149,7 @@ if (hasPerm('edit_nav'))
nav_deleted_fail: '<?php echo $lang->get('nav_deleted_fail') ?>',
nav_create: '<?php echo $lang->get('nav_create') ?>',
nav_create_title: '<?php echo $lang->get('nav_create_title') ?>',
nav_create_title_noptoption: '<?php echo $lang->get('nav_create_title_noptoption') ?>',
nav_create_page: '<?php echo $lang->get('nav_create_page') ?>',
nav_create_parents: '<?php echo $lang->get('nav_create_parents') ?>',
nav_create_create: '<?php echo $lang->get('nav_create_create') ?>',
@ -139,7 +158,11 @@ if (hasPerm('edit_nav'))
nav_create_fail: '<?php echo $lang->get('nav_create_fail') ?>',
nav_update_success: '<?php echo $lang->get('nav_update_success') ?>',
nav_update_fail: '<?php echo $lang->get('nav_update_fail') ?>',
not_found: '<?php echo $lang->get('404_not_found') ?>'
not_found: '<?php echo $lang->get('404_not_found') ?>',
nav_create_external_url_invalid: '<?php echo $lang->get('nav_create_external_url_invalid') ?>',
nav_create_external_needs_title: '<?php echo $lang->get('nav_create_external_needs_title') ?>',
nav_create_external: '<?php echo $lang->get('nav_create_external') ?>',
nav_create_external_input: '<?php echo $lang->get('nav_create_external_input') ?>'
};
</script>
<?php

View File

@ -0,0 +1,26 @@
<?php
if(isset($_POST['submit']))
{
if($db->query('CREATE TABLE `' . $_POST['db_prefix'] . 'nav_nav` (
`id` int(11) NOT NULL,
`title` text CHARACTER SET latin1 NOT NULL,
`page` int(11) NOT NULL,
`parent` int(11) NOT NULL,
`nav_order` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `' . $_POST['db_prefix'] . 'nav_nav`
ADD PRIMARY KEY (`id`);
ALTER TABLE `' . $_POST['db_prefix'] . 'nav_nav`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
'))
{
echo msg('success', 'Navigation was installed successfully.');
}
else
{
echo msg('fail', 'An error occured while installing Navigation.');
exit;
}
}

View File

@ -7,6 +7,7 @@ $(function () {
$("#sortable").sortable({
axis: "y",
cursor: "move",
items: 'div:not(.top).row',
placeholder: "sortable-placeholder",
over: function (event, ui) {
console.log(event, ui)
@ -37,7 +38,6 @@ $(function () {
});
}
});
$("#sortable").disableSelection();
});
//Delete
@ -77,41 +77,63 @@ function del(id) {
//Create menuitem
function createItem() {
$('#extra').html('<div class="overlay" style="display:none;"><div class="window window-confirm"><div class="head">' + lang.nav_create + '<a onclick="closeW();" class="closeMsg"><i class="fa fa-close"></i></a></div><div id="content"><p><input type="text" name="nav_title" id="nav_title" placeholder="' + lang.nav_create_title + '"/></p><p>' + lang.nav_create_page + ': <select name="nav_page" id="nav_page">' + pages + '</select></p><p>' + lang.nav_create_parents + ': <select name="nav_parent" id="nav_parent">' + parents + '</select></p><p><a class="button" id="createConfirm"><i class="fa fa-plus"></i>&nbsp;&nbsp;' + lang.nav_create_create + '</a><a onclick="closeW();" class="button btn_del">' + lang.nav_create_abort + '</a></p></div></div></div>');
$('#extra').html('<div class="overlay" style="display:none;"><div class="window window-confirm"><div class="head">' + lang.nav_create + '<a onclick="closeW();" class="closeMsg"><i class="fa fa-close"></i></a></div><div id="content"><p><input type="text" name="nav_title" id="nav_title" placeholder="' + lang.nav_create_title + '"/></p><p>' + lang.nav_create_page + ' <input type="checkbox" id="externalCheck"/><label for="externalCheck"><i></i>' + lang.nav_create_external + ' </label> <select name="nav_page" id="nav_page">' + pages + '</select><input type="text" name="nav_external" id="nav_external" style="display: none;" placeholder="' + lang.nav_create_external_input + '"/></p><p>' + lang.nav_create_parents + ': <select name="nav_parent" id="nav_parent">' + parents + '</select></p><p><a class="button" id="createConfirm"><i class="fa fa-plus"></i>&nbsp;&nbsp;' + lang.nav_create_create + '</a><a onclick="closeW();" class="button btn_del">' + lang.nav_create_abort + '</a></p></div></div></div>');
$(".overlay").fadeIn(250);
//Check for checked
$('#externalCheck').change(function () {
if (this.checked) {
$('#nav_page').hide();
$('#nav_external').show().focus();
$('#nav_title').attr('placeholder', lang.nav_create_title_noptoption);
} else {
$('#nav_page').show();
$('#nav_external').hide();
$('#nav_title').attr('placeholder', lang.nav_create_title);
}
});
//Send
$('#createConfirm').click(function () {
closeW();
$.ajax({
url: 'action.php?create',
type: 'POST',
cache: false,
data: 'title=' + $('#nav_title').val() + '&page=' + $('#nav_page').val() + '&parent=' + $('#nav_parent').val(),
success: function (result) { // On success, display a message...
if (result == 'success') {
showMsg(lang.nav_create_success);
} else {
var external = $('#nav_external').val();
var sendReady = true;
if ($('#externalCheck').is(':checked')) {
if ($('#nav_title').val() == '') {
sendReady = false;
showMsg(lang.nav_create_external_needs_title);
}
}
//Send
if (sendReady) {
$.ajax({
url: 'action.php?create',
type: 'POST',
cache: false,
data: 'title=' + $('#nav_title').val() + '&page=' + $('#nav_page').val() + '&parent=' + $('#nav_parent').val() + '&external=' + external,
success: function (result) { // On success, display a message...
if (result == 'success') {
showMsg(lang.nav_create_success);
reloadNav();//...and reload the content. We do this to display everything properly including their childs
} else if(result == 'url_invalid') {
showMsg(lang.nav_create_external_url_invalid);
$('#nav_external').focus();
} else {
showMsg(lang.nav_create_fail);
reloadNav();//...and reload the content. We do this to display everything properly including their childs
}
$('.spinner-container').hide(); //Hide the Loader
},
error: function (xhr, status, error) {
showMsg(lang.nav_create_fail);
}
//...and reload the content. We do this to display everything including their childs
reloadNav();
$('.spinner-container').hide(); //Hide the Loader
},
error: function (xhr, status, error) {
showMsg(lang.nav_create_fail);
}
});
});
}
});
}
//Update
/*$('#parentChange').on('change', function() {
console.log('faa');
console.log(this.dataset);
});*/
function update(id) {
var newParent = $('#parentChange_' + id).val();
@ -154,14 +176,15 @@ function reloadNav() {
//Close Window
function closeW() {
console.log('close');
$(".overlay").fadeOut(200);
setTimeout(function () {
$('#extra').html('');
}, 300);
}
window.onclick = function(event) {
if(event.target.parentElement != null) {
window.onclick = function (event) {
if (event.target.parentElement != null) {
if (event.target.parentElement.id == 'extra') {
closeW();
}

View File

@ -11,7 +11,6 @@ $lang['__Lang__'] = 'German (Deutsch)';
$lang['__LangCode__'] = 'de';
$lang['__Countrycode__'] = 'de_DE';
$lang['nav_needs_SimplePages'] = 'Diese App braucht SimplePages, um zu funktionieren.';
$lang['nav_id'] = 'ID';
$lang['nav_pageTitle'] = 'Titel';
$lang['nav_page'] = 'Seite';
@ -28,6 +27,7 @@ $lang['nav_delete_confirm_yes'] = 'Löschen!';
$lang['nav_delete_confirm_abort'] = 'Abbrechen';
$lang['nav_create'] = 'Neuen Menüeintrag erstellen';
$lang['nav_create_title'] = 'Titel (Optional)';
$lang['nav_create_title_noptoption'] = 'Titel';
$lang['nav_create_create'] = 'Erstellen';
$lang['nav_create_abort'] = 'Abbrechen';
$lang['nav_create_parents'] = 'Übergeordnet';
@ -36,6 +36,10 @@ $lang['nav_create_success'] = 'Der neue Menüeintrag wurde erfolgreich angelegt.
$lang['nav_create_fail'] = 'Beim Anlegen des neuen Menüeintrags trat ein Fehler auf.';
$lang['nav_update_success'] = 'Der Menüeintrag wurde erfolgreich geändert.';
$lang['nav_update_fail'] = 'Beim Ändern des Menüeintrags trat ein Fehler auf.';
$lang['nav_create_external'] = 'Extern';
$lang['nav_create_external_input'] = 'Externe URL';
$lang['nav_create_external_needs_title'] = 'Bitte geben Sie einen Titel an, wenn sie einen Externen Menüeinrag anlegen.';
$lang['nav_create_external_url_invalid'] = 'Die angegebene URL ist ungültig.';
//Stream
$lang['nav_stream_edited'] = '{user} hat einen Menüeintrag geändert ({extra})';

View File

@ -11,7 +11,6 @@ $lang['__Lang__'] = 'English (English)';
$lang['__LangCode__'] = 'en';
$lang['__Countrycode__'] = 'en';
$lang['nav_needs_SimplePages'] = 'This App needs SimplePages to work.';
$lang['nav_id'] = 'ID';
$lang['nav_pageTitle'] = 'Title';
$lang['nav_page'] = 'Page';
@ -28,6 +27,7 @@ $lang['nav_delete_confirm_yes'] = 'Delete!';
$lang['nav_delete_confirm_abort'] = 'Cancel';
$lang['nav_create'] = 'Create a new item';
$lang['nav_create_title'] = 'Title (Optional)';
$lang['nav_create_title_noptoption'] = 'Title';
$lang['nav_create_create'] = 'Create';
$lang['nav_create_abort'] = 'Cancel';
$lang['nav_create_parents'] = 'Child of';
@ -36,6 +36,10 @@ $lang['nav_create_success'] = 'The new item was successfully created.';
$lang['nav_create_fail'] = 'An error occured while saving the new item.';
$lang['nav_update_success'] = 'The item was successfully updated.';
$lang['nav_update_fail'] = 'An error occured while updating the item.';
$lang['nav_create_external'] = 'External';
$lang['nav_create_external_input'] = 'External URL';
$lang['nav_create_external_needs_title'] = 'Please provide a title when creating an external nav entry.';
$lang['nav_create_external_url_invalid'] = 'The provided URL is invalid.';
//Stream
$lang['nav_stream_edited'] = '{user} edited a nav entry ({extra})';

View File

@ -9,16 +9,23 @@ function buildNav($nav)
{
//Get the Page URL
$pageUrl = '#';
$db->setCol('simplePages_pages');
$db->data['id'] = $site['page'];
$db->get();
if(!empty($db->data)) $pageUrl = $db->data[0]['alias'];
if ($site['external'] === '')
{
$db->setCol('simplePages_pages');
$db->data['id'] = $site['page'];
$db->get();
if (!empty($db->data)) $pageUrl = $GLOBALS['MCONF']['web_uri'].$db->data[0]['alias'];
}
else
{
$pageUrl = $site['external'];
}
//Get the page title
$title = $site['title'];
if($title == '') $title = $db->data[0]['title'];
$navTree .= '<li><a href="'.$GLOBALS['MCONF']['web_uri'].$pageUrl.'">'.$title.'</a>';
$navTree .= '<li><a href="'.$pageUrl.'">'.$title.'</a>';
//Look for childs
$db->setCol('nav_nav');