Compare commits

...

8 commits

Author SHA1 Message Date
Artemka
0bbcd59a20
Merge f575b71bb0 into 14110c409a 2024-11-22 18:48:21 +03:00
mrilyew
14110c409a fix(notifications): fix broken link to photo
fixes #1140
2024-11-22 18:36:23 +03:00
mrilyew
53e9905ba7 fix(wall page): show more attachment links
fixes #1083
2024-11-22 18:21:12 +03:00
mrilyew
73a067a0c5
feat: ajax infinite scrolling (#1141)
* rewrite

* allow comments scroll

* rework to up button

* add posts scrolling function and ability to disabl

* cloudflare bypass (do not uncomment)
2024-11-22 16:31:07 +03:00
mrilyew
da6ce237f4 fix(wall): ctrl+enter didn't saved attachments 2024-11-22 13:12:59 +03:00
mrilyew
ba2d929183 fix(videos list): show video window on click 2024-11-22 11:59:37 +03:00
mrilyew
0596452ef4 fix(square avatar): make focus on top of picture 2024-11-22 11:49:35 +03:00
Artemka
f575b71bb0 Некоторые измения в шаблонах писем (Не тестировал) 2024-07-23 19:12:46 +00:00
41 changed files with 394 additions and 185 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

View file

@ -53,9 +53,6 @@
<table class="row"> <table class="row">
<tr> <tr>
<td> <td>
<center>
<img src="pictures/lock.jpeg" align="center" class="float-center" width=128 height=128 />
</center>
<table class="spacer"> <table class="spacer">
<tr> <tr>
@ -94,7 +91,7 @@
<tr> <tr>
<td> <td>
<center> <center>
<a href="http://{$_SERVER['HTTP_HOST']}/settings/change_email?key={rawurlencode($key)}" align="center" class="float-center">Подтвердить Email!</a> <a href="https://{$_SERVER['HTTP_HOST']}/settings/change_email?key={rawurlencode($key)}" align="center" class="float-center">Подтвердить Email!</a>
</center> </center>
</td> </td>
</tr> </tr>
@ -118,8 +115,8 @@
<table class="callout"> <table class="callout">
<tr> <tr>
<th class="callout-inner primary"> <th class="callout-inner primary">
<a href="http://{$_SERVER['HTTP_HOST']}/settings/change_email?key={$key}" style="color: #000; text-decoration: none;"> <a href="https://{$_SERVER['HTTP_HOST']}/settings/change_email?key={$key}" style="color: #000; text-decoration: none;">
http://{$_SERVER['HTTP_HOST']}/settings/change_email?key={$key} https://{$_SERVER['HTTP_HOST']}/settings/change_email?key={$key}
</a> </a>
</th> </th>
</tr> </tr>
@ -130,7 +127,7 @@
</p> </p>
<ul> <ul>
<li>Передавать другим людям (даже друзьям, питомцам, соседам, любимым девушкам)</li> <li>Передавать другим людям (даже друзьям, питомцам, соседям, любимым девушкам)</li>
<li>Использовать, если прошло более двух дней с её генерации</li> <li>Использовать, если прошло более двух дней с её генерации</li>
</ul> </ul>

View file

@ -12,7 +12,7 @@
<tr> <tr>
<td class="float-center" align="center" valign="top"> <td class="float-center" align="center" valign="top">
<center> <center>
Добро пожаловать в OpenVK! Приятного времяприпровождения, надеюсь вам понравится.<br><br>Если появились вопросы, касаемые нашего сайта, пишите <a href="https://ovk.to/support?act=new">сюда</a> Добро пожаловать в OpenVK! Приятного времяприпровождения, надеюсь вам понравится.<br><br>Если появились вопросы, касаемые нашего сайта, пишите <a href="https://{$_SERVER['HTTP_HOST']}/support?act=new">сюда</a>
</center> </center>
</td> </td>
</tr> </tr>

View file

@ -53,9 +53,6 @@
<table class="row"> <table class="row">
<tr> <tr>
<td> <td>
<center>
<img src="pictures/lock.jpeg" align="center" class="float-center" width=128 height=128 />
</center>
<table class="spacer"> <table class="spacer">
<tr> <tr>
@ -94,7 +91,7 @@
<tr> <tr>
<td> <td>
<center> <center>
<a href="http://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={rawurlencode($key)}" align="center" class="float-center">Сбросить пароль!</a> <a href="https://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={rawurlencode($key)}" align="center" class="float-center">Сбросить пароль!</a>
</center> </center>
</td> </td>
</tr> </tr>
@ -118,8 +115,8 @@
<table class="callout"> <table class="callout">
<tr> <tr>
<th class="callout-inner primary"> <th class="callout-inner primary">
<a href="http://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key}" style="color: #000; text-decoration: none;"> <a href="https://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key}" style="color: #000; text-decoration: none;">
http://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key} https://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key}
</a> </a>
</th> </th>
</tr> </tr>
@ -130,7 +127,7 @@
</p> </p>
<ul> <ul>
<li>Передавать другим людям (даже друзьям, питомцам, соседам, любимым девушкам)</li> <li>Передавать другим людям (даже друзьям, питомцам, соседям, любимым девушкам)</li>
<li>Использовать, если прошло более двух дней с её генерации</li> <li>Использовать, если прошло более двух дней с её генерации</li>
</ul> </ul>

View file

@ -53,9 +53,6 @@
<table class="row"> <table class="row">
<tr> <tr>
<td> <td>
<center>
<img src="pictures/lock.jpeg" align="center" class="float-center" width=128 height=128 />
</center>
<table class="spacer"> <table class="spacer">
<tr> <tr>
@ -94,7 +91,7 @@
<tr> <tr>
<td> <td>
<center> <center>
<a href="http://{$_SERVER['HTTP_HOST']}/regFinish?key={rawurlencode($key)}" align="center" class="float-center">Подтвердить Email!</a> <a href="https://{$_SERVER['HTTP_HOST']}/regFinish?key={rawurlencode($key)}" align="center" class="float-center">Подтвердить Email!</a>
</center> </center>
</td> </td>
</tr> </tr>
@ -118,8 +115,8 @@
<table class="callout"> <table class="callout">
<tr> <tr>
<th class="callout-inner primary"> <th class="callout-inner primary">
<a href="http://{$_SERVER['HTTP_HOST']}/regFinish?key={$key}" style="color: #000; text-decoration: none;"> <a href="https://{$_SERVER['HTTP_HOST']}/regFinish?key={$key}" style="color: #000; text-decoration: none;">
http://{$_SERVER['HTTP_HOST']}/regFinish?key={$key} https://{$_SERVER['HTTP_HOST']}/regFinish?key={$key}
</a> </a>
</th> </th>
</tr> </tr>
@ -130,7 +127,7 @@
</p> </p>
<ul> <ul>
<li>Передавать другим людям (даже друзьям, питомцам, соседам, любимым девушкам)</li> <li>Передавать другим людям (даже друзьям, питомцам, соседям, любимым девушкам)</li>
<li>Использовать, если прошло более двух дней с её генерации</li> <li>Использовать, если прошло более двух дней с её генерации</li>
</ul> </ul>

View file

@ -53,9 +53,9 @@ class Posts
$offset--; $offset--;
} }
} }
} else if(!is_null($offset)) { } /*else if(!is_null($offset)) {
$offset--; $offset--;
} }*/
$sel = $this->posts->where([ $sel = $this->posts->where([
"wall" => $user, "wall" => $user,

View file

@ -22,15 +22,10 @@ final class NotesPresenter extends OpenVKPresenter
if(!$user->getPrivacyPermission('notes.read', $this->user->identity ?? NULL)) if(!$user->getPrivacyPermission('notes.read', $this->user->identity ?? NULL))
$this->flashFail("err", tr("forbidden"), tr("forbidden_comment")); $this->flashFail("err", tr("forbidden"), tr("forbidden_comment"));
$this->template->notes = $this->notes->getUserNotes($user, (int)($this->queryParam("p") ?? 1)); $this->template->page = (int)($this->queryParam("p") ?? 1);
$this->template->notes = $this->notes->getUserNotes($user, $this->template->page);
$this->template->count = $this->notes->getUserNotesCount($user); $this->template->count = $this->notes->getUserNotesCount($user);
$this->template->owner = $user; $this->template->owner = $user;
$this->template->paginatorConf = (object) [
"count" => $this->template->count,
"page" => $this->queryParam("p") ?? 1,
"amount" => NULL,
"perPage" => OPENVK_DEFAULT_PER_PAGE,
];
} }
function renderView(int $owner, int $note_id): void function renderView(int $owner, int $note_id): void

View file

@ -283,6 +283,11 @@ abstract class OpenVKPresenter extends SimplePresenter
} }
} }
/*if($this->queryParam('al') == '1') {
$this->assertNoCSRF();
header('Content-Type: text/plain; charset=UTF-8');
}*/
parent::onStartup(); parent::onStartup();
} }

