Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/issue 1194 new sidebar #1240

Merged
merged 75 commits into from May 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
e254e31
added sidebar
emrysr Feb 6, 2019
8f2371d
tested new sidebar with other modules
emrysr Feb 7, 2019
8611c88
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Feb 7, 2019
d14c4ff
remove svg tooltips
emrysr Feb 7, 2019
8d0e8ba
added menu building functions
emrysr Feb 12, 2019
ef1bf62
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Feb 12, 2019
7a82ad1
renamed $sidebar to $menu
emrysr Feb 12, 2019
ab6b13d
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Feb 12, 2019
bf54e18
added gravitar to user dropdown in main menu
emrysr Feb 12, 2019
1251f58
removed caret dropdown indicator from user dropdown
emrysr Feb 12, 2019
82888cb
added fixed sidebar
emrysr Feb 14, 2019
26e794a
fixed sidebar height restriction when on narrow display
emrysr Feb 14, 2019
65d68da
corrected functions that create absolute urls from relative links
emrysr Feb 15, 2019
a6f65b9
fix sidebar footer expanding bug
emrysr Feb 15, 2019
15f7dc8
removed on hover open of active sidebar button
emrysr Feb 15, 2019
69eb896
added base css
emrysr Feb 15, 2019
20f5a83
modified vis module menu
emrysr Feb 15, 2019
a52a5cd
commit for review
emrysr Feb 15, 2019
f4ef2a3
added new variable $has_sidebar to user module menu
emrysr Feb 17, 2019
4079677
corrected menu_sort() function to sort menu items without 'order' a-z
emrysr Feb 19, 2019
691f92d
outputting all sub-menus on every page
emrysr Feb 25, 2019
7bf525e
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Feb 25, 2019
55901fb
Sidebar load collapsed if screen size is small
emrysr Mar 4, 2019
cb6a405
Sidebar collapse on click on menu item
emrysr Mar 4, 2019
2f94034
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Mar 4, 2019
0a427dc
Menu item border
emrysr Mar 4, 2019
8882642
Setup menu ordering
emrysr Mar 4, 2019
6f8d0a9
Menu item border pushed sidebar footer down. fixed.
emrysr Mar 4, 2019
375c5ba
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Mar 4, 2019
ca6f1eb
added shuffle icon
emrysr Mar 4, 2019
16270e6
fixed sidebar link borders
emrysr Mar 8, 2019
64442b7
committing for review
emrysr Mar 14, 2019
d1b58cc
fixed 2nd level problem hidden
emrysr Mar 14, 2019
6768283
top navs now highlighting correctly on load
emrysr Mar 14, 2019
298dddc
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Mar 19, 2019
b4c0df6
show blank user icon when user gravitar is empty
emrysr Mar 19, 2019
0bde467
corrected array to string conversion error in menu_view.php
emrysr Mar 19, 2019
8419c9e
removed unrequired bootstrap columns in layout
emrysr Mar 26, 2019
0b330b1
removed hammerjs swipe requirement
emrysr Mar 26, 2019
d87c8ea
enlarged top nav height and icons
emrysr Mar 26, 2019
ef09d0a
to header set to 60px high
emrysr Mar 26, 2019
dbbe4e9
made top nav shorter
emrysr Mar 26, 2019
11e0d10
wrapped app content in common container
emrysr Mar 27, 2019
276ed99
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr Mar 27, 2019
ba649ab
animated sidebar and footer at same speed
emrysr Mar 27, 2019
6b523a8
fixed issue with jquery selector causing error
emrysr Mar 28, 2019
8c02c5a
resized blank gravitar to fit new sidebar height
emrysr Mar 28, 2019
56b3409
allowed menu files to use an 'active' property that matches menu file…
emrysr Mar 28, 2019
add3047
fixed issue with setup tab icon turning black on hover
emrysr Apr 1, 2019
156ceff
Merge branch 'master' into feature/issue-1194-new-sidebar
emrysr Apr 1, 2019
17b652b
fix menu item array issue
emrysr Apr 2, 2019
2996f72
toggled sidebar 3rd level menu indicator on click
emrysr Apr 3, 2019
268a53d
modified sidebar hide/close logic.
emrysr Apr 5, 2019
c49aa90
added calendar icon
emrysr Apr 5, 2019
ab96797
added postprocess icon
emrysr Apr 5, 2019
b736b43
added group icon
emrysr Apr 5, 2019
7c2931f
moved utility css to emon-base.css
emrysr Apr 9, 2019
715dd14
updated user set_preferences() to append bookmark values
emrysr Apr 23, 2019
73675b7
fixed 3rd level menu collapse
emrysr Apr 23, 2019
45e3f67
made 3rd level menus work on other sidebars
emrysr Apr 23, 2019
6090924
hide/show bookmarks when empty
emrysr Apr 23, 2019
c9d1be4
fixed icon vertical align in sidebar
emrysr Apr 23, 2019
db440d4
merged with updated master
emrysr Apr 23, 2019
73f24ff
fixed issues with moved css to from sidebar.css
emrysr Apr 24, 2019
220bb4e
mereged identical responsive css blocks
emrysr Apr 25, 2019
295320a
added wifi icon
emrysr Apr 25, 2019
f457c6f
added generic css for adding a border to an element
emrysr Apr 29, 2019
6b3cc70
fixed issue with bookmark edits setting all bookmarks to 'blank'
emrysr Apr 29, 2019
0084b1f
added css for tabs
emrysr Apr 29, 2019
731f6c8
corrected tab css colours
emrysr Apr 29, 2019
a91d65d
added more utility css
emrysr Apr 29, 2019
3e7f196
reading url fragment (hash) values in bookmarks sidebar
emrysr Apr 30, 2019
446eee3
highlighted active bookmark item
emrysr Apr 30, 2019
f249d36
updated the js travis test to work with new logout link
emrysr Apr 30, 2019
8b9e891
Merge branch 'master' of github.com:emoncms/emoncms into feature/issu…
emrysr May 1, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1,032 changes: 1,032 additions & 0 deletions Lib/misc/nav_functions.php

