mirror of
https://github.com/openvk/openvk
synced 2024-12-23 17:12:01 +03:00
3c4b3221e2
This commit adds keyboard shortcuts for Home, Search, User Profile, Wall, Notifications, and Admin Panel for (hopefully) quick navigation through these sections. Keep in mind that the hints to these sections (e.g. "[Alt+Shift+<KEY>]") will only be relevant to modern browsers. Refer to this link: https://developer.mozilla.org/docs/Web/HTML/Global_attributes/accesskey
333 lines
18 KiB
XML
333 lines
18 KiB
XML
{var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
|
|
|
|
<!DOCTYPE html>
|
|
<html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'">
|
|
<head>
|
|
<title>
|
|
{ifset title}{include title} - {/ifset}{$instance_name}
|
|
</title>
|
|
<meta charset="utf-8" />
|
|
<link rel="shortcut icon" href="/assets/packages/static/openvk/img/icon.ico" />
|
|
<meta name="application-name" content="{$instance_name}" />
|
|
<meta n:ifset="$csrfToken" name="csrf" value="{$csrfToken}" />
|
|
|
|
<script src="/language/{php echo getLanguage()}.js" crossorigin="anonymous"></script>
|
|
{script "js/node_modules/jquery/dist/jquery.min.js"}
|
|
{script "js/node_modules/umbrellajs/umbrella.min.js"}
|
|
{script "js/l10n.js"}
|
|
{script "js/openvk.cls.js"}
|
|
|
|
{if $isTimezoned == null}
|
|
{script "js/timezone.js"}
|
|
{/if}
|
|
|
|
{ifset $thisUser}
|
|
{if $thisUser->getNsfwTolerance() < 2}
|
|
{css "css/nsfw-posts.css"}
|
|
{/if}
|
|
|
|
{if $theme !== null}
|
|
{if $theme->inheritDefault()}
|
|
{css "css/style.css"}
|
|
{css "css/dialog.css"}
|
|
{css "css/notifications.css"}
|
|
|
|
{if $isXmas}
|
|
{css "css/xmas.css"}
|
|
{/if}
|
|
{/if}
|
|
|
|
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/stylesheet/styles.css" />
|
|
|
|
{if $isXmas}
|
|
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/resource/xmas.css" />
|
|
{/if}
|
|
{else}
|
|
{css "css/style.css"}
|
|
{css "css/dialog.css"}
|
|
{css "css/notifications.css"}
|
|
|
|
{if $isXmas}
|
|
{css "css/xmas.css"}
|
|
{/if}
|
|
{/if}
|
|
|
|
{if $thisUser->getStyleAvatar() == 1}
|
|
{css "css/avatar.1.css"}
|
|
{/if}
|
|
|
|
{if $thisUser->getStyleAvatar() == 2}
|
|
{css "css/avatar.2.css"}
|
|
{/if}
|
|
|
|
{if $thisUser->hasMicroblogEnabled() == 1}
|
|
{css "css/microblog.css"}
|
|
{/if}
|
|
{else}
|
|
{css "css/style.css"}
|
|
{css "css/dialog.css"}
|
|
{css "css/nsfw-posts.css"}
|
|
{css "css/notifications.css"}
|
|
|
|
{if $isXmas}
|
|
{css "css/xmas.css"}
|
|
{/if}
|
|
{/ifset}
|
|
|
|
{ifset headIncludes}
|
|
{include headIncludes}
|
|
{/ifset}
|
|
</head>
|
|
<body>
|
|
<div id="sudo-banner" n:if="isset($thisUser) && $userTainted">
|
|
<p>
|
|
Вы вошли как <b>{$thisUser->getCanonicalName()}</b>. Пожалуйста, уважайте
|
|
право на тайну переписки других людей и не злоупотребляйте подменой пользователя.
|
|
Нажмите <a href="/setSID/unset?hash={rawurlencode($csrfToken)}">здесь</a>, чтобы выйти.
|
|
</p>
|
|
</div>
|
|
|
|
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['testLabel']" id="test-label">FOR TESTING PURPOSES ONLY</div>
|
|
|
|
<div class="notifications_global_wrap"></div>
|
|
<div class="dimmer"></div>
|
|
|
|
<div class="toTop">
|
|
⬆ {_to_top}
|
|
</div>
|
|
|
|
<div class="layout">
|
|
<div id="xhead" class="dm"></div>
|
|
<div class="page_header{if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME} page_custom_header{/if}">
|
|
<a href="/" class="home_button{if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME} home_button_custom{/if}" title="{$instance_name}">{if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}{$instance_name}{/if}</a>
|
|
<div n:if="isset($thisUser) ? (!$thisUser->isBanned() XOR !$thisUser->isActivated()) : true" class="header_navigation">
|
|
{ifset $thisUser}
|
|
<div class="link">
|
|
<a href="/" title="[Alt+Shift+,]" accesskey=",">{_header_home}</a>
|
|
</div>
|
|
<div class="link">
|
|
<a href="/search?type=groups">{_header_groups}</a>
|
|
</div>
|
|
<div class="link">
|
|
<a href="/search">{_header_search}</a>
|
|
</div>
|
|
<div class="link">
|
|
<a href="/invite">{_header_invite}</a>
|
|
</div>
|
|
<div class="link">
|
|
<a href="/support">{_header_help} <b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b></a>
|
|
</div>
|
|
<div class="link">
|
|
<a href="/logout?hash={urlencode($csrfToken)}">{_header_log_out}</a>
|
|
</div>
|
|
<div class="link">
|
|
<form action="/search" method="get">
|
|
<input type="search" name="query" placeholder="{_header_search}" style="height: 20px;background: url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px; background-color: #fff; padding-left: 18px;width: 120px;" title="{_header_search} [Alt+Shift+F]" accesskey="f" />
|
|
</form>
|
|
</div>
|
|
{else}
|
|
<div class="link">
|
|
<a href="/login">{_header_login}</a>
|
|
</div>
|
|
<div class="link">
|
|
<a href="/reg">{_header_registration}</a>
|
|
</div>
|
|
<div class="link">
|
|
<a href="/support">{_header_help}</a>
|
|
</div>
|
|
{/ifset}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sidebar">
|
|
<div class="navigation">
|
|
{ifset $thisUser}
|
|
{if !$thisUser->isBanned() XOR !$thisUser->isActivated()}
|
|
<a href="/edit" class="link edit-button">{_edit_button}</a>
|
|
<a href="{$thisUser->getURL()}" class="link" title="{_my_page} [Alt+Shift+.]" accesskey=".">{_my_page}</a>
|
|
<a href="/friends{$thisUser->getId()}" class="link">{_my_friends}
|
|
<object type="internal/link" n:if="$thisUser->getFollowersCount() > 0">
|
|
<a href="/friends{$thisUser->getId()}?act=incoming">
|
|
(<b>{$thisUser->getFollowersCount()}</b>)
|
|
</a>
|
|
</object>
|
|
</a>
|
|
<a n:if="$thisUser->getLeftMenuItemStatus('photos')" href="/albums{$thisUser->getId()}" class="link">{_my_photos}</a>
|
|
<a n:if="$thisUser->getLeftMenuItemStatus('videos')" href="/videos{$thisUser->getId()}" class="link">{_my_videos}</a>
|
|
<a n:if="$thisUser->getLeftMenuItemStatus('messages')" href="/im" class="link">{_my_messages}
|
|
<object type="internal/link" n:if="$thisUser->getUnreadMessagesCount() > 0">
|
|
(<b>{$thisUser->getUnreadMessagesCount()}</b>)
|
|
</object>
|
|
</a>
|
|
<a n:if="$thisUser->getLeftMenuItemStatus('notes')" href="/notes{$thisUser->getId()}" class="link">{_my_notes}</a>
|
|
<a n:if="$thisUser->getLeftMenuItemStatus('groups')" href="/groups{$thisUser->getId()}" class="link">{_my_groups}</a>
|
|
<a n:if="$thisUser->getLeftMenuItemStatus('news')" href="/feed" class="link" title="{_my_feed} [Alt+Shift+W]" accesskey="w">{_my_feed}</a>
|
|
<a href="/notifications" class="link" title="{_my_feedback} [Alt+Shift+N]" accesskey="n">{_my_feedback}
|
|
{if $thisUser->getNotificationsCount() > 0}
|
|
(<b>{$thisUser->getNotificationsCount()}</b>)
|
|
{/if}
|
|
</a>
|
|
<a href="/settings" class="link">{_my_settings}</a>
|
|
|
|
{var canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
|
|
{var canAccessHelpdesk = $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
|
|
{var menuLinksAvaiable = sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0 && $thisUser->getLeftMenuItemStatus('links')}
|
|
<div n:if="$canAccessAdminPanel || $canAccessHelpdesk || $menuLinksAvaiable" class="menu_divider"></div>
|
|
<a href="/admin" class="link" n:if="$canAccessAdminPanel" title="Админ-панель [Alt+Shift+A]" accesskey="a">Админ-панель</a>
|
|
<a href="/support/tickets" class="link" n:if="$canAccessHelpdesk">Helpdesk
|
|
{if $helpdeskTicketNotAnsweredCount > 0}
|
|
(<b>{$helpdeskTicketNotAnsweredCount}</b>)
|
|
{/if}
|
|
</a>
|
|
|
|
<a n:if="$thisUser->getLeftMenuItemStatus('links')" n:foreach="OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links'] as $menuItem" href="{$menuItem['url']}" target="_blank" class="link">{strpos($menuItem["name"], "@") === 0 ? tr(substr($menuItem["name"], 1)) : $menuItem["name"]}</a>
|
|
|
|
<div id="_groupListPinnedGroups">
|
|
<div n:if="$thisUser->getPinnedClubCount() > 0" class="menu_divider"></div>
|
|
<a n:foreach="$thisUser->getPinnedClubs() as $club" href="{$club->getURL()}" class="link group_link">{$club->getName()}</a>
|
|
</div>
|
|
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable'] && $thisUser->getLeftMenuItemStatus('poster')" href="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['link']}" >
|
|
<img src="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['src']}" alt="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']}" class="psa-poster" style="max-width: 100%; margin-top: 50px;" />
|
|
</a>
|
|
{elseif !$thisUser->isActivated()}
|
|
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_menu_logout}</a>
|
|
{else}
|
|
<a href="/support" class="link">{_menu_support}
|
|
{if $ticketAnsweredCount > 0}
|
|
(<b>{$ticketAnsweredCount}</b>)
|
|
{/if}
|
|
</a>
|
|
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_menu_logout}</a>
|
|
{/if}
|
|
{else}
|
|
<form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data">
|
|
<label for="login"><span>{_email}:</span></label>
|
|
<input id="login" type="text" name="login" required />
|
|
<label for="password"><span>{_password}:</span></label>
|
|
<input id="password" type="password" name="password" required />
|
|
<input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" />
|
|
<input type="hidden" name="hash" value="{$csrfToken}" />
|
|
<input type="submit" value="{_log_in}" class="button" style="display: inline-block;" />
|
|
<a href="/reg" class="button" style="display: inline-block;">{_registration}</a><br><br>
|
|
<a href="/restore">{_forgot_password}</a>
|
|
</form>
|
|
{/ifset}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="page_body">
|
|
<div id="wrapH">
|
|
<div id="wrapHI">
|
|
<div n:ifcontent class="page_yellowheader">
|
|
{include header}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{ifset wrap}
|
|
<div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
|
|
<b>{$flashMessage->title}</b><br/>
|
|
{$flashMessage->msg|noescape}
|
|
</div>
|
|
|
|
{include wrap}
|
|
{else}
|
|
<div class="wrap2">
|
|
<div class="wrap1">
|
|
<div id="auth" class="page-wrap">
|
|
<div class="page_content">
|
|
<div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
|
|
<b>{$flashMessage->title}</b><br/>
|
|
{$flashMessage->msg|noescape}
|
|
</div>
|
|
|
|
{include content}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{/ifset}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="page_footer">
|
|
{var dbVersion = \Chandler\Database\DatabaseConnection::i()->getConnection()->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION)}
|
|
|
|
<div class="navigation_footer">
|
|
<a href="/about" class="link">{_footer_about_instance}</a>
|
|
<a href="/blog" class="link">{_footer_blog}</a>
|
|
<a href="/support" class="link">{_footer_help}</a>
|
|
<a href="/dev" target="_blank" class="link">{_footer_developers}</a>
|
|
<a href="/language" class="link">{_footer_choose_language}</a>
|
|
<a href="/privacy" class="link">{_footer_privacy}</a>
|
|
</div>
|
|
<p>OpenVK <a href="/about:openvk">{php echo OPENVK_VERSION}</a> | PHP: {phpversion()} | DB: {$dbVersion}</p>
|
|
<p n:ifcontent>
|
|
{php echo OPENVK_ROOT_CONF["openvk"]["appearance"]["motd"]}
|
|
</p>
|
|
</div>
|
|
|
|
{script "js/node_modules/msgpack-lite/dist/msgpack.min.js"}
|
|
{script "js/node_modules/soundjs/lib/soundjs.min.js"}
|
|
{script "js/node_modules/ky/umd.js"}
|
|
{script "js/messagebox.js"}
|
|
{script "js/notifications.js"}
|
|
{script "js/scroll.js"}
|
|
{script "js/al_wall.js"}
|
|
{script "js/al_api.js"}
|
|
|
|
{ifset $thisUser}
|
|
{script "js/al_notifs.js"}
|
|
{/ifset}
|
|
|
|
{if OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['fartscroll']}
|
|
<script src="https://unpkg.com/fartscroll@1.0.0/fartscroll.js"></script>
|
|
<script>
|
|
fartscroll(400);
|
|
</script>
|
|
{/if}
|
|
|
|
<script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['enable']" async defer data-domain="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['domain']}" src="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['server']}js/plausible.js"></script>
|
|
|
|
<script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['piwik']['enable']">
|
|
{var $piwik = (object) OPENVK_ROOT_CONF['openvk']['telemetry']['piwik']}
|
|
|
|
//<![CDATA[
|
|
(function(window,document,dataLayerName,id){
|
|
window[dataLayerName]=window[dataLayerName]||[],window[dataLayerName].push({ start:(new Date).getTime(),event:"stg.start" });var scripts=document.getElementsByTagName('script')[0],tags=document.createElement('script');
|
|
function stgCreateCookie(a,b,c){ var d="";if(c){ var e=new Date;e.setTime(e.getTime()+24*c*60*60*1e3),d=";expires="+e.toUTCString() }document.cookie=a+"="+b+d+";path=/" }
|
|
var isStgDebug=(window.location.href.match("stg_debug")||document.cookie.match("stg_debug"))&&!window.location.href.match("stg_disable_debug");stgCreateCookie("stg_debug",isStgDebug?1:"",isStgDebug?14:-1);
|
|
var qP=[];dataLayerName!=="dataLayer"&&qP.push("data_layer_name="+dataLayerName),isStgDebug&&qP.push("stg_debug");var qPString=qP.length>0?("?"+qP.join("&")):"";
|
|
tags.async=!0,tags.src={$piwik->container . "/"}+id+".js"+qPString,scripts.parentNode.insertBefore(tags,scripts);
|
|
!function(a,n,i){ a[n]=a[n]||{ };for(var c=0;c<i.length;c++)!function(i){ a[n][i]=a[n][i]||{ },a[n][i].api=a[n][i].api||function(){ var a=[].slice.call(arguments,0);"string"==typeof a[0]&&window[dataLayerName].push({ event:n+"."+i+":"+a[0],parameters:[].slice.call(arguments,1) }) } }(i[c]) }(window,"ppms",["tm","cm"]);
|
|
})(window,document,{$piwik->layer}, {$piwik->site});
|
|
//]]>
|
|
</script>
|
|
|
|
<script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['matomo']['enable']">
|
|
{var $matomo = (object) OPENVK_ROOT_CONF['openvk']['telemetry']['matomo']}
|
|
//<![CDATA[
|
|
var _paq = window._paq = window._paq || [];
|
|
_paq.push(['trackPageView']);
|
|
_paq.push(['enableLinkTracking']);
|
|
(function() {
|
|
var u="//" + {$matomo->container} + "/";
|
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
|
_paq.push(['setSiteId', {$matomo->site}]);
|
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
|
g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
|
})();
|
|
//]]>
|
|
</script>
|
|
|
|
{ifset bodyScripts}
|
|
{include bodyScripts}
|
|
{/ifset}
|
|
</body>
|
|
</html>
|
|
|
|
{if isset($parentModule) && substr($parentModule, 0, 21) !== 'libchandler:absolute.'}
|
|
<!-- INCLUDING TEMPLATE FROM PARENTMODULE: {$parentModule} -->
|
|
|
|
{include content}
|
|
{/if}
|