View file

@ -125,5 +125,6 @@ final class SearchPresenter extends OpenVKPresenter
]; ];
$this->template->extendedPaginatorConf = clone $this->template->paginatorConf; $this->template->extendedPaginatorConf = clone $this->template->paginatorConf;
$this->template->extendedPaginatorConf->space = 11; $this->template->extendedPaginatorConf->space = 11;
$this->template->paginatorConf->atTop = true;
} }
} }

View file

@ -87,7 +87,14 @@
{/if} {/if}
<div class="toTop"> <div class="toTop">
⬆ {_to_top} <div id='to_up'>
<svg id="to_up_icon" viewBox="0 0 10 6"><polygon points="0 6 5 0 10 6 0 6"/></svg>
<span>{_to_top}</span>
</div>
<div id='to_back'>
<svg id="to_back_icon" viewBox="0 0 10 6"><polygon points="0 0 5 6 10 0 0 0"/></svg>
</div>
</div> </div>
<div class="layout"> <div class="layout">
@ -384,6 +391,7 @@
{script "js/al_polls.js"} {script "js/al_polls.js"}
{script "js/al_suggestions.js"} {script "js/al_suggestions.js"}
{script "js/al_navigation.js"} {script "js/al_navigation.js"}
{script "js/al_comments.js"}
{ifset $thisUser} {ifset $thisUser}
{script "js/al_notifs.js"} {script "js/al_notifs.js"}

View file

@ -19,7 +19,7 @@
{ifset specpage} {ifset specpage}
{include specpage, x => $dat} {include specpage, x => $dat}
{else} {else}
<div class="container_gray"> <div class="container_gray {ifset noscroll}no_scroll_container{else}scroll_container{/ifset}">
{var $data = is_array($iterator) ? $iterator : iterator_to_array($iterator)} {var $data = is_array($iterator) ? $iterator : iterator_to_array($iterator)}
{ifset top} {ifset top}
@ -27,7 +27,7 @@
{/ifset} {/ifset}
{if sizeof($data) > 0} {if sizeof($data) > 0}
<div class="content" n:foreach="$data as $dat"> <div class="scroll_node content" n:foreach="$data as $dat">
<table> <table>
<tbody n:attr="id => is_null($table_body_id) ? NULL : $table_body_id"> <tbody n:attr="id => is_null($table_body_id) ? NULL : $table_body_id">
<tr> <tr>

View file

@ -64,8 +64,8 @@
<div n:if="$audiosCount <= 0" style='height: 50%;'> <div n:if="$audiosCount <= 0" style='height: 50%;'>
{include "../components/content_error.xml", description => $ownerId > 0 ? ($ownerId == $thisUser->getId() ? tr("no_audios_thisuser") : tr("no_audios_user")) : tr("no_audios_club")} {include "../components/content_error.xml", description => $ownerId > 0 ? ($ownerId == $thisUser->getId() ? tr("no_audios_thisuser") : tr("no_audios_user")) : tr("no_audios_club")}
</div> </div>
<div n:if="$audiosCount > 0" class="infContainer"> <div n:if="$audiosCount > 0" class="scroll_container infContainer">
<div class="infObj" n:foreach="$audios as $audio"> <div class="scroll_node infObj" n:foreach="$audios as $audio">
{include "player.xml", audio => $audio, club => $club} {include "player.xml", audio => $audio, club => $club}
</div> </div>
</div> </div>
@ -86,10 +86,10 @@
{include "../components/content_error.xml", description => $ownerId > 0 ? ($ownerId == $thisUser->getId() ? tr("no_playlists_thisuser") : tr("no_playlists_user")) : tr("no_playlists_club")} {include "../components/content_error.xml", description => $ownerId > 0 ? ($ownerId == $thisUser->getId() ? tr("no_playlists_thisuser") : tr("no_playlists_user")) : tr("no_playlists_club")}
</div> </div>
<div class="infContainer playlistContainer" n:if="$playlistsCount > 0"> <div class="scroll_container infContainer playlistContainer" n:if="$playlistsCount > 0">
{foreach $playlists as $playlist} <div class='scroll_node' n:foreach='$playlists as $playlist'>
{include 'playlistListView.xml', playlist => $playlist} {include 'playlistListView.xml', playlist => $playlist}
{/foreach} </div>
</div> </div>
<div> <div>

View file

@ -67,11 +67,11 @@
<hr style="color: #f7f7f7;"> <hr style="color: #f7f7f7;">
</div> </div>
</div> </div>
<div class="audiosContainer infContainer" style="margin-top: 14px;"> <div class="audiosContainer scroll_container infContainer" style="margin-top: 14px;">
{if $count < 1} {if $count < 1}
{_empty_playlist} {_empty_playlist}
{else} {else}
<div class="infObj" n:foreach="$audios as $audio"> <div class="scroll_node" n:foreach="$audios as $audio">
{include "player.xml", audio => $audio} {include "player.xml", audio => $audio}
</div> </div>

View file

@ -12,8 +12,8 @@
{/block} {/block}
{block content} {block content}
<div class="gift_grid"> <div class="gift_grid scroll_container">
<div n:foreach="$gifts as $gift" n:class="gift_sel, !$gift->canUse($thisUser) ? disabled" data-gift="{$gift->getId()}"> <div n:foreach="$gifts as $gift" n:class="scroll_node, gift_sel, !$gift->canUse($thisUser) ? disabled" data-gift="{$gift->getId()}">
<img class="gift_pic" src="{$gift->getImage(2)}" alt="{_gift}" loading=lazy /> <img class="gift_pic" src="{$gift->getImage(2)}" alt="{_gift}" loading=lazy />
<strong class="gift_price"> <strong class="gift_price">

View file

@ -12,9 +12,9 @@
{include "../components/error.xml", title => "", description => $type == "my" ? tr("no_suggested_posts_by_you") : tr("no_suggested_posts_by_people")} {include "../components/error.xml", title => "", description => $type == "my" ? tr("no_suggested_posts_by_you") : tr("no_suggested_posts_by_people")}
{else} {else}
<h4 id="cound">{if $type == "my"}{tr("suggested_posts_in_group_by_you", $count)}{else}{tr("suggested_posts_in_group", $count)}{/if}</h4> <h4 id="cound">{if $type == "my"}{tr("suggested_posts_in_group_by_you", $count)}{else}{tr("suggested_posts_in_group", $count)}{/if}</h4>
<div id="postz" class="infContainer"> <div id="postz" class="infContainer scroll_container">
{var $microblog = $thisUser->hasMicroblogEnabled()} {var $microblog = $thisUser->hasMicroblogEnabled()}
<div class="infObj" n:foreach="$posts as $post"> <div class="infObj scroll_node" n:foreach="$posts as $post">
{if $microblog} {if $microblog}
{include "../components/post/microblogpost.xml", post => $post, commentSection => false, suggestion => true, forceNoCommentsLink => true, forceNoPinLink => true, forceNoLike => true, forceNoShareLink => true, forceNoDeleteLink => false} {include "../components/post/microblogpost.xml", post => $post, commentSection => false, suggestion => true, forceNoCommentsLink => true, forceNoPinLink => true, forceNoLike => true, forceNoShareLink => true, forceNoDeleteLink => false}
{else} {else}

View file

@ -17,9 +17,9 @@
</div> </div>
{if sizeof($corresps) > 0} {if sizeof($corresps) > 0}
<div class="crp-list"> <div class="crp-list scroll_container">
<div n:foreach="$corresps as $coresp" <div n:foreach="$corresps as $coresp"
class="crp-entry" class="scroll_node crp-entry"
onmousedown="window.location.href = {$coresp->getURL()};" > onmousedown="window.location.href = {$coresp->getURL()};" >
{var $recipient = $coresp->getCorrespondents()[1]} {var $recipient = $coresp->getCorrespondents()[1]}
{var $lastMsg = $coresp->getPreviewMessage()} {var $lastMsg = $coresp->getPreviewMessage()}

View file

@ -1,6 +1,5 @@
{extends "../@listView.xml"} {extends "../@listView.xml"}
{var $iterator = iterator_to_array($notes)} {var $iterator = iterator_to_array($notes)}
{var $page = $paginatorConf->page}
{block title}{_notes}{/block} {block title}{_notes}{/block}
@ -60,12 +59,12 @@
} }
</style> </style>
<div class="container_gray" style="background: white; border-top: none;"> <div class="container_gray scroll_container" style="background: white; border-top: none;">
{var $data = is_array($iterator) ? $iterator : iterator_to_array($iterator)} {var $data = is_array($iterator) ? $iterator : iterator_to_array($iterator)}
{if sizeof($data) > 0} {if sizeof($data) > 0}
<div n:foreach="$data as $dat"> <div class='scroll_node' n:foreach="$data as $dat">
<div class="profile_thumb"> <div class="profile_thumb">
<a href="{$owner->getURL()}"> <a href="{$owner->getURL()}">
<img src="{$owner->getAvatarUrl('miniscule')}" style="width: 50px;"> <img src="{$owner->getAvatarUrl('miniscule')}" style="width: 50px;">
@ -107,6 +106,14 @@
</article> </article>
</div> </div>
{include "../components/paginator.xml", conf => (object) [
"page" => $page,
"count" => $count,
"amount" => sizeof($data),
"perPage" => 10,
"atBottom" => true,
]}
{else} {else}
{if isset($thisUser) && $thisUser->getId() == $owner->getId()} {if isset($thisUser) && $thisUser->getId() == $owner->getId()}

View file

@ -21,8 +21,8 @@
</div> </div>
{var $data = is_array($iterator) ? $iterator : iterator_to_array($iterator)} {var $data = is_array($iterator) ? $iterator : iterator_to_array($iterator)}
{if sizeof($data) > 0} {if sizeof($data) > 0}
<div> <div n:class="$mode !== 'new' ? scroll_container">
<table class="post post-divider" border="0" style="font-size: 11px;" n:foreach="$data as $dat"> <table class="scroll_node post post-divider" border="0" style="font-size: 11px;" n:foreach="$data as $dat">
<tbody> <tbody>
<tr> <tr>
{var $sxModel = $dat->getModel(1)} {var $sxModel = $dat->getModel(1)}

View file

@ -30,10 +30,10 @@
{/if} {/if}
<br/><br/> <br/><br/>
{if $album->getPhotosCount() > 0} {if $album->getPhotosCount() > 0}
<div class="container_gray album-flex"> <div class="container_gray scroll_container album-flex">
{foreach $photos as $photo} {foreach $photos as $photo}
{php if($photo->isDeleted()) continue; } {php if($photo->isDeleted()) continue; }
<div class="album-photo"> <div class="album-photo scroll_node">
<a <a
n:if="!is_null($thisUser) && $album->canBeModifiedBy($thisUser)" n:if="!is_null($thisUser) && $album->canBeModifiedBy($thisUser)"
href="/album{$album->getPrettyId()}/remove_photo/{$photo->getId()}" class="album-photo--delete"> href="/album{$album->getPrettyId()}/remove_photo/{$photo->getId()}" class="album-photo--delete">

View file

@ -29,10 +29,10 @@
</div> </div>
<div class='page_wrap_content' id='search_page'> <div class='page_wrap_content' id='search_page'>
<div n:class='page_wrap_content_main, $section == "audios" && $count > 0 ? audios_padding'> <div n:class='page_wrap_content_main, scroll_container, $section == "audios" && $count > 0 ? audios_padding'>
{if $count > 0} {if $count > 0}
{if $section === 'users'} {if $section === 'users'}
<div class='search_content content def_row_content' n:foreach="$data as $dat"> <div class='scroll_node search_content content def_row_content' n:foreach="$data as $dat">
<table> <table>
<tbody> <tbody>
<tr> <tr>
@ -125,10 +125,14 @@
</div> </div>
<script n:if='$count > 0 && !empty($query)'> <script n:if='$count > 0 && !empty($query)'>
function __scrollHook(page) {
highlightText({$query}, '.page_wrap_content_main', ['text']) highlightText({$query}, '.page_wrap_content_main', ['text'])
}
__scrollHook()
</script> </script>
{elseif $section === 'groups'} {elseif $section === 'groups'}
<div class='search_content content def_row_content' n:foreach="$data as $dat"> <div class='scroll_node search_content content def_row_content' n:foreach="$data as $dat">
<table> <table>
<tbody> <tbody>
<tr> <tr>
@ -180,10 +184,14 @@
</div> </div>
<script n:if='$count > 0 && !empty($query)'> <script n:if='$count > 0 && !empty($query)'>
function __scrollHook(page) {
highlightText({$query}, '.page_wrap_content_main', ['text', "td[data-highlight='_clubDesc']"]) highlightText({$query}, '.page_wrap_content_main', ['text', "td[data-highlight='_clubDesc']"])
}
__scrollHook()
</script> </script>
{elseif $section === 'apps'} {elseif $section === 'apps'}
<div class='search_content content def_row_content' n:foreach="$data as $dat"> <div class='scroll_node search_content content def_row_content' n:foreach="$data as $dat">
<table> <table>
<tbody> <tbody>
<tr> <tr>
@ -210,10 +218,14 @@
</div> </div>
<script n:if='$count > 0 && !empty($query)'> <script n:if='$count > 0 && !empty($query)'>
function __scrollHook(page) {
highlightText({$query}, '.page_wrap_content_main', ['text', "span[data-highlight='_appDesc']"]) highlightText({$query}, '.page_wrap_content_main', ['text', "span[data-highlight='_appDesc']"])
}
__scrollHook()
</script> </script>
{elseif $section === 'posts'} {elseif $section === 'posts'}
<div class='search_content' n:foreach="$data as $dat"> <div class='scroll_node search_content' n:foreach="$data as $dat">
{if !$dat || $dat->getWallOwner()->isHideFromGlobalFeedEnabled()} {if !$dat || $dat->getWallOwner()->isHideFromGlobalFeedEnabled()}
{_closed_group_post}. {_closed_group_post}.
{else} {else}
@ -222,31 +234,47 @@
</div> </div>
<script n:if='$count > 0 && !empty($query)'> <script n:if='$count > 0 && !empty($query)'>
function __scrollHook(page) {
highlightText({$query}, '.page_wrap_content_main', [".post:not(.comment) > tbody > tr > td > .post-content > .text .really_text"]) highlightText({$query}, '.page_wrap_content_main', [".post:not(.comment) > tbody > tr > td > .post-content > .text .really_text"])
}
__scrollHook()
</script> </script>
{elseif $section === 'videos'} {elseif $section === 'videos'}
<div class='search_content' n:foreach="$data as $dat"> <div class='scroll_node search_content' n:foreach="$data as $dat">
{include "../components/video.xml", video => $dat} {include "../components/video.xml", video => $dat}
</div> </div>
<script n:if='$count > 0 && !empty($query)'> <script n:if='$count > 0 && !empty($query)'>
function __scrollHook(page) {
highlightText({$query}, '.page_wrap_content_main', [".video_name", ".video_description"]) highlightText({$query}, '.page_wrap_content_main', [".video_name", ".video_description"])
}
__scrollHook()
</script> </script>
{elseif $section === 'audios'} {elseif $section === 'audios'}
<div class='search_content' n:foreach="$data as $dat"> <div class='scroll_node search_content' n:foreach="$data as $dat">
{include "../Audio/player.xml", audio => $dat} {include "../Audio/player.xml", audio => $dat}
</div> </div>
<script n:if="$count > 0 && !empty($query) && empty($_REQUEST['only_performers'])"> <script n:if="$count > 0 && !empty($query) && empty($_REQUEST['only_performers'])">
function __scrollHook(page) {
highlightText({$query}, '.page_wrap_content_main', [".mediaInfo .performer a", ".mediaInfo .title"]) highlightText({$query}, '.page_wrap_content_main', [".mediaInfo .performer a", ".mediaInfo .title"])
}
__scrollHook()
</script> </script>
{elseif $section === 'audios_playlists'} {elseif $section === 'audios_playlists'}
<div class='search_content' n:foreach="$data as $dat"> <div class='scroll_node search_content' n:foreach="$data as $dat">
{include "../Audio/playlistListView.xml", playlist => $dat} {include "../Audio/playlistListView.xml", playlist => $dat}
</div> </div>
<script n:if="$count > 0 && !empty($query) && empty($_REQUEST['only_performers'])"> <script n:if="$count > 0 && !empty($query) && empty($_REQUEST['only_performers'])">
function __scrollHook(page) {
highlightText({$query}, '.page_wrap_content_main', [".playlistName", ".playlistDesc"]) highlightText({$query}, '.page_wrap_content_main', [".playlistName", ".playlistDesc"])
}
__scrollHook()
</script> </script>
{/if} {/if}
{else} {else}

View file

@ -2,6 +2,7 @@
{var $iterator = $user->getClubs($page, $admin)} {var $iterator = $user->getClubs($page, $admin)}
{var $count = $user->getClubCount($admin)} {var $count = $user->getClubCount($admin)}
{block noscroll}{/block}
{block title} {block title}
{_groups} {_groups}
{/block} {/block}
@ -121,8 +122,8 @@
<h4>{_search_group}</h4> <h4>{_search_group}</h4>
<span>{_search_group_desc}</span> <span>{_search_group_desc}</span>
<form action="/search"> <form action="/search">
<input name="type" type="hidden" value="groups"> <input name="section" type="hidden" value="groups">
<input name="query" class="header_search_input" value="" style="background: none; width: 155px; padding-left: 3px;"> <input name="q" class="header_search_input" value="" style="background: none; width: 155px; padding-left: 3px;">
<button class="button">{_search_by_groups}</button> <button class="button">{_search_by_groups}</button>
</form> </form>
</div> </div>

View file

@ -33,7 +33,7 @@
{/block} {/block}
{block preview} {block preview}
<div class="video-preview" data-id="{$x->getId()}"> <div class="video-preview" id="videoOpen" data-id="{$x->getPrettyId()}">
<img src="{$x->getThumbnailURL()}" <img src="{$x->getThumbnailURL()}"
alt="{$x->getName()}" alt="{$x->getName()}"
style="max-width: 170px; max-height: 127px; margin: auto;" /> style="max-width: 170px; max-height: 127px; margin: auto;" />
@ -41,7 +41,7 @@
{/block} {/block}
{block name} {block name}
<span data-id="{$x->getId()}" style="color:unset;">{$x->getName()}</span> <span id="videoOpen" data-id="{$x->getPrettyId()}" style="color:unset;">{$x->getName()}</span>
{/block} {/block}
{block description} {block description}
@ -51,7 +51,7 @@
<span style="color: grey;">{_video_uploaded} {$x->getPublicationTime()}</span><br/> <span style="color: grey;">{_video_uploaded} {$x->getPublicationTime()}</span><br/>
<span style="color: grey;">{_video_updated} {$x->getEditTime() ?? $x->getPublicationTime()}</span> <span style="color: grey;">{_video_updated} {$x->getEditTime() ?? $x->getPublicationTime()}</span>
<p> <p>
<a href="/video{$x->getPrettyId()}" data-id="{$x->getId()}">{_view_video}</a> <a href="/video{$x->getPrettyId()}" data-id="{$x->getPrettyId()}">{_view_video}</a>
{if $x->getCommentsCount() > 0}| <a href="/video{$x->getPrettyId()}#comments">{_comments} ({$x->getCommentsCount()})</a>{/if} {if $x->getCommentsCount() > 0}| <a href="/video{$x->getPrettyId()}#comments">{_comments} ({$x->getCommentsCount()})</a>{/if}
</p> </p>
{/block} {/block}

View file

@ -23,10 +23,12 @@
{include "../components/textArea.xml", route => "/wall" . $thisUser->getId() . "/makePost", graffiti => true, polls => true, notes => true, hasSource => true} {include "../components/textArea.xml", route => "/wall" . $thisUser->getId() . "/makePost", graffiti => true, polls => true, notes => true, hasSource => true}
</div> </div>
{foreach $posts as $post} <div class='scroll_container'>
<div class='scroll_node' n:foreach='$posts as $post'>
<a name="postGarter={$post->getId()}"></a> <a name="postGarter={$post->getId()}"></a>
{include "../components/post.xml", post => $post, onWallOf => true, commentSection => true} {include "../components/post.xml", post => $post, onWallOf => true, commentSection => true}
{/foreach} </div>
</div>
<div class="postFeedBottom"> <div class="postFeedBottom">
<div class="postFeedPaginator"> <div class="postFeedPaginator">
@ -55,8 +57,4 @@
window.location.assign(url.replace("__padding", e.target.value)); window.location.assign(url.replace("__padding", e.target.value));
}); });
</script> </script>
{if isset($thisUser) && $thisUser->hasMicroblogEnabled()}
{script "js/al_comments.js"}
{/if}
{/block} {/block}

View file

@ -28,16 +28,16 @@
</div> </div>
<div n:if="$canPost && $type == 'all'" class="content_subtitle"> <div n:if="$canPost && $type == 'all'" class="content_subtitle">
{include "../components/textArea.xml", route => "/wall$owner/makePost", hasSource => true} {include "../components/textArea.xml", route => "/wall$owner/makePost", graffiti => true, polls => true, notes => true, hasSource => true}
</div> </div>
<div class="content"> <div class="content scroll_container">
{if sizeof($posts) > 0} {if sizeof($posts) > 0}
{foreach $posts as $post} <div class='scroll_node' n:foreach='$posts as $post'>
<a name="postGarter={$post->getId()}"></a> <a name="postGarter={$post->getId()}"></a>
{include "../components/post.xml", post => $post, commentSection => true} {include "../components/post.xml", post => $post, commentSection => true}
{/foreach} </div>
{include "../components/paginator.xml", conf => $paginatorConf} {include "../components/paginator.xml", conf => $paginatorConf}
{else} {else}
{_no_posts_abstract} {_no_posts_abstract}
@ -45,8 +45,4 @@
</div> </div>
</div> </div>
</div> </div>
{if isset($thisUser) && $thisUser->hasMicroblogEnabled()}
{script "js/al_comments.js"}
{/if}
{/block} {/block}

View file

@ -9,14 +9,14 @@
</div> </div>
{if sizeof($comments) > 0} {if sizeof($comments) > 0}
{foreach $comments as $comment} <div class='scroll_container'>
<div class='scroll_node' n:foreach="$comments as $comment">
{include "comment.xml", comment => $comment} {include "comment.xml", comment => $comment}
{/foreach} </div>
</div>
<div style="margin-top: 11px;"> <div style="margin-top: 11px;">
{include "paginator.xml", conf => (object) ["page" => $page, "count" => $count, "amount" => sizeof($comments), "perPage" => 10]} {include "paginator.xml", conf => (object) ["page" => $page, "count" => $count, "amount" => sizeof($comments), "perPage" => 10]}
</div> </div>
{else} {else}
{_comments_tip} {_comments_tip}
{/if} {/if}
{script "js/al_comments.js"}

View file

@ -1,4 +1,4 @@
{var $user = $notification->getModel(0)} {var $user = $notification->getModel(0)}
{var $post = $notification->getModel(1)} {var $post = $notification->getModel(1)}
{_nt_you_were_mentioned_u} <a href="{$user->getURL()}"><b>{$user->getCanonicalName()}</b></a> {$notification->getDateTime()} <a href="/photo{$post->getPageURL()}"><b>{_nt_mention_in_photo}</b></a>: "{$notification->getData()}" {_nt_you_were_mentioned_u} <a href="{$user->getURL()}"><b>{$user->getCanonicalName()}</b></a> {$notification->getDateTime()} <a href="{$post->getPageURL()}"><b>{_nt_mention_in_photo}</b></a>: "{$notification->getData()}"

View file

@ -2,7 +2,7 @@
{var $pageCount = ceil($conf->count / $conf->perPage)} {var $pageCount = ceil($conf->count / $conf->perPage)}
<div n:if="!($conf->page === 1 && $conf->count <= $conf->perPage)" n:attr="style => (!$conf->tidy ? 'padding: 8px;')"> <div n:if="!($conf->page === 1 && $conf->count <= $conf->perPage)" n:attr="style => (!$conf->tidy ? 'padding: 8px;')">
<div n:class="paginator, ($conf->atBottom ?? false) ? paginator-at-bottom, ($conf->tidy ? 'tidy')"> <div n:class="paginator, (($conf->atTop || $atTop) ?? false) ? paginator-at-top, ($conf->atBottom ?? false) ? paginator-at-bottom, ($conf->tidy ? 'tidy')">
<a n:if="$conf->page > $space" n:attr="class => ($conf->page === 1 ? 'active')" href="?{http_build_query(array_merge($_GET, ['p' => 1]), 'k', '&', PHP_QUERY_RFC3986)}">&laquo;</a> <a n:if="$conf->page > $space" n:attr="class => ($conf->page === 1 ? 'active')" href="?{http_build_query(array_merge($_GET, ['p' => 1]), 'k', '&', PHP_QUERY_RFC3986)}">&laquo;</a>
{for $j = $conf->page - ($space-1); $j <= $conf->page + ($space-1); $j++} {for $j = $conf->page - ($space-1); $j <= $conf->page + ($space-1); $j++}
<a n:if="$j > 0 && $j <= $pageCount" n:attr="class => ($conf->page === $j ? 'active')" href="?{http_build_query(array_merge($_GET, ['p' => $j]), 'k', '&', PHP_QUERY_RFC3986)}">{$j}</a> <a n:if="$j > 0 && $j <= $pageCount" n:attr="class => ($conf->page === $j ? 'active')" href="?{http_build_query(array_merge($_GET, ['p' => $j]), 'k', '&', PHP_QUERY_RFC3986)}">{$j}</a>

View file

@ -29,7 +29,7 @@
<span style="color: grey;">{_video_uploaded} {$video->getPublicationTime()}</span><br/> <span style="color: grey;">{_video_uploaded} {$video->getPublicationTime()}</span><br/>
<p> <p>
<a href="/video{$video->getPrettyId()}" id='videoOpen' data-id="{$video->getPrettyId()}">{_view_video}</a> <a href="/video{$video->getPrettyId()}" data-id="{$video->getPrettyId()}">{_view_video}</a>
{if $video->getCommentsCount() > 0}| <a href="/video{$video->getPrettyId()}#comments">{_comments} ({$video->getCommentsCount()})</a>{/if} {if $video->getCommentsCount() > 0}| <a href="/video{$video->getPrettyId()}#comments">{_comments} ({$video->getCommentsCount()})</a>{/if}
</p> </p>
{/ifset} {/ifset}

View file

@ -13,13 +13,13 @@
{include "../components/textArea.xml", route => "/wall$owner/makePost", graffiti => true, polls => true, notes => true, hasSource => true} {include "../components/textArea.xml", route => "/wall$owner/makePost", graffiti => true, polls => true, notes => true, hasSource => true}
</div> </div>
<div class="content"> <div class="content scroll_container">
{if sizeof($posts) > 0} {if sizeof($posts) > 0}
{foreach $posts as $post} <div class='scroll_node' n:foreach='$posts as $post'>
<a name="postGarter={$post->getId()}"></a> <a name="postGarter={$post->getId()}"></a>
{include "../components/post.xml", post => $post, commentSection => true} {include "../components/post.xml", post => $post, commentSection => true}
{/foreach} </div>
{include "../components/paginator.xml", conf => $paginatorConf} {include "../components/paginator.xml", conf => $paginatorConf}
{else} {else}
{_no_posts_abstract} {_no_posts_abstract}
@ -28,7 +28,3 @@
</div> </div>
</div> </div>
</div> </div>
{if isset($thisUser) && $thisUser->hasMicroblogEnabled()}
{script "js/al_comments.js"}
{/if}

View file

@ -4,6 +4,7 @@ table.User > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > a:nth-chil
width: 50px; width: 50px;
height: 50px; height: 50px;
object-fit: cover; object-fit: cover;
object-position: top;
} }
.post > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > a:nth-child(1) > img:nth-child(1) .post > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > a:nth-child(1) > img:nth-child(1)
@ -11,6 +12,7 @@ table.User > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > a:nth-chil
width: 50px; width: 50px;
height: 50px; height: 50px;
object-fit: cover; object-fit: cover;
object-position: top;
} }
div.content > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > a:nth-child(1) > img:nth-child(1) div.content > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > a:nth-child(1) > img:nth-child(1)
@ -18,6 +20,7 @@ div.content > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth
width: 75px; width: 75px;
height: 75px; height: 75px;
object-fit: cover; object-fit: cover;
object-position: top;
} }
.crp-entry--image > img .crp-entry--image > img
@ -25,6 +28,7 @@ div.content > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth
width: 48px; width: 48px;
height: 48px; height: 48px;
object-fit: cover; object-fit: cover;
object-position: top;
} }
.crp-entry--message---av > img, .crp-entry--message---av > img,
@ -33,16 +37,19 @@ div.content > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth
width: 42px; width: 42px;
height: 42px; height: 42px;
object-fit: cover; object-fit: cover;
object-position: top;
} }
.cCompactAvatars { .cCompactAvatars {
width: 30px !important; width: 30px !important;
height: 30px !important; height: 30px !important;
object-fit: cover; object-fit: cover;
object-position: top;
} }
.profile_thumb > a > img { .profile_thumb > a > img {
width: 50px; width: 50px;
height: 50px; height: 50px;
object-fit: cover; object-fit: cover;
object-position: top;
} }

View file

