Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge

This commit is contained in:
zotlabs 2017-10-09 15:14:44 -07:00
commit 8797049144
37 changed files with 436 additions and 84 deletions

View File

@ -383,6 +383,13 @@ class Apps {
$install_action = (($installed) ? t('Update') : t('Install')); $install_action = (($installed) ? t('Update') : t('Install'));
$icon = ((strpos($papp['photo'],'icon:') === 0) ? substr($papp['photo'],5) : ''); $icon = ((strpos($papp['photo'],'icon:') === 0) ? substr($papp['photo'],5) : '');
if($mode === 'navbar') {
return replace_macros(get_markup_template('app_nav.tpl'),array(
'$app' => $papp,
'$icon' => $icon,
));
}
return replace_macros(get_markup_template('app.tpl'),array( return replace_macros(get_markup_template('app.tpl'),array(
'$app' => $papp, '$app' => $papp,
'$icon' => $icon, '$icon' => $icon,

View File

@ -68,7 +68,7 @@ class ThreadStream {
// pull some trickery which allows us to re-invoke this function afterward // pull some trickery which allows us to re-invoke this function afterward
// it's an ugly hack so @FIXME // it's an ugly hack so @FIXME
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'); $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
$this->uploadable = false; $this->uploadable = perm_is_allowed($this->profile_owner,$ob_hash,'write_storage');
break; break;
case 'page': case 'page':
$this->profile_owner = \App::$profile['uid']; $this->profile_owner = \App::$profile['uid'];

View File

@ -8,7 +8,7 @@ class Bookmarks extends \Zotlabs\Web\Controller {
if(! local_channel()) if(! local_channel())
return; return;
nav_set_selected(t('View Bookmarks')); nav_set_selected('View Bookmarks');
$item_id = intval($_REQUEST['item']); $item_id = intval($_REQUEST['item']);
$burl = trim($_REQUEST['burl']); $burl = trim($_REQUEST['burl']);

View File

@ -824,7 +824,7 @@ class Cdav extends \Zotlabs\Web\Controller {
} }
if(argv(1) === 'calendar') { if(argv(1) === 'calendar') {
nav_set_selected(t('CalDAV')); nav_set_selected('CalDAV');
$caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo); $caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo);
$calendars = $caldavBackend->getCalendarsForUser($principalUri); $calendars = $caldavBackend->getCalendarsForUser($principalUri);
} }
@ -1025,7 +1025,7 @@ class Cdav extends \Zotlabs\Web\Controller {
if(argv(1) === 'addressbook') { if(argv(1) === 'addressbook') {
nav_set_selected(t('CardDAV')); nav_set_selected('CardDAV');
$carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo); $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);
$addressbooks = $carddavBackend->getAddressBooksForUser($principalUri); $addressbooks = $carddavBackend->getAddressBooksForUser($principalUri);
} }

View File

@ -94,7 +94,7 @@ class Channel extends \Zotlabs\Web\Controller {
} }
else { else {
if(\App::$profile['profile_uid'] == local_channel()) { if(\App::$profile['profile_uid'] == local_channel()) {
nav_set_selected(t('Channel Home')); nav_set_selected('Channel Home');
} }
} }

View File

@ -91,7 +91,7 @@ class Chat extends \Zotlabs\Web\Controller {
if(local_channel()) { if(local_channel()) {
$channel = \App::get_channel(); $channel = \App::get_channel();
nav_set_selected(t('My Chatrooms')); nav_set_selected('My Chatrooms');
} }
$ob = \App::get_observer(); $ob = \App::get_observer();

View File

@ -30,7 +30,7 @@ class Connections extends \Zotlabs\Web\Controller {
return login(); return login();
} }
nav_set_selected(t('Connections')); nav_set_selected('Connections');
$blocked = false; $blocked = false;
$hidden = false; $hidden = false;

View File

@ -77,7 +77,7 @@ class Directory extends \Zotlabs\Web\Controller {
$pubforums = get_directory_setting($observer, 'pubforums'); $pubforums = get_directory_setting($observer, 'pubforums');
$o = ''; $o = '';
nav_set_selected(t('Directory')); nav_set_selected('Directory');
if(x($_POST,'search')) if(x($_POST,'search'))
$search = notags(trim($_POST['search'])); $search = notags(trim($_POST['search']));

View File

@ -272,7 +272,7 @@ class Events extends \Zotlabs\Web\Controller {
return; return;
} }
nav_set_selected(t('Events')); nav_set_selected('Events');
if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) { if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
$r = q("update event set dismissed = 1 where id = %d and uid = %d", $r = q("update event set dismissed = 1 where id = %d and uid = %d",

View File

@ -15,7 +15,7 @@ require_once('include/help.php');
class Help extends \Zotlabs\Web\Controller { class Help extends \Zotlabs\Web\Controller {
function get() { function get() {
nav_set_selected(t('Help')); nav_set_selected('Help');
if($_REQUEST['search']) { if($_REQUEST['search']) {
$o .= '<div id="help-content" class="generic-content-wrapper">'; $o .= '<div id="help-content" class="generic-content-wrapper">';

View File

@ -95,7 +95,7 @@ class Invite extends \Zotlabs\Web\Controller {
return; return;
} }
nav_set_selected(t('Invite')); nav_set_selected('Invite');
$tpl = get_markup_template('invite.tpl'); $tpl = get_markup_template('invite.tpl');
$invonly = false; $invonly = false;

View File

@ -5,7 +5,7 @@ namespace Zotlabs\Module;
class Lang extends \Zotlabs\Web\Controller { class Lang extends \Zotlabs\Web\Controller {
function get() { function get() {
nav_set_selected(t('Language')); nav_set_selected('Language');
return lang_selector(); return lang_selector();
} }

View File

@ -140,7 +140,7 @@ class Mail extends \Zotlabs\Web\Controller {
function get() { function get() {
$o = ''; $o = '';
nav_set_selected(t('Mail')); nav_set_selected('Mail');
if(! local_channel()) { if(! local_channel()) {
notice( t('Permission denied.') . EOL); notice( t('Permission denied.') . EOL);

View File

@ -117,7 +117,7 @@ class Mood extends \Zotlabs\Web\Controller {
return; return;
} }
nav_set_selected(t('Mood')); nav_set_selected('Mood');
$parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0'); $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0');

View File

@ -154,7 +154,7 @@ class Network extends \Zotlabs\Web\Controller {
)); ));
} }
nav_set_selected(t('Activity')); nav_set_selected('Grid');
$channel_acl = array( $channel_acl = array(
'allow_cid' => $channel['channel_allow_cid'], 'allow_cid' => $channel['channel_allow_cid'],

View File

@ -555,7 +555,7 @@ class Photos extends \Zotlabs\Web\Controller {
$sql_extra = permissions_sql($owner_uid,get_observer_hash(),'photo'); $sql_extra = permissions_sql($owner_uid,get_observer_hash(),'photo');
$sql_attach = permissions_sql($owner_uid,get_observer_hash(),'attach'); $sql_attach = permissions_sql($owner_uid,get_observer_hash(),'attach');
nav_set_selected(t('Photos')); nav_set_selected('Photos');
$o = ""; $o = "";

View File

@ -150,7 +150,7 @@ class Poke extends \Zotlabs\Web\Controller {
return; return;
} }
nav_set_selected(t('Poke')); nav_set_selected('Poke');
$name = ''; $name = '';
$id = ''; $id = '';

View File

@ -8,7 +8,7 @@ class Probe extends \Zotlabs\Web\Controller {
function get() { function get() {
nav_set_selected(t('Remote Diagnostics')); nav_set_selected('Remote Diagnostics');
$o .= '<h3>Probe Diagnostic</h3>'; $o .= '<h3>Probe Diagnostic</h3>';

View File

@ -61,7 +61,7 @@ class Rpost extends \Zotlabs\Web\Controller {
return login(); return login();
} }
nav_set_selected(t('Post')); nav_set_selected('Post');
// If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables // If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables

View File

@ -22,7 +22,7 @@ class Search extends \Zotlabs\Web\Controller {
if($load) if($load)
$_SESSION['loadtime'] = datetime_convert(); $_SESSION['loadtime'] = datetime_convert();
nav_set_selected(t('Search')); nav_set_selected('Search');
require_once("include/bbcode.php"); require_once("include/bbcode.php");
require_once('include/security.php'); require_once('include/security.php');

View File

@ -29,7 +29,7 @@ class Suggest extends \Zotlabs\Web\Controller {
return; return;
} }
nav_set_selected(t('Suggest Channels')); nav_set_selected('Suggest Channels');
$_SESSION['return_url'] = z_root() . '/' . \App::$cmd; $_SESSION['return_url'] = z_root() . '/' . \App::$cmd;

View File

@ -35,7 +35,7 @@ class Webpages extends \Zotlabs\Web\Controller {
return; return;
} }
nav_set_selected(t('Webpages')); nav_set_selected('Webpages');
$which = argv(1); $which = argv(1);

View File

@ -76,7 +76,7 @@ class Wiki extends \Zotlabs\Web\Controller {
$wiki_owner = true; $wiki_owner = true;
nav_set_selected(t('Wiki')); nav_set_selected('Wiki');
// Obtain the default permission settings of the channel // Obtain the default permission settings of the channel
$owner_acl = array( $owner_acl = array(

View File

@ -121,6 +121,11 @@ class Comanche {
if($cnt) if($cnt)
\App::$layout['theme'] = trim($matches[1]); \App::$layout['theme'] = trim($matches[1]);
$cnt = preg_match("/\[navbar\](.*?)\[\/navbar\]/ism", $s, $matches);
if($cnt)
\App::$layout['navbar'] = trim($matches[1]);
$cnt = preg_match_all("/\[webpage\](.*?)\[\/webpage\]/ism", $s, $matches, PREG_SET_ORDER); $cnt = preg_match_all("/\[webpage\](.*?)\[\/webpage\]/ism", $s, $matches, PREG_SET_ORDER);
if($cnt) { if($cnt) {
// only the last webpage definition is used if there is more than one // only the last webpage definition is used if there is more than one

View File

@ -244,7 +244,7 @@ class Browser extends DAV\Browser\Plugin {
$a = false; $a = false;
nav_set_selected(t('Files')); nav_set_selected('Files');
\App::$page['content'] = $html; \App::$page['content'] = $html;
load_pdl(); load_pdl();

View File

@ -2090,17 +2090,21 @@ function construct_page() {
$installing = false; $installing = false;
$navbar = get_config('system','navbar','nav');
if(App::$profile_uid) {
$navbar = get_pconfig(App::$profile_uid,'system','navbar',$navbar);
}
if($comanche && App::$layout['navbar']) {
$navbar = App::$layout['navbar'];
}
if (App::$module == 'setup') { if (App::$module == 'setup') {
$installing = true; $installing = true;
} else { } else {
nav($a); nav($navbar);
} }
if ($comanche) {
if (App::$layout['nav']) {
App::$page['nav'] = get_custom_nav(App::$layout['nav']);
}
}
$current_theme = Zotlabs\Render\Theme::current(); $current_theme = Zotlabs\Render\Theme::current();

View File

@ -634,6 +634,15 @@ This will select the theme named &quot;suckerberg&quot; and select the &quot;pas
The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier. The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier.
[h4]Navbar[/h4]
[code]
[navbar]tucson[/navbar]
[/code]
Use the 'tucson' navbar template and CSS rules. By default the 'nav' navbar template will be used.
[h4]Regions[/h4] [h4]Regions[/h4]
Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag. Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.

View File

@ -6,7 +6,7 @@ require_once('include/security.php');
require_once('include/menu.php'); require_once('include/menu.php');
function nav() { function nav($template = 'nav') {
/** /**
* *
@ -103,12 +103,12 @@ EOT;
$nav['logout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn']; $nav['logout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn'];
// user menu // user menu
$nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), ((\App::$nav_sel['active'] == 'Profile') ? 'active' : ''), t('Your profile page'),'profile_nav_btn']; $nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), ((\App::$nav_sel['name'] == 'Profile') ? 'active' : ''), t('Your profile page'),'profile_nav_btn'];
if(feature_enabled(local_channel(),'multi_profiles')) if(feature_enabled(local_channel(),'multi_profiles'))
$nav['usermenu'][] = ['profiles', t('Edit Profiles'), ((\App::$nav_sel['active'] == 'Profiles') ? 'active' : '') , t('Manage/Edit profiles'),'profiles_nav_btn']; $nav['usermenu'][] = ['profiles', t('Edit Profiles'), ((\App::$nav_sel['name'] == 'Profiles') ? 'active' : '') , t('Manage/Edit profiles'),'profiles_nav_btn'];
else else
$nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'), ((\App::$nav_sel['active'] == 'Profiles') ? 'active' : ''), t('Edit your profile'),'profiles_nav_btn']; $nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'), ((\App::$nav_sel['name'] == 'Profiles') ? 'active' : ''), t('Edit your profile'),'profiles_nav_btn'];
} }
else { else {
@ -233,6 +233,15 @@ EOT;
// turned off until somebody discovers this and figures out a good location for it. // turned off until somebody discovers this and figures out a good location for it.
$powered_by = ''; $powered_by = '';
$active_app = q("SELECT app_url FROM app WHERE app_channel = %d AND app_name = '%s' LIMIT 1",
intval($channel['channel_id']),
dbesc(\App::$nav_sel['raw_name'])
);
if($active_app) {
$url = $active_app[0]['app_url'];
}
//app bin //app bin
if($is_owner) { if($is_owner) {
if(get_pconfig(local_channel(), 'system','initial_import_system_apps') === false) { if(get_pconfig(local_channel(), 'system','initial_import_system_apps') === false) {
@ -258,16 +267,33 @@ EOT;
$syslist = Zlib\Apps::app_order(local_channel(),$syslist); $syslist = Zlib\Apps::app_order(local_channel(),$syslist);
foreach($syslist as $app) { foreach($syslist as $app) {
if(\App::$nav_sel['active'] == $app['name']) if(\App::$nav_sel['name'] == $app['name'])
$app['active'] = true; $app['active'] = true;
if($is_owner) if($is_owner) {
$nav_apps[] = Zlib\Apps::app_render($app,'nav'); $nav_apps[] = Zlib\Apps::app_render($app,'nav');
elseif(! $is_owner && strpos($app['requires'], 'local_channel') === false) if(strpos($app['categories'],'navbar_' . $template)) {
$navbar_apps[] = Zlib\Apps::app_render($app,'navbar');
}
}
elseif(! $is_owner && strpos($app['requires'], 'local_channel') === false) {
$nav_apps[] = Zlib\Apps::app_render($app,'nav'); $nav_apps[] = Zlib\Apps::app_render($app,'nav');
if(strpos($app['categories'],'navbar_' . $template)) {
$navbar_apps[] = Zlib\Apps::app_render($app,'navbar');
}
}
} }
$c = theme_include('navbar_' . $template . '.css');
$tpl = get_markup_template('navbar_' . $template . '.tpl');
if($c && $tpl) {
head_add_css('navbar_' . $template . '.css');
}
if(! $tpl) {
$tpl = get_markup_template('nav.tpl'); $tpl = get_markup_template('nav.tpl');
}
App::$page['nav'] .= replace_macros($tpl, array( App::$page['nav'] .= replace_macros($tpl, array(
'$baseurl' => z_root(), '$baseurl' => z_root(),
@ -285,13 +311,14 @@ EOT;
'$help' => t('@name, #tag, ?doc, content'), '$help' => t('@name, #tag, ?doc, content'),
'$pleasewait' => t('Please wait...'), '$pleasewait' => t('Please wait...'),
'$nav_apps' => $nav_apps, '$nav_apps' => $nav_apps,
'$navbar_apps' => $navbar_apps,
'$channel_menu' => get_config('system','channel_menu'), '$channel_menu' => get_config('system','channel_menu'),
'$channel_thumb' => ((App::$profile) ? App::$profile['thumb'] : ''), '$channel_thumb' => ((App::$profile) ? App::$profile['thumb'] : ''),
'$channel_apps' => $channel_apps, '$channel_apps' => $channel_apps,
'$addapps' => t('Add Apps'), '$addapps' => t('Add Apps'),
'$orderapps' => t('Arrange Apps'), '$orderapps' => t('Arrange Apps'),
'$sysapps_toggle' => t('Toggle System Apps'), '$sysapps_toggle' => t('Toggle System Apps'),
'$loc' => $myident '$url' => $url
)); ));
if(x($_SESSION, 'reload_avatar') && $observer) { if(x($_SESSION, 'reload_avatar') && $observer) {
@ -314,7 +341,10 @@ EOT;
* *
*/ */
function nav_set_selected($item){ function nav_set_selected($item){
App::$nav_sel['active'] = $item; App::$nav_sel['raw_name'] = $item;
$item = ['name' => $item];
Zlib\Apps::translate_system_apps($item);
App::$nav_sel['name'] = $item['name'];
} }
@ -490,7 +520,6 @@ function channel_apps($is_owner = false, $nickname = null) {
'$tabs' => $arr['tabs'], '$tabs' => $arr['tabs'],
'$name' => App::$profile['channel_name'], '$name' => App::$profile['channel_name'],
'$thumb' => App::$profile['thumb'], '$thumb' => App::$profile['thumb'],
'$channel_menu' => get_config('system','channel_menu')
] ]
); );
} }

View File

@ -445,10 +445,10 @@ function NavUpdate() {
updateCountsOnly = false; updateCountsOnly = false;
if(data.network || data.home || data.intros || data.register || data.mail || data.all_events || data.notify || data.files || data.pubs) { if(data.network || data.home || data.intros || data.register || data.mail || data.all_events || data.notify || data.files || data.pubs) {
$('#notifications-btn').css('opacity', 1); $('#notifications-btn, #notifications-btn-1').css('opacity', 1);
} }
else { else {
$('#notifications-btn').css('opacity', 0.5); $('#notifications-btn, #notifications-btn-1').css('opacity', 0.5);
$('#navbar-collapse-1').removeClass('show'); $('#navbar-collapse-1').removeClass('show');
} }

View File

@ -15,7 +15,7 @@
<div id="page-footer"></div> <div id="page-footer"></div>
<div id="pause"></div> <div id="pause"></div>
</section> </section>
<aside id="region_3" class="d-none d-xl-table-cell"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside> <aside id="region_3" class="d-none d-xl-table-cell"><div id="right_aside_spacer"><div id="right_aside_wrapper"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></div></div></aside>
</main> </main>
<footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer> <footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
</body> </body>

View File

@ -161,6 +161,10 @@ nav {
filter:alpha(opacity=$nav_percent_min_opacity); filter:alpha(opacity=$nav_percent_min_opacity);
} }
#nav-app-link {
white-space: nowrap;
}
#powered-by { #powered-by {
font-size: 0.5rem; font-size: 0.5rem;
position: absolute; position: absolute;
@ -1454,6 +1458,10 @@ blockquote {
background-color: $nav_bg !important; background-color: $nav_bg !important;
} }
.navbar {
z-index:1030;
}
.navbar-dark .navbar-nav .nav-link, .navbar-dark .navbar-nav .nav-link,
.usermenu i { .usermenu i {
color: $nav_icon_colour; color: $nav_icon_colour;

View File

@ -22,13 +22,13 @@ $(document).ready(function() {
parent: 'main', parent: 'main',
spacer: '#left_aside_spacer' spacer: '#left_aside_spacer'
}); });
$('#right_aside_wrapper').stick_in_parent({
offset_top: parseInt($('#region_3').css('padding-top')),
parent: 'main',
spacer: '#right_aside_spacer'
});
} }
if(($(window).width() < 767) && ($('#left_aside_wrapper .widget, #left_aside_wrapper .vcard').length > 0))
$('#expand-aside').show();
else
$('#expand-aside').hide();
$('#expand-aside').on('click', toggleAside); $('#expand-aside').on('click', toggleAside);
$('section').on('click', function() { $('section').on('click', function() {
@ -64,8 +64,14 @@ $(document).ready(function() {
} }
}); });
var notifications_parent = $('#notifications')[0].parentElement.id;
$('#notifications-btn-1').click(function() { $('#notifications-btn-1').click(function() {
$('#region_3').toggleClass('fs'); if($('#notifications').hasClass('fs'))
$('#notifications').prependTo('#' + notifications_parent);
else
$('#notifications').prependTo('body');
$('#notifications').toggleClass('fs');
if($('#navbar-collapse-2').hasClass('show')){ if($('#navbar-collapse-2').hasClass('show')){
$('#navbar-collapse-2').removeClass('show'); $('#navbar-collapse-2').removeClass('show');
} }

1
view/tpl/app_nav.tpl Normal file
View File

@ -0,0 +1 @@
<a class="navbar-app nav-link{{if $app.active}} active{{/if}}" href="{{$app.url}}" title="{{$app.name}}" >{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" />{{/if}}</a>

View File

@ -22,7 +22,7 @@
<a class="dropdown-item{{if $usermenu.2}} active{{/if}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a> <a class="dropdown-item{{if $usermenu.2}} active{{/if}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a>
{{/foreach}} {{/foreach}}
{{if $nav.manage}} {{if $nav.manage}}
<a class="dropdown-item{{if $sel.active == Manage}} active{{/if}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a> <a class="dropdown-item{{if $sel.name == Manage}} active{{/if}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a>
{{/if}} {{/if}}
{{if $nav.channels}} {{if $nav.channels}}
{{foreach $nav.channels as $chan}} {{foreach $nav.channels as $chan}}
@ -34,11 +34,11 @@
{{/if}} {{/if}}
{{if $nav.settings}} {{if $nav.settings}}
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item{{if $sel.active == Settings}} active{{/if}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a> <a class="dropdown-item{{if $sel.name == Settings}} active{{/if}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a>
{{/if}} {{/if}}
{{if $nav.admin}} {{if $nav.admin}}
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item{{if $sel.active == Admin}} active{{/if}}" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a> <a class="dropdown-item{{if $sel.name == Admin}} active{{/if}}" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a>
{{/if}} {{/if}}
{{if $nav.logout}} {{if $nav.logout}}
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
@ -53,6 +53,9 @@
</div> </div>
{{/if}} {{/if}}
</div> </div>
<div class="navbar-nav mr-auto">
<div><a id="nav-app-link" href="{{$url}}" class="nav-link">{{$sel.name}}</a></div>
</div>
{{/if}} {{/if}}
<div class="navbar-toggler-right"> <div class="navbar-toggler-right">
{{if $nav.help.6}} {{if $nav.help.6}}
@ -60,7 +63,7 @@
<i class="fa fa-question-circle"></i> <i class="fa fa-question-circle"></i>
</button> </button>
{{/if}} {{/if}}
<button id="expand-aside" type="button" class="navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1"> <button id="expand-aside" type="button" class="d-md-none navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1">
<i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i> <i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i>
</button> </button>
{{if ! $experimental_notif}} {{if ! $experimental_notif}}
@ -212,9 +215,7 @@
{{/if}} {{/if}}
</ul> </ul>
{{else}} {{else}}
<div class="navbar-nav mr-auto"> <div class="navbar-text mr-auto d-none d-xl-flex"></div>
<div class="text-white">{{$sel.active}}</div>
</div>
{{/if}} {{/if}}
<div id="banner" class="navbar-text d-none d-xl-flex">{{$banner}}</div> <div id="banner" class="navbar-text d-none d-xl-flex">{{$banner}}</div>
@ -252,6 +253,7 @@
{{foreach $channel_apps as $channel_app}} {{foreach $channel_apps as $channel_app}}
{{$channel_app}} {{$channel_app}}
{{/foreach}} {{/foreach}}
<div class="dropdown-divider"></div>
<div class="dropdown-header sys-apps-toggle" onclick="$('#dropdown-menu').click(function(e) { e.stopPropagation(); }); openClose('sys_apps');"> <div class="dropdown-header sys-apps-toggle" onclick="$('#dropdown-menu').click(function(e) { e.stopPropagation(); }); openClose('sys_apps');">
{{$sysapps_toggle}} {{$sysapps_toggle}}
</div> </div>

296
view/tpl/navbar_tucson.tpl Executable file
View File

@ -0,0 +1,296 @@
{{if $nav.login && !$userinfo}}
<div class="d-xl-none pt-1 pb-1">
<a class="btn btn-primary btn-sm text-white" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login">
{{$nav.loginmenu.1.1}}
</a>
{{if $nav.register}}
<a class="btn btn-warning btn-sm text-dark" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" >
{{$nav.register.1}}
</a>
{{/if}}
</div>
{{/if}}
{{if $userinfo}}
<div class="dropdown usermenu">
<div class="fakelink" data-toggle="dropdown">
<img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
<i class="fa fa-caret-down"></i>
</div>
{{if $is_owner}}
<div class="dropdown-menu">
{{foreach $nav.usermenu as $usermenu}}
<a class="dropdown-item{{if $usermenu.2}} active{{/if}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a>
{{/foreach}}
{{if $nav.manage}}
<a class="dropdown-item{{if $sel.active == Manage}} active{{/if}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a>
{{/if}}
{{if $nav.channels}}
{{foreach $nav.channels as $chan}}
<a class="dropdown-item" href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem"><i class="fa fa-circle{{if $localuser == $chan.channel_id}} text-success{{else}} invisible{{/if}}"></i> {{$chan.channel_name}}</a>
{{/foreach}}
{{/if}}
{{if $nav.profiles}}
<a class="dropdown-item" href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a>
{{/if}}
{{if $nav.settings}}
<div class="dropdown-divider"></div>
<a class="dropdown-item{{if $sel.active == Settings}} active{{/if}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a>
{{/if}}
{{if $nav.logout}}
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a>
{{/if}}
</div>
{{/if}}
{{if ! $is_owner}}
<div class="dropdown-menu" role="menu" aria-labelledby="avatar">
<a class="dropdown-item" href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a>
<a class="dropdown-item" href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a>
</div>
{{/if}}
</div>
{{/if}}
<div class="navbar-toggler-right">
{{if $nav.help.6}}
<button id="context-help-btn" class="navbar-toggler border-0" type="button" onclick="contextualHelp(); return false;">
<i class="fa fa-question-circle"></i>
</button>
{{/if}}
<button id="expand-aside" type="button" class="navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1">
<i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i>
</button>
{{if ! $experimental_notif}}
{{if $localuser || $nav.pubs}}
<button id="notifications-btn" type="button" class="navbar-toggler border-0 text-white" data-toggle="collapse" data-target="#navbar-collapse-1">
<i class="fa fa-exclamation-circle"></i>
</button>
{{/if}}
{{else}}
{{if $localuser || $nav.pubs}}
<button id="notifications-btn-1" type="button" class="navbar-toggler border-0 text-white">
<i class="fa fa-exclamation-circle"></i>
</button>
{{/if}}
{{/if}}
<button id="menu-btn" class="navbar-toggler border-0" type="button" data-toggle="collapse" data-target="#navbar-collapse-2">
<i class="fa fa-bars"></i>
</button>
</div>
<div class="collapse navbar-collapse" id="navbar-collapse-1">
{{if ! $experimental_notif}}
<ul class="navbar-nav mr-auto">
{{if $nav.network}}
<li class="nav-item dropdown network-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#nav-network-menu">
<i class="fa fa-fw fa-th"></i>
<span class="badge badge-pill badge-secondary network-update"></span>
</a>
<div id="nav-network-menu" class="dropdown-menu" rel="network">
<a class="dropdown-item" id="nav-network-see-all" href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a>
<a class="dropdown-item" id="nav-network-mark-all" href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a>
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.home}}
<li class="nav-item dropdown home-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.home.3}}" id="{{$nav.home.4}}" data-toggle="dropdown" rel="#nav-home-menu">
<i class="fa fa-fw fa-home"></i>
<span class="badge badge-pill badge-danger home-update"></span>
</a>
<div id="nav-home-menu" class="dropdown-menu" rel="home">
<a class="dropdown-item" id="nav-home-see-all" href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a>
<a class="dropdown-item" id="nav-home-mark-all" href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a>
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.messages}}
<li class="nav-item dropdown mail-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}" data-toggle="dropdown" rel="#nav-mail-menu">
<i class="fa fa-fw fa-envelope"></i>
<span class="badge badge-pill badge-danger mail-update"></span>
</a>
<div id="nav-mail-menu" class="dropdown-menu" rel="messages">
<a class="dropdown-item" id="nav-messages-see-all" href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a>
<a class="dropdown-item" id="nav-messages-mark-all" href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a>
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.all_events}}
<li class="nav-item dropdown all_events-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#nav-all_events-menu">
<i class="fa fa-fw fa-calendar"></i>
<span class="badge badge-pill badge-secondary all_events-update"></span>
</a>
<div id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
<a class="dropdown-item" id="nav-all_events-see-all" href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a>
<a class="dropdown-item" id="nav-all_events-mark-all" href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a>
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.intros}}
<li class="nav-item dropdown intros-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}" data-toggle="dropdown" rel="#nav-intros-menu">
<i class="fa fa-fw fa-users"></i>
<span class="badge badge-pill badge-danger intros-update"></span>
</a>
<div id="nav-intros-menu" class="dropdown-menu" rel="intros">
<a class="dropdown-item" id="nav-intros-see-all" href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a>
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.registrations}}
<li class="nav-item dropdown register-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.registrations.3}}" id="{{$nav.registrations.4}}" data-toggle="dropdown" rel="#nav-register-menu">
<i class="fa fa-fw fa-user-o"></i>
<span class="badge badge-pill badge-danger register-update"></span>
</a>
<div id="nav-register-menu" class="dropdown-menu" rel="register">
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.notifications}}
<li class="nav-item dropdown notify-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}" data-toggle="dropdown" rel="#nav-notify-menu">
<i class="fa fa-fw fa-exclamation"></i>
<span class="badge badge-pill badge-danger notify-update"></span>
</a>
<div id="nav-notify-menu" class="dropdown-menu" rel="notify">
<a class="dropdown-item" id="nav-notify-see-all" href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a>
<a class="dropdown-item" id="nav-notify-mark-all" href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a>
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.files}}
<li class="nav-item dropdown files-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.files.3}}" id="{{$nav.files.4}}" data-toggle="dropdown" rel="#nav-files-menu">
<i class="fa fa-fw fa-folder"></i>
<span class="badge badge-pill badge-danger files-update"></span>
</a>
<div id="nav-files-menu" class="dropdown-menu" rel="files">
{{$emptynotifications}}
</div>
</li>
{{/if}}
{{if $nav.login && !$userinfo}}
<li class="nav-item d-none d-xl-flex">
<a class="nav-link" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login">{{$nav.loginmenu.1.1}}</a>
</li>
{{/if}}
{{if $nav.register}}
<li class="nav-item {{$nav.register.2}} d-none d-xl-flex">
<a class="nav-link" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a>
</li>
{{/if}}
{{if $nav.alogout}}
<li class="nav-item {{$nav.alogout.2}} d-none d-xl-flex">
<a class="nav-link" href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a>
</li>
{{/if}}
{{if $nav.pubs}}
<li class="nav-item dropdown pubs-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.pubs.3}}" id="{{$nav.pubs.4}}" data-toggle="dropdown" rel="#nav-pubs-menu">
<i class="fa fa-fw fa-globe"></i>
<span class="badge badge-pill badge-secondary pubs-update"></span>
</a>
<div id="nav-pubs-menu" class="dropdown-menu" rel="pubs">
<a class="dropdown-item" id="nav-pubs-see-all" href="{{$nav.pubs.all.0}}">{{$nav.pubs.all.1}}</a>
<a class="dropdown-item" id="nav-pubs-mark-all" href="#" onclick="markRead('pubs'); return false;">{{$nav.pubs.mark.1}}</a>
{{$emptynotifications}}
</div>
</li>
{{/if}}
</ul>
{{/if}}
<div id="banner" class="navbar-text d-none d-xl-flex">{{$banner}}</div>
<ul id="nav-right" class="navbar-nav ml-auto d-none d-xl-flex">
{{if $navbar_apps}}
{{foreach $navbar_apps as $navbar_app}}
<li class="nav-navbar-apps">
{{$navbar_app}}
</li>
{{/foreach}}
{{/if}}
<li class="nav-item collapse clearfix" id="nav-search">
<form class="form-inline" method="get" action="search" role="search">
<input class="form-control form-control-sm mt-1 mr-2" id="nav-search-text" type="text" value="" placeholder="&#xf002; {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/>
</form>
<div id="nav-search-spinner" class="spinner-wrapper">
<div class="spinner s"></div>
</div>
</li>
<li class="nav-item" id="nav-search-btn">
<a class="nav-link" href="#nav-search" title="{{$nav.search.3}}" onclick="openMenu('nav-search'); closeMenu('nav-search-btn'); $('#nav-search-text').focus(); return false;"><i class="fa fa-fw fa-search"></i></a>
</li>
{{if $nav.help.6}}
<li class="nav-item dropdown {{$sel.help}}">
<a class="nav-link {{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="contextualHelp(); return false;"><i class="fa fa-fw fa-question-circle"></i></a>
</li>
{{/if}}
{{if $channel_apps.0}}
<li class="nav-item dropdown" id="channel-menu">
<a class="nav-link" href="#" data-toggle="dropdown"><img src="{{$channel_thumb}}" style="height:14px; width:14px;position:relative; top:-2px;" /></a>
<div id="dropdown-menu" class="dropdown-menu dropdown-menu-right">
{{foreach $channel_apps as $channel_app}}
{{$channel_app}}
{{/foreach}}
</div>
</li>
{{/if}}
<li class="nav-item dropdown" id="app-menu">
<a class="nav-link" href="#" data-toggle="dropdown"><i class="fa fa-fw fa-bars"></i></a>
<div id="dropdown-menu" class="dropdown-menu dropdown-menu-right">
{{foreach $nav_apps as $nav_app}}
{{$nav_app}}
{{/foreach}}
{{if $is_owner}}
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
<a class="dropdown-item" href="/apporder"><i class="generic-icons-nav fa fa-fw fa-sort"></i>{{$orderapps}}</a>
{{/if}}
</div>
</li>
</ul>
</div>
<div class="collapse d-xl-none" id="navbar-collapse-2">
<div class="navbar-nav mr-auto">
{{if $channel_apps.0}}
{{foreach $channel_apps as $channel_app}}
{{$channel_app|replace:'dropdown-item':'nav-link'}}
{{/foreach}}
<div class="dropdown-header sys-apps-toggle" onclick="openClose('sys-apps-collapsed');">
{{$sysapps_toggle}}
</div>
<div id="sys-apps-collapsed" style="display:none;">
{{/if}}
{{foreach $nav_apps as $nav_app}}
{{$nav_app|replace:'dropdown-item':'nav-link'}}
{{/foreach}}
{{if $channel_apps.0}}
</div>
{{/if}}
{{if $is_owner}}
<div class="dropdown-divider"></div>
<a class="nav-link" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
<a class="nav-link" href="/apporder"><i class="generic-icons-nav fa fa-fw fa-sort"></i>{{$orderapps}}</a>
{{/if}}
</div>
</div>
{{if $nav.help.6}}
<div id="contextual-help-content" class="contextual-help-content">
{{$nav.help.5}}
<div class="float-right">
<a class="btn btn-primary btn-sm" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}"><i class="fa fa-question"></i>&nbsp;{{$fulldocs}}</a>
<a class="contextual-help-tool" href="#" onclick="contextualHelp(); return false;"><i class="fa fa-times"></i></a>
</div>
</div>
{{/if}}

View File

@ -1,13 +1,6 @@
<style> <style>
#notifications {
position: fixed;
top: 4.5rem;
width: 266px;
padding: 0 .5rem;
}
.notification-content { .notification-content {
max-height: 50vh; max-height: 70vh;
overflow: auto; overflow: auto;
} }
@ -19,21 +12,18 @@
position: fixed; position: fixed;
top: 0px; top: 0px;
left: 0px; left: 0px;
display: block !important; padding: 4.5rem .5rem 0 .5rem;
background-color: white; background-color: white;
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
height: 100vh; height: 100vh;
z-index: 1020; z-index: 1030;
}
.fs #notifications {
position: relative;
width: 100%;
top: 0px;
} }
</style> </style>
<div id="notifications" class="navbar-nav" data-children=".nav-item">
<div id="nav-notifications-template" rel="template"> <div id="nav-notifications-template" rel="template">
<a class="dropdown-item clearfix dropdown-notification {5}" href="{0}" title="{2} {3}"> <a class="dropdown-item clearfix dropdown-notification {5}" href="{0}" title="{2} {3}">
<img class="menu-img-3" data-src="{1}"> <img class="menu-img-3" data-src="{1}">
@ -41,8 +31,6 @@
<span class="dropdown-sub-text">{3}<br>{4}</span> <span class="dropdown-sub-text">{3}<br>{4}</span>
</a> </a>
</div> </div>
<div id="notifications" class="navbar-nav" data-children=".nav-item">
{{foreach $notifications as $notification}} {{foreach $notifications as $notification}}
<div class="collapse {{$notification.type}}-button"> <div class="collapse {{$notification.type}}-button">
<a class="list-group-item" href="#nav-{{$notification.type}}-menu" title="{{$notification.title}}" data-toggle="collapse" data-parent="#notifications" rel="#nav-{{$notification.type}}-menu"> <a class="list-group-item" href="#nav-{{$notification.type}}-menu" title="{{$notification.title}}" data-toggle="collapse" data-parent="#notifications" rel="#nav-{{$notification.type}}-menu">

View File

@ -2,6 +2,3 @@
{{foreach $tabs as $tab}} {{foreach $tabs as $tab}}
<a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}><i class="fa fa-fw fa-{{$tab.icon}} generic-icons-nav"></i>{{$tab.label}}</a> <a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}><i class="fa fa-fw fa-{{$tab.icon}} generic-icons-nav"></i>{{$tab.label}}</a>
{{/foreach}} {{/foreach}}
{{if ! $channel_menu}}
<div class="dropdown-divider"></div>
{{/if}}