Large diffs are not rendered by default.

469 changes: 432 additions & 37 deletions Lib/misc/sidebar.css

Large diffs are not rendered by default.

355 changes: 306 additions & 49 deletions Lib/misc/sidebar.js
@@ -1,61 +1,318 @@
function init_sidebar(options){
$(function(){
// re-create the bootstrap collapse... but slide from left
$(document).on('click', '[data-toggle="slide-collapse"]', function(event) {
event.preventDefault(event);
var collapsed = this.classList.contains('collapsed');
$btn = $(this);
target = $btn.data('target');
$('[data-toggle="slide-collapse"][data-target="' + target + '"]').toggleClass('collapsed', collapsed);
if (!collapsed) {
hide_sidebar();
} else {
show_sidebar();
}
});

default_options = {
max_wrapper_width: 1150,
sidebar_enabled: true,
sidebar_visible: true,
menu_element: "#example_menu"
}
options = options || {};
options = $.extend({}, default_options, options);
$menu_element = $(options.menu_element);
// open sidebar if active page link clicked
$('#left-nav li a').on('click', function(event){
event.preventDefault();
const $link = $(this);
const $sidebar_inner = $($link.data('sidebar')); // (.sidebar_inner)
const activeClass = 'active';

// show 2nd level - if on 3rd level
let secondlevel_menuitems = $('.sidebar-menu > li.collapse').length;
let open_secondlevel_menuitems = $('.sidebar-menu > li.collapse.in').length
let thirdLevelOpen = secondlevel_menuitems !== open_secondlevel_menuitems;

// alter tab states
$link.parent().addClass(activeClass).siblings().removeClass(activeClass);

// hide if not sidebar found
if ($sidebar_inner.length == 0) {
hide_sidebar();
} else {
if ($('body').hasClass('collapsed')) {
// closed sidebar
show_sidebar();
$sidebar_inner.addClass(activeClass).siblings().removeClass(activeClass)
} else {
// already open sidebar
if ($sidebar_inner.hasClass(activeClass)) {
// hide sidebar if clicked item already active and on 2nd level
if(!thirdLevelOpen) {
hide_sidebar();
} else {
$('.third-level-indicator').toggleClass('hidden', true);
hideMenuItems(event);
}
} else {
// enable correct sidebar inner based on clicked tab
$sidebar_inner.addClass(activeClass).siblings().removeClass(activeClass);
}
}
}
});

// on trigger sidebar hide/show
$('#sidebar').on('hide.sidebar.collapse show.sidebar.collapse', function(event){
// resize after slight delay
var interval = setInterval(function(){
if (typeof graph_resize === 'function'){
graph_resize();
}
if (typeof graph_draw === 'function'){
graph_draw();
}
}, 75);
// stop resizing
setTimeout(function(){
clearInterval(interval);
}, 300);
});

// on finish sidebar hide/show
$('#sidebar').on('hidden.sidebar.collapse shown.sidebar.collapse', function(event){
// resize once finished animating
if (typeof graph_resize === 'function'){
graph_resize();
}
if (typeof graph_draw === 'function'){
graph_draw();
}
if (typeof resize === 'function'){
resize();
}
});

// hide sidebar on smaller devices
window.addEventListener('resize', function(event) {
if ($(window).width() < 870) {
hide_sidebar();
document.body.classList.add('narrow');
}
if ($(window).width() >= 870 && $(document.body).hasClass('collapsed')) {
show_sidebar();
document.body.classList.remove('narrow');
}
})

if($menu_element.length>0){
$menu_element.find("i").removeClass("icon-home").addClass("icon-list");
$menu_element.parent().click(function(e){
e.preventDefault()
if (options.sidebar_visible) {
options.sidebar_enabled = false;
hide_sidebar(options);
// hide sidebar on load on narrow devices
if ($(window).width() < 870) {
document.body.classList.add('narrow','collapsed');
$('#sidebar').trigger('hidden.sidebar.collapse');
hide_sidebar();
// allow narrow screens to expand sidebar after delay to avoid animation of hiding sidebar
setTimeout(function(){
document.body.classList.add('has-animation');
}, 500);
}
/**
* If menu 3rd level menu shown shrink 2nd level entries
*
* @param {object} [event] mouse event if triggered by click
*/
function hideMenuItems(event) {
if (!event) return;

var $menu = $(event.target).parents('ul').first();
var clicked = false;
if (typeof event !== 'undefined') {
event.preventDefault();
event.stopPropagation();
clicked = true;
}
let link = $menu.find('li.active a');
if (clicked) {
// hide the back arrow from active third level links - on click
$(event.target).parents('.nav').first().find('.active .third-level-indicator').toggleClass('hidden');
}
let active_menu = link.parents('.sidebar-menu').first();
if(active_menu.length !== 1) return; // no menu found

let active_menu_name = active_menu.attr('id').split('-');
active_menu_name.shift();
if(typeof path === 'undefined') {
var path = '';
}
let relative_path = window.location.pathname.replace(path,''); // eg /emoncms/feed/list
let controller = relative_path.replace('/emoncms/','').split('/')[0]; // eg. feed
let include_id = [active_menu_name,controller,'sidebar','include'].join('-'); // eg. setup-feed-sidebar-include
let include = $('#' + include_id);

if (include.length == 1 && clicked) {
// show 3rd level menu
include.toggleClass('in');
// hide 2nd level menu items
$menu.find('li').not('.active').toggleClass('in');
}
}
function getQueryStringValue (key) {
return decodeURIComponent(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURIComponent(key).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
}
// add current page to user's bookmark list
$('#set-bookmark, #remove-bookmark').click(function(event){
event.preventDefault();
var bookmarks = [];
var $nav = $('#footer_nav');
var currentPage = window.location.href.replace(path,'');
var key = 'bookmarks';
var $button = $(this);
var $icon = $button.find('.icon');
var remove = $icon.is('.star');
var currentTitle = $('h2').first().text();
if(currentTitle.length==0) currentTitle = $('h3').first().text();
if(getQueryStringValue("name")) {
currentTitle = decodeURI(getQueryStringValue("name").replace('+',' '));
}
// get current bookmarks
$.get(path+'user/preferences.json',{preferences:key})
.done(function(data){
// catch json parsing errors
bookmarks = data || [];
if(!remove) {
// remove current page to bookmarks
var unique = false;
for(b in bookmarks) {
if (bookmarks[b]['path'] && bookmarks[b]['path'] !== currentPage){
unique = true;
}
}
if(unique || bookmarks.length === 0){
bookmarks.push({
'path': currentPage,
'text': currentTitle
})
}
} else {
options.sidebar_enabled = true;
show_sidebar(options);
// remove current page from bookmarks
var newBookmarks = [];
for(b in bookmarks) {
if (bookmarks[b]['path'] && bookmarks[b]['path'] !== currentPage){
newBookmarks.push(bookmarks[b]);
}
}
bookmarks = newBookmarks;
}
// save new user preferences
$.post(path+'user/preferences.json', {
preferences: {
bookmarks: JSON.stringify(bookmarks)
}
}, function(data) {
var $menu = $('#sidebar_user_dropdown');
var $template = $('#bookmark_link');
if(data.success) {
// saved successfully change icon
$('#set-bookmark, #remove-bookmark').parent().toggleClass('d-none');
if(!remove) {
// add new item to menu
$($template.html()).appendTo($menu)
.find('a').attr('href', path+currentPage)
.text(currentTitle).hide().fadeIn();
$nav.fadeIn();

} else {
// remove entry from menu
$.each($menu.find('li'), function(n, elem){
$li = $(elem);
var relative = $li.find('a').attr('href').replace(path,'');
if(relative === currentPage) {
$li.animate({height:0},function(){
$(this).remove();
setTimeout(function(){
if($menu.find('li').length == 0) {
$nav.fadeOut();
}
// $nav.toggleClass('d-none', $menu.find('li').length == 0);
},400)
});
}
});
}
}
});
});
sidebar_resize(options);
$(window).resize(function(){
sidebar_resize(options);
});
}
}
});

function sidebar_resize(options) {
options.width = $(window).width();
var height = $(window).height();
var nav = $(".navbar").height();
// show/hide sidebar includes
$(document).on('click', '#menu-emoncms li.active a', hideMenuItems);
// show hide 2nd / 3rd menu items
// setTimeout(hideMenuItems, 100);

$(".sidenav").height(height-nav);

if (options.width<options.max_wrapper_width) {
hide_sidebar(options)
} else {
if (options.sidebar_enabled) show_sidebar(options)
}
}
}); // end of jquery ready()



// trigger the events to allow module js scripts to attach actions to the events
function show_sidebar(options) {
options.sidebar_visible = true;
$(".sidenav").css("left","250px");
if (options.width>=options.max_wrapper_width) $("#wrapper").css("padding-left","250px");
$("#wrapper").css("margin","0");
$(".sidenav-open").hide();
$(".sidenav-close").hide();
// @note: assumes the css animation takes 300ms
$('#sidebar').trigger('show.sidebar.collapse');
setTimeout(function(){
$('#sidebar').trigger('shown.sidebar.collapse');
}, 350);
$('body').removeClass('collapsed').addClass('expanded');
}

function hide_sidebar(options) {
options.sidebar_visible = false;
$(".sidenav").css("left","0");
$("#wrapper").css("padding-left","0");
$("#wrapper").css("margin","0 auto");
$(".sidenav-open").show();
// @note: assumes the css animation takes 300ms
$('#sidebar').trigger('hide.sidebar.collapse');
setTimeout(function(){
$('#sidebar').trigger('hidden.sidebar.collapse');
}, 350);
$('body').addClass('collapsed').removeClass('expanded');
}


// backward compatible empty function
if(typeof init_sidebar !== 'function') var init_sidebar = function(){}



// get/set document cookies
var docCookies = {
getItem: function (sKey) {
if (!sKey) { return null; }
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
},
setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
var sExpires = "";
if (vEnd) {
switch (vEnd.constructor) {
case Number:
// sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;
sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; expires=" + (new Date(vEnd * 1e3 + Date.now())).toUTCString();
break;
case String:
sExpires = "; expires=" + vEnd;
break;
case Date:
sExpires = "; expires=" + vEnd.toUTCString();
break;
}
}
document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
return true;
},
removeItem: function (sKey, sPath, sDomain) {
if (!this.hasItem(sKey)) { return false; }
document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "");
return true;
},
hasItem: function (sKey) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
},
keys: function () {
var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
return aKeys;
}
};


// save a cookie to remember user's choice to hide or show the bookmarks
$('#sidebar_user_dropdown').on('show hide', function(event) {
var bookmarks_collapsed = event.type !== 'show';
docCookies.setItem('bookmarks_collapsed', bookmarks_collapsed)
})