@ -1435,7 +1435,7 @@ textarea {
.toTop { .toTop {
position: fixed; position: fixed;
padding: 20px; padding: 12px;
width: 100px; width: 100px;
height: 100%; height: 100%;
background-color: #f3f3f3; background-color: #f3f3f3;
@ -1445,9 +1445,34 @@ textarea {
opacity: 0; opacity: 0;
transition: .1s all; transition: .1s all;
z-index: 129; z-index: 129;
user-select: none;
} }
body.scrolled .toTop:hover { .toTop > div svg {
display: inline-block;
margin-right: 2px;
width: 8px;
height: 7px;
fill: #3f3f3f;
}
.toTop > div span {
font-weight: bold;
}
.toTop.has_down #to_up, .toTop #to_back {
display: none;
}
.toTop.has_down #to_back {
display: block;
}
.toTop.has_down {
opacity: .3;
}
body.scrolled .toTop:hover, .toTop.has_down:hover {
opacity: .5; opacity: .5;
cursor: pointer; cursor: pointer;
} }
@ -3143,7 +3168,7 @@ body.article .floating_sidebar, body.article .page_content {
position: absolute; position: absolute;
z-index: 128; z-index: 128;
width: 100%; width: 100%;
height: 100vh; min-height: 100vh;
padding: 20px; padding: 20px;
box-sizing: border-box; box-sizing: border-box;
background-color: #fff; background-color: #fff;

View file

@ -1,4 +1,4 @@
u(".comment-reply").on("click", function(e) { u(document).on("click", ".comment-reply", function(e) {
let comment = u(e.target).closest(".post"); let comment = u(e.target).closest(".post");
let authorId = comment.data("owner-id"); let authorId = comment.data("owner-id");
let authorNm = u(".post-author > a > b", comment.first()).text().trim(); let authorNm = u(".post-author > a > b", comment.first()).text().trim();
@ -8,6 +8,8 @@ u(".comment-reply").on("click", function(e) {
let mention = ("[" + (fromGroup ? "club" : "id") + authorId + "|" + authorNm + "], "); let mention = ("[" + (fromGroup ? "club" : "id") + authorId + "|" + authorNm + "], ");
// Substitute pervious mention if present, prepend otherwise // Substitute pervious mention if present, prepend otherwise
inputbox.nodes[0].value = inputbox.nodes[0].value.replace(/(^\[([A-Za-z0-9]+)\|([\p{L} 0-9@]+)\], |^)/u, mention); inputbox.nodes.forEach(node => {
node.value = node.value.replace(/(^\[([A-Za-z0-9]+)\|([\p{L} 0-9@]+)\], |^)/u, mention);
})
inputbox.trigger("focusin"); inputbox.trigger("focusin");
}); });

View file

@ -84,6 +84,7 @@ u(document).on('click', '#__feed_settings_link', (e) => {
const CURRENT_PERPAGE = Number(__temp_url.searchParams.get('posts') ?? 10) const CURRENT_PERPAGE = Number(__temp_url.searchParams.get('posts') ?? 10)
const CURRENT_PAGE = Number(__temp_url.searchParams.get('p') ?? 1) const CURRENT_PAGE = Number(__temp_url.searchParams.get('p') ?? 1)
const CURRENT_RETURN_BANNED = Number(__temp_url.searchParams.get('return_banned') ?? 0) const CURRENT_RETURN_BANNED = Number(__temp_url.searchParams.get('return_banned') ?? 0)
const CURRENT_AUTO_SCROLL = Number(localStorage.getItem('ux.auto_scroll') ?? 1)
const COUNT = [1, 5, 10, 20, 30, 40, 50] const COUNT = [1, 5, 10, 20, 30, 40, 50]
u('#_feed_settings_container #__content').html(` u('#_feed_settings_container #__content').html(`
<table cellspacing="7" cellpadding="0" border="0" align="center"> <table cellspacing="7" cellpadding="0" border="0" align="center">
@ -107,11 +108,21 @@ u(document).on('click', '#__feed_settings_link', (e) => {
<tr> <tr>
<td width="120" valign="top"> <td width="120" valign="top">
<span class="nobold"> <span class="nobold">
<input type='checkbox' id="showIgnored" ${CURRENT_RETURN_BANNED == 1 ? 'checked' : ''}> <input type='checkbox' name='showIgnored' id="showIgnored" ${CURRENT_RETURN_BANNED == 1 ? 'checked' : ''}>
</span> </span>
</td> </td>
<td> <td>
${tr('show_ignored_sources')} <label for='showIgnored'>${tr('show_ignored_sources')}</label>
</td>
</tr>
<tr>
<td width="120" valign="top">
<span class="nobold">
<input type='checkbox' data-act='localstorage_item' name='ux.auto_scroll' id="ux.auto_scroll" ${CURRENT_AUTO_SCROLL == 1 ? 'checked' : ''}>
</span>
</td>
<td>
<label for='ux.auto_scroll'>${tr('auto_scroll')}</label>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -268,3 +279,7 @@ u(document).on('click', '#__feed_settings_link', (e) => {
__switchTab('main') __switchTab('main')
}) })
u(document).on('change', `input[data-act='localstorage_item']`, (e) => {
localStorage.setItem(e.target.name, Number(e.target.checked))
})

View file

@ -19,7 +19,8 @@ var tooltipTemplate = Handlebars.compile(`
</table> </table>
`); `);
tippy(".mention", { tippy.delegate("body", {
target: '.mention',
theme: "light vk", theme: "light vk",
content: "⌛", content: "⌛",
allowHTML: true, allowHTML: true,

View file

@ -631,6 +631,35 @@ class bigPlayer {
duration: this.tracks["currentTrack"].length duration: this.tracks["currentTrack"].length
}) })
} }
loadContextPage(page, lesser = false) {
const formdata = new FormData()
formdata.append("context", this.context["context_type"])
formdata.append("context_entity", this.context["context_id"])
formdata.append("hash", u("meta[name=csrf]").attr("value"))
formdata.append("page", page)
ky.post("/audios/context", {
hooks: {
afterResponse: [
async (_request, _options, response) => {
const newArr = await response.json()
if(lesser)
this.tracks["tracks"] = newArr["items"].concat(this.tracks["tracks"])
else
this.tracks["tracks"] = this.tracks["tracks"].concat(newArr["items"])
this.context["playedPages"].push(String(newArr["page"]))
this.updateButtons()
console.info("Loaded context for page " + page)
}
]
},
body: formdata
})
}
} }
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {

View file

@ -201,7 +201,7 @@ $(document).on("click", ".sugglist a", (e) => {
}) })
// нажатие на пагинатор у постов предложки // нажатие на пагинатор у постов предложки
$(document).on("click", "#postz .paginator a", (e) => { /*$(document).on("click", "#postz .paginator a", (e) => {
e.preventDefault() e.preventDefault()
ky(e.currentTarget.href, { ky(e.currentTarget.href, {
@ -228,4 +228,4 @@ $(document).on("click", "#postz .paginator a", (e) => {
] ]
} }
}) })
}) })*/

View file

@ -399,6 +399,7 @@ async function OpenVideo(video_arr = [], init_player = true)
details.find('.media-page-wrapper-description b').remove() details.find('.media-page-wrapper-description b').remove()
u('#ovk-player-info').html(details.html()) u('#ovk-player-info').html(details.html())
bsdnHydrate()
} }
}) })
@ -461,7 +462,7 @@ u(document).on('click', '#videoOpen', (e) => {
u(document).on("keydown", "#write > form", function(event) { u(document).on("keydown", "#write > form", function(event) {
if(event.ctrlKey && event.keyCode === 13) if(event.ctrlKey && event.keyCode === 13)
this.submit(); u(event.target).closest('form').find(`input[type='submit']`).nodes[0].click()
}); });
u(document).on('keydown', '.edit_menu #write', (e) => { u(document).on('keydown', '.edit_menu #write', (e) => {
@ -542,7 +543,8 @@ var tooltipClientNoInfoTemplate = Handlebars.compile(`
</table> </table>
`); `);
tippy(".client_app", { tippy.delegate("body", {
target: '.client_app',
theme: "light vk", theme: "light vk",
content: "⌛", content: "⌛",
allowHTML: true, allowHTML: true,
@ -2003,6 +2005,85 @@ $(document).on("click", ".avatarDelete", (e) => {
]); ]);
}) })
async function __processPaginatorNextPage(page)
{
const container = u('.scroll_container')
const container_node = '.scroll_node'
const parser = new DOMParser
const replace_url = new URL(location.href)
replace_url.searchParams.set('p', page)
/*replace_url.searchParams.set('al', 1)
replace_url.searchParams.set('hash', u("meta[name=csrf]").attr("value"))*/
const new_content = await fetch(replace_url.href)
const new_content_response = await new_content.text()
const parsed_content = parser.parseFromString(new_content_response, 'text/html')
const nodes = parsed_content.querySelectorAll(container_node)
nodes.forEach(node => {
container.append(node)
})
u(`.paginator:not(.paginator-at-top)`).html(parsed_content.querySelector('.paginator:not(.paginator-at-top)').innerHTML)
if(u(`.paginator:not(.paginator-at-top)`).nodes[0].closest('.scroll_container')) {
container.nodes[0].append(u(`.paginator:not(.paginator-at-top)`).nodes[0].parentNode)
}
if(window.player) {
window.player.loadContextPage(page)
}
if(typeof __scrollHook != 'undefined') {
__scrollHook(page)
}
}
const showMoreObserver = new IntersectionObserver(entries => {
entries.forEach(async x => {
if(x.isIntersecting) {
if(Number(localStorage.getItem('ux.auto_scroll') ?? 1) == 0) {
return
}
if(u('.scroll_container').length < 1) {
return
}
const target = u(x.target)
if(target.length < 1 || target.hasClass('paginator-at-top')) {
return
}
const current_url = new URL(location.href)
if(current_url.searchParams && !isNaN(parseInt(current_url.searchParams.get('p')))) {
return
}
target.addClass('lagged')
const active_tab = target.find('.active')
const next_page = u(active_tab.nodes[0] ? active_tab.nodes[0].nextElementSibling : null)
if(next_page.length < 1) {
u('.paginator:not(.paginator-at-top)').removeClass('lagged')
return
}
const page_number = Number(next_page.html())
await __processPaginatorNextPage(page_number)
bsdnHydrate()
u('.paginator:not(.paginator-at-top)').removeClass('lagged')
}
})
}, {
root: null,
rootMargin: '0px',
threshold: 0,
})
if(u('.paginator:not(.paginator-at-top)').length > 0) {
showMoreObserver.observe(u('.paginator:not(.paginator-at-top)').nodes[0])
}
u(document).on('click', '#__sourceAttacher', (e) => { u(document).on('click', '#__sourceAttacher', (e) => {
MessageBox(tr('add_source'), ` MessageBox(tr('add_source'), `
<div id='source_flex_kunteynir'> <div id='source_flex_kunteynir'>

View file

@ -63,7 +63,7 @@ document.addEventListener("DOMContentLoaded", function() { //BEGIN
}); });
/* @rem-pai why this func wasn't named as "#_deleteDialog"? It looks universal IMO */ /* @rem-pai why this func wasn't named as "#_deleteDialog"? It looks universal IMO */
u("#_noteDelete").on("click", function(e) { u(document).on("click", "#_noteDelete", function(e) {
var formHtml = "<form id='tmpPhDelF' action='" + u(this).attr("href") + "' >"; var formHtml = "<form id='tmpPhDelF' action='" + u(this).attr("href") + "' >";
formHtml += "<input type='hidden' name='hash' value='" + u("meta[name=csrf]").attr("value") + "' />"; formHtml += "<input type='hidden' name='hash' value='" + u("meta[name=csrf]").attr("value") + "' />";
formHtml += "</form>"; formHtml += "</form>";
@ -140,7 +140,7 @@ document.addEventListener("DOMContentLoaded", function() { //BEGIN
return false; return false;
}); });
u("#_submitUserSubscriptionAction").handle("submit", async function(e) { u(document).handle("submit", "#_submitUserSubscriptionAction", async function(e) {
u(this).nodes[0].parentElement.classList.add('loading'); u(this).nodes[0].parentElement.classList.add('loading');
u(this).nodes[0].parentElement.classList.add('disable'); u(this).nodes[0].parentElement.classList.add('disable');
console.log(e.target); console.log(e.target);

View file

@ -1,14 +1,35 @@
window.addEventListener("scroll", function(e) { window.addEventListener("scroll", function(e) {
if(window.scrollY < 100) { if(window.scrollY < 100) {
if(window.temp_y_scroll) {
u('.toTop').addClass('has_down')
}
document.body.classList.toggle("scrolled", false); document.body.classList.toggle("scrolled", false);
} else { } else {
document.body.classList.toggle("scrolled", true); document.body.classList.toggle("scrolled", true);
u('.toTop').removeClass('has_down')
} }
}); });
u(".toTop").on("click", function(e) { u(".toTop").on("click", function(e) {
const y_scroll = window.scrollY
const scroll_margin = 20
if(y_scroll > 100) {
window.temp_y_scroll = y_scroll
window.scrollTo(0, scroll_margin)
window.scrollTo({ window.scrollTo({
top: 0, top: 0,
behavior: "smooth" behavior: "smooth"
}); })
}); } else {
if(window.temp_y_scroll) {
window.scrollTo(0, window.temp_y_scroll - scroll_margin)
window.scrollTo({
top: window.temp_y_scroll,
behavior: "smooth"
})
}
}
u(document).trigger('scroll')
})

View file

@ -220,6 +220,7 @@
"all_news" = "All news"; "all_news" = "All news";
"posts_per_page" = "Number of posts per page"; "posts_per_page" = "Number of posts per page";
"show_ignored_sources" = "Show ignored sources"; "show_ignored_sources" = "Show ignored sources";
"auto_scroll" = "Autoscroll";
"attachment" = "Attachment"; "attachment" = "Attachment";
"post_as_group" = "Post as group"; "post_as_group" = "Post as group";

View file

@ -205,6 +205,7 @@
"all_news" = "Все новости"; "all_news" = "Все новости";
"posts_per_page" = "Количество записей на странице"; "posts_per_page" = "Количество записей на странице";
"show_ignored_sources" = "Показывать игнорируемые источники"; "show_ignored_sources" = "Показывать игнорируемые источники";
"auto_scroll" = "Автоматическая прокрутка";
"attachment" = "Вложение"; "attachment" = "Вложение";
"post_as_group" = "От имени сообщества"; "post_as_group" = "От имени сообщества";
"comment_as_group" = "От имени сообщества"; "comment_as_group" = "От имени сообщества";