Search: Add search with parameters (#880)

* Search with parameters

* Small improvements

* Small improvements no.2

Поиск теперь нормально выглядит на других темах
При поиске по группам отображается количество участников там
Костыль с пропуском постов возвращён но немного изменён
Добавлен костыль к комментариям чтобы не показывались комменты с удалённых постов и не было бага как в вепуровке
Добавлены ключи в советском и имперском языке для моих прошлых пуллов (ну и этого конечно)

* Fix debilny oshibky

Убрал лишние ключи локализации, исправил панель поеска и исправил hometown

* fiksy bagiv

* ok

* ok 2

* ok

* rrrrrrrrrrrrrrrr

Добавил параметры в vkapi users.search(), пофиксил проверку коммерции, сузил параметры ещё больше и добавил анимацию выдвижения поиска чтобы красиво было
This commit is contained in:
lalka2018 2023-06-10 18:54:02 +03:00 committed by GitHub
parent 8fb1be6be6
commit f9f6270da0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 1473 additions and 82 deletions

View file

@ -150,7 +150,10 @@ final class Users extends VKAPIRequestHandler
break;
case "interests":
$response[$i]->interests = $usr->getInterests();
break;
break;
case "rating":
$response[$i]->rating = $usr->getRating();
break;
}
}
@ -188,19 +191,94 @@ final class Users extends VKAPIRequestHandler
];
}
function search(string $q, string $fields = "", int $offset = 0, int $count = 100)
function search(string $q,
string $fields = "",
int $offset = 0,
int $count = 100,
string $city = "",
string $hometown = "",
int $sex = 2,
int $status = 0, # это про marital status
bool $online = false,
# дальше идут параметры которых нету в vkapi но есть на сайте
string $profileStatus = "", # а это уже нормальный статус
int $sort = 0,
int $before = 0,
int $politViews = 0,
int $after = 0,
string $interests = "",
string $fav_music = "",
string $fav_films = "",
string $fav_shows = "",
string $fav_books = "",
string $fav_quotes = ""
)
{
$users = new UsersRepo;
$sortg = "id ASC";
$nfilds = $fields;
switch($sort) {
case 0:
$sortg = "id DESC";
break;
case 1:
$sortg = "id ASC";
break;
case 2:
$sortg = "first_name DESC";
break;
case 3:
$sortg = "first_name ASC";
break;
case 4:
$sortg = "rating DESC";
if(!str_contains($nfilds, "rating")) {
$nfilds .= "rating";
}
break;
case 5:
$sortg = "rating DESC";
if(!str_contains($nfilds, "rating")) {
$nfilds .= "rating";
}
break;
}
$array = [];
$find = $users->find($q);
$parameters = [
"city" => !empty($city) ? $city : NULL,
"hometown" => !empty($hometown) ? $hometown : NULL,
"gender" => $sex < 2 ? $sex : NULL,
"maritalstatus" => (bool)$status ? $status : NULL,
"politViews" => (bool)$politViews ? $politViews : NULL,
"is_online" => $online ? 1 : NULL,
"status" => !empty($profileStatus) ? $profileStatus : NULL,
"before" => $before != 0 ? $before : NULL,
"after" => $after != 0 ? $after : NULL,
"interests" => !empty($interests) ? $interests : NULL,
"fav_music" => !empty($fav_music) ? $fav_music : NULL,
"fav_films" => !empty($fav_films) ? $fav_films : NULL,
"fav_shows" => !empty($fav_shows) ? $fav_shows : NULL,
"fav_books" => !empty($fav_books) ? $fav_books : NULL,
"fav_quotes" => !empty($fav_quotes) ? $fav_quotes : NULL,
];
$find = $users->find($q, $parameters, $sortg);
foreach ($find as $user)
$array[] = $user->getId();
return (object) [
"count" => $find->size(),
"items" => $this->get(implode(',', $array), $fields, $offset, $count)
"items" => $this->get(implode(',', $array), $nfilds, $offset, $count)
];
}
}

View file

@ -66,4 +66,12 @@ class Applications
{
return sizeof($this->appRels->where("user", $user->getId()));
}
function find(string $query, array $pars = [], string $sort = "id"): Util\EntityStream
{
$query = "%$query%";
$result = $this->apps->where("CONCAT_WS(' ', name, description) LIKE ?", $query)->where("enabled", 1);
return new Util\EntityStream("Application", $result->order("$sort"));
}
}

View file

@ -43,12 +43,12 @@ class Clubs
return $this->toClub($this->clubs->get($id));
}
function find(string $query, int $page = 1, ?int $perPage = NULL): \Traversable
function find(string $query, array $pars = [], string $sort = "id DESC", int $page = 1, ?int $perPage = NULL): \Traversable
{
$query = "%$query%";
$result = $this->clubs->where("name LIKE ? OR about LIKE ?", $query, $query);
return new Util\EntityStream("Club", $result);
return new Util\EntityStream("Club", $result->order($sort));
}
function getCount(): int

View file

@ -59,4 +59,35 @@ class Comments
"deleted" => false,
]));
}
function find(string $query = "", array $pars = [], string $sort = "id"): Util\EntityStream
{
$query = "%$query%";
$notNullParams = [];
foreach($pars as $paramName => $paramValue)
if($paramName != "before" && $paramName != "after")
$paramValue != NULL ? $notNullParams+=["$paramName" => "%$paramValue%"] : NULL;
else
$paramValue != NULL ? $notNullParams+=["$paramName" => "$paramValue"] : NULL;
$result = $this->comments->where("content LIKE ?", $query)->where("deleted", 0);
$nnparamsCount = sizeof($notNullParams);
if($nnparamsCount > 0) {
foreach($notNullParams as $paramName => $paramValue) {
switch($paramName) {
case "before":
$result->where("created < ?", $paramValue);
break;
case "after":
$result->where("created > ?", $paramValue);
break;
}
}
}
return new Util\EntityStream("Comment", $result->order("$sort"));
}
}

View file

@ -99,7 +99,39 @@ class Posts
return NULL;
}
function find(string $query = "", array $pars = [], string $sort = "id"): Util\EntityStream
{
$query = "%$query%";
$notNullParams = [];
foreach($pars as $paramName => $paramValue)
if($paramName != "before" && $paramName != "after")
$paramValue != NULL ? $notNullParams+=["$paramName" => "%$paramValue%"] : NULL;
else
$paramValue != NULL ? $notNullParams+=["$paramName" => "$paramValue"] : NULL;
$result = $this->posts->where("content LIKE ?", $query)->where("deleted", 0);
$nnparamsCount = sizeof($notNullParams);
if($nnparamsCount > 0) {
foreach($notNullParams as $paramName => $paramValue) {
switch($paramName) {
case "before":
$result->where("created < ?", $paramValue);
break;
case "after":
$result->where("created > ?", $paramValue);
break;
}
}
}
return new Util\EntityStream("Post", $result->order("$sort"));
}
function getPostCountOnUserWall(int $user): int
{
return sizeof($this->posts->where(["wall" => $user, "deleted" => 0]));

View file

@ -49,12 +49,88 @@ class Users
return $this->toUser($this->users->where("user", $user->getId())->fetch());
}
function find(string $query): Util\EntityStream
function find(string $query, array $pars = [], string $sort = "id DESC"): Util\EntityStream
{
$query = "%$query%";
$result = $this->users->where("CONCAT_WS(' ', first_name, last_name, pseudo, shortcode) LIKE ?", $query)->where("deleted", 0);
return new Util\EntityStream("User", $result);
$notNullParams = [];
$nnparamsCount = 0;
foreach($pars as $paramName => $paramValue)
if($paramName != "before" && $paramName != "after" && $paramName != "gender" && $paramName != "maritalstatus" && $paramName != "politViews")
$paramValue != NULL ? $notNullParams += ["$paramName" => "%$paramValue%"] : NULL;
else
$paramValue != NULL ? $notNullParams += ["$paramName" => "$paramValue"] : NULL;
$nnparamsCount = sizeof($notNullParams);
if($nnparamsCount > 0) {
foreach($notNullParams as $paramName => $paramValue) {
switch($paramName) {
case "hometown":
$result->where("hometown LIKE ?", $paramValue);
break;
case "city":
$result->where("city LIKE ?", $paramValue);
break;
case "maritalstatus":
$result->where("marital_status ?", $paramValue);
break;
case "status":
$result->where("status LIKE ?", $paramValue);
break;
case "politViews":
$result->where("polit_views ?", $paramValue);
break;
case "email":
$result->where("email_contact LIKE ?", $paramValue);
break;
case "telegram":
$result->where("telegram LIKE ?", $paramValue);
break;
case "site":
$result->where("telegram LIKE ?", $paramValue);
break;
case "address":
$result->where("address LIKE ?", $paramValue);
break;
case "is_online":
$result->where("online >= ?", time() - 900);
break;
case "interests":
$result->where("interests LIKE ?", $paramValue);
break;
case "fav_mus":
$result->where("fav_music LIKE ?", $paramValue);
break;
case "fav_films":
$result->where("fav_films LIKE ?", $paramValue);
break;
case "fav_shows":
$result->where("fav_shows LIKE ?", $paramValue);
break;
case "fav_books":
$result->where("fav_books LIKE ?", $paramValue);
break;
case "fav_quote":
$result->where("fav_quote LIKE ?", $paramValue);
break;
case "before":
$result->where("UNIX_TIMESTAMP(since) < ?", $paramValue);
break;
case "after":
$result->where("UNIX_TIMESTAMP(since) > ?", $paramValue);
break;
case "gender":
$result->where("sex ?", $paramValue);
break;
}
}
}
return new Util\EntityStream("User", $result->order($sort));
}
function getStatistics(): object

View file

@ -45,4 +45,36 @@ class Videos
{
return sizeof($this->videos->where("owner", $user->getId())->where(["deleted" => 0, "unlisted" => 0]));
}
function find(string $query = "", array $pars = [], string $sort = "id"): Util\EntityStream
{
$query = "%$query%";
$notNullParams = [];
foreach($pars as $paramName => $paramValue)
if($paramName != "before" && $paramName != "after")
$paramValue != NULL ? $notNullParams+=["$paramName" => "%$paramValue%"] : NULL;
else
$paramValue != NULL ? $notNullParams+=["$paramName" => "$paramValue"] : NULL;
$result = $this->videos->where("name OR description LIKE ?", $query)->where("deleted", 0);
$nnparamsCount = sizeof($notNullParams);
if($nnparamsCount > 0) {
foreach($notNullParams as $paramName => $paramValue) {
switch($paramName) {
case "before":
$result->where("created < ?", $paramValue);
break;
case "after":
$result->where("created > ?", $paramValue);
break;
}
}
}
return new Util\EntityStream("Video", $result->order("$sort"));
}
}

View file

@ -1,18 +1,28 @@
<?php declare(strict_types=1);
namespace openvk\Web\Presenters;
use openvk\Web\Models\Entities\{User, Club};
use openvk\Web\Models\Repositories\{Users, Clubs};
use openvk\Web\Models\Repositories\{Users, Clubs, Posts, Comments, Videos, Applications, Notes};
use Chandler\Database\DatabaseConnection;
final class SearchPresenter extends OpenVKPresenter
{
private $users;
private $clubs;
private $posts;
private $comments;
private $videos;
private $apps;
private $notes;
function __construct(Users $users, Clubs $clubs)
{
$this->users = $users;
$this->clubs = $clubs;
$this->users = $users;
$this->clubs = $clubs;
$this->posts = new Posts;
$this->comments = new Comments;
$this->videos = new Videos;
$this->apps = new Applications;
$this->notes = new Notes;
parent::__construct();
}
@ -21,6 +31,8 @@ final class SearchPresenter extends OpenVKPresenter
{
$query = $this->queryParam("query") ?? "";
$type = $this->queryParam("type") ?? "users";
$sorter = $this->queryParam("sort") ?? "id";
$invert = $this->queryParam("invert") == 1 ? "ASC" : "DESC";
$page = (int) ($this->queryParam("p") ?? 1);
$this->willExecuteWriteAction();
@ -28,11 +40,58 @@ final class SearchPresenter extends OpenVKPresenter
$this->assertUserLoggedIn();
# https://youtu.be/pSAWM5YuXx8
$repos = [ "groups" => "clubs", "users" => "users" ];
$repos = [
"groups" => "clubs",
"users" => "users",
"posts" => "posts",
"comments" => "comments",
"videos" => "videos",
"audios" => "posts",
"apps" => "apps",
"notes" => "notes"
];
switch($sorter) {
default:
case "id":
$sort = "id " . $invert;
break;
case "name":
$sort = "first_name " . $invert;
break;
case "rating":
$sort = "rating " . $invert;
break;
}
$parameters = [
"type" => $this->queryParam("type"),
"city" => $this->queryParam("city") != "" ? $this->queryParam("city") : NULL,
"maritalstatus" => $this->queryParam("maritalstatus") != 0 ? $this->queryParam("maritalstatus") : NULL,
"with_photo" => $this->queryParam("with_photo"),
"status" => $this->queryParam("status") != "" ? $this->queryParam("status") : NULL,
"politViews" => $this->queryParam("politViews") != 0 ? $this->queryParam("politViews") : NULL,
"email" => $this->queryParam("email"),
"telegram" => $this->queryParam("telegram"),
"site" => $this->queryParam("site") != "" ? "https://".$this->queryParam("site") : NULL,
"address" => $this->queryParam("address"),
"is_online" => $this->queryParam("is_online") == 1 ? 1 : NULL,
"interests" => $this->queryParam("interests") != "" ? $this->queryParam("interests") : NULL,
"fav_mus" => $this->queryParam("fav_mus") != "" ? $this->queryParam("fav_mus") : NULL,
"fav_films" => $this->queryParam("fav_films") != "" ? $this->queryParam("fav_films") : NULL,
"fav_shows" => $this->queryParam("fav_shows") != "" ? $this->queryParam("fav_shows") : NULL,
"fav_books" => $this->queryParam("fav_books") != "" ? $this->queryParam("fav_books") : NULL,
"fav_quote" => $this->queryParam("fav_quote") != "" ? $this->queryParam("fav_quote") : NULL,
"hometown" => $this->queryParam("hometown") != "" ? $this->queryParam("hometown") : NULL,
"before" => $this->queryParam("datebefore") != "" ? strtotime($this->queryParam("datebefore")) : NULL,
"after" => $this->queryParam("dateafter") != "" ? strtotime($this->queryParam("dateafter")) : NULL,
"gender" => $this->queryParam("gender") != "" && $this->queryParam("gender") != 2 ? $this->queryParam("gender") : NULL
];
$repo = $repos[$type] or $this->throwError(400, "Bad Request", "Invalid search entity $type.");
$results = $this->{$repo}->find($query);
$results = $this->{$repo}->find($query, $parameters, $sort);
$iterator = $results->page($page);
$count = $results->size();

View file

@ -70,28 +70,60 @@
<a href="/logout?hash={urlencode($csrfToken)}">{_header_log_out}</a>
</div>
{else}
<div class="link">
<div class="link dec">
<a href="/">{_header_home}</a>
</div>
<div class="link">
<div class="link dec">
<a href="/search?type=groups">{_header_groups}</a>
</div>
<div class="link">
<div class="link dec">
<a href="/search">{_header_search}</a>
</div>
<div class="link">
<div class="link dec">
<a href="/invite">{_header_invite}</a>
</div>
<div class="link">
<div class="link dec">
<a href="/support">{_header_help} <b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b></a>
</div>
<div class="link">
<div class="link dec">
<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>
{var $atSearch = str_contains($_SERVER['REQUEST_URI'], "/search")}
<div id="srch" class="{if $atSearch}nodivider{else}link{/if}">
{if !$atSearch}
<form action="/search" method="get" id="searcher" style="position:relative;">
<input id="searchInput" onfocus="expandSearch()" onblur="decreaseSearch()" class="sr" 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" />
<select name="type" class="whatFind" style="display:none;top: 0px;">
<option value="users">{_s_by_people}</option>
<option value="groups">{_s_by_groups}</option>
<option value="posts">{_s_by_posts}</option>
<option value="comments">{_s_by_comments}</option>
<option value="videos">{_s_by_videos}</option>
<option value="apps">{_s_by_apps}</option>
</select>
</form>
{else}
<form action="/search" method="get" id="searcher" style="margin-top: -1px;position:relative;">
<input id="searchInput" value="{$_GET['query'] ?? ''}" type="search" class="sr" name="query" placeholder="{_header_search}" style="height: 20px; background-color: #fff; padding-left: 6px;width: 555px;" title="{_header_search} [Alt+Shift+F]" accesskey="f" />
<select name="type" class="whatFind">
<option value="users" {if str_contains($_SERVER['REQUEST_URI'], "type=users")}selected{/if}>{_s_by_people}</option>
<option value="groups" {if str_contains($_SERVER['REQUEST_URI'], "type=groups")}selected{/if}>{_s_by_groups}</option>
<option value="posts" {if str_contains($_SERVER['REQUEST_URI'], "type=posts")}selected{/if}>{_s_by_posts}</option>
<option value="comments" {if str_contains($_SERVER['REQUEST_URI'], "type=comments")}selected{/if}>{_s_by_comments}</option>
<option value="videos" {if str_contains($_SERVER['REQUEST_URI'], "type=videos")}selected{/if}>{_s_by_videos}</option>
<option value="apps" {if str_contains($_SERVER['REQUEST_URI'], "type=apps")}selected{/if}>{_s_by_apps}</option>
</select>
<button class="searchBtn"><span style="color:white;font-weight: 600;font-size:12px;">{_header_search}</span></button>
</form>
<script>
let els = document.querySelectorAll("div.dec")
for(const element of els)
{
element.style.display = "none"
}
</script>
{/if}
</div>
{/if}
{else}

View file

@ -1,11 +1,7 @@
{extends "../@listView.xml"}
{extends "../@layout.xml"}
{block title}
{if $type === "users"}
{tr("search_for_people")}
{else}
{tr("search_for_groups")}
{/if}
{tr("search_for_$type")}
{if $_GET['query']}
- {$_GET['query']}
{/if}
@ -13,41 +9,17 @@
{block header}
{=OPENVK_ROOT_CONF["openvk"]["appearance"]["name"]} »
{if $type === "users"}
{tr("search_for_people")}
{else}
{tr("search_for_groups")}
{/if}
{tr("search_for_$type")}
{/block}
{* BEGIN ELEMENTS DESCRIPTION *}
{block tabs}
<div {if $type === "users"}id="activetabs"{/if} class="tab">
<a {if $type === "users"}id="act_tab_a"{/if} href="/search?type=users{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}">
{_users}
</a>
</div>
<div {if $type === "groups"}id="activetabs"{/if} class="tab">
<a {if $type === "groups"}id="act_tab_a"{/if} href="/search?type=groups{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}">
{_groups}
</a>
</div>
</div>
<form class="header_search_inputbt">
<input name="type" type="hidden" value="{$type ?? 'users'}" />
<input name="query" class="header_search_input" placeholder="{_search_placeholder}" value="{$_GET['query'] ?? ''}" />
<button class="button_search">{_search_button}</button>
</form>
<p style="margin-left: 15px; margin-top: 0;">
<b>{tr("results", $count)}</b>
</p>
<div>
{/block}
{block link|strip|stripHtml}
{$x->getURL()}
{if $type != "apps"}
{$x->getURL()}
{else}
/app{$x->getId()}
{/if}
{/block}
{block preview}
@ -55,17 +27,72 @@
{/block}
{block name}
<text style="overflow: hidden;">&nbsp;{$x->getCanonicalName()}</text>
<img n:if="$x->isVerified()"
class="name-checkmark"
src="/assets/packages/static/openvk/img/checkmark.png"
/>
{if $type != "apps"}
<text style="overflow: hidden;">&nbsp;{$x->getCanonicalName()}
{if $_GET['sort'] == "rating"}({$x->getRating()}%)
{elseif $_GET['sort'] == "id"}(id{$x->getId()}){/if}</text>
<img n:if="$x->isVerified()"
class="name-checkmark"
src="/assets/packages/static/openvk/img/checkmark.png"
/>
{else}
{$x->getName()}
{/if}
{/block}
{block description}
<table class="ugc-table">
<tbody>
{if $type === "users"}
{if !is_null($_GET['status']) && $_GET['status'] != ""}
<tr>
<td><span class="nobold">{_status}:</span></td>
<td>{$x->getStatus()}</td>
</tr>
{/if}
{if !is_null($_GET['city']) && $_GET['city'] != "" && $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_city}:</span></td>
<td>{$x->getCity()}</td>
</tr>
{/if}
{if !is_null($_GET['city']) && $_GET['hometown'] != "" && $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_hometown}:</span></td>
<td>{$x->getHometown()}</td>
</tr>
{/if}
{if !is_null($_GET['politViews']) && $_GET['politViews'] != 0 && $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_politViews}:</span></td>
<td>{tr("politViews_".$x->getPoliticalViews())}</td>
</tr>
{/if}
{if !is_null($_GET['email']) && $_GET['email'] != "" && $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_email}:</span></td>
<td>{$x->getContactEmail()}</td>
</tr>
{/if}
{if !is_null($_GET['telegram']) && $_GET['telegram'] != "" && $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_telegram}:</span></td>
<td><a href="tg://resolve?domain={$x->getTelegram()}">@{$x->getTelegram()}</a></td>
</tr>
{/if}
{if !is_null($_GET['site']) && $_GET['site'] != "" && $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_personal_website}:</span></td>
<td><a href="{$x->getWebsite()}">{$x->getWebsite()}</a></td>
</tr>
{/if}
{if !is_null($_GET['address']) && $_GET['address'] != "" && $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_address}:</span></td>
<td><a href="{$x->getPhysicalAddress()}">{$x->getPhysicalAddress()}</a></td>
</tr>
{/if}
{if $x->getPrivacySetting("page.info.read") > 1}
<tr>
<td><span class="nobold">{_gender}: </span></td>
<td>{$x->isFemale() ? tr("female") : tr("male")}</td>
@ -78,15 +105,253 @@
<td><span class="nobold">{_registration_date}: </span></td>
<td>{$x->getRegistrationTime()}</td>
</tr>
{/if}
{/if}
<tr>
{if !empty($x->getDescription())}
{if $type != "apps"}
<td>
<span class="nobold">{_description}:</span>
</td>
{/if}
<td>
{$x->getDescription() ?? '(' . tr("none") . ')'}
</td>
</tr>
{/if}
{if $type == "groups"}
<td>
<span class="nobold">{_size}:</span>
</td>
<td>
{tr("participants", $x->getFollowersCount())}
</td>
{/if}
</tbody>
</table>
{/block}
{block content}
<style>
.comment, .post-divider
{
border:none;
}
</style>
<div style="margin-top:-7px">
{include "../components/paginator.xml", conf => (object) [
"page" => $page,
"count" => $count,
"amount" => sizeof($data),
"perPage" => $perPage ?? OPENVK_DEFAULT_PER_PAGE,
"atBottom" => false,
]}
</div>
<p style="margin-left: 15px; margin-top: 0;">
<b>{tr("results", $count)}</b>
</p>
<div>
{include searchOptions}
{var $data = is_array($iterator) ? $iterator : iterator_to_array($iterator)}
<div class="container_gray borderup" style="float:left;width:73.3%;">
{if sizeof($data) > 0}
{if $type == "users" || $type == "groups" || $type == "apps"}
<div class="content" n:foreach="$data as $dat">
<table>
<tbody>
<tr>
<td valign="top">
<a href="{include link, x => $dat}">
{include preview, x => $dat}
</a>
</td>
<td valign="top" style="width: 100%">
{ifset infotable}
{include infotable, x => $dat}
{else}
<a href="{include link, x => $dat}">
<b>
{include name, x => $dat}
</b>
</a>
<br/>
{include description, x => $dat}
{/ifset}
</td>
<td n:ifset="actions" valign="top" class="action_links" style="width: 150px;">
{include actions, x => $dat}
</td>
</tr>
</tbody>
</table>
</div>
{elseif $type == "posts"}
<div n:foreach="$data as $dat" class="content">
{if !$dat || $dat->getTargetWall() < 0 && $dat->getWallOwner()->isHideFromGlobalFeedEnabled()}
{_closed_group_post}.
{else}
{include "../components/post.xml", post => $dat, commentSection => true, onWallOf => true}
{/if}
</div>
{elseif $type == "comments"}
<div n:foreach="$data as $dat" class="content">
{if !$dat->getTarget() || $dat->getTarget()->isDeleted()}
{_deleted_target_comment}.
{else}
{include "../components/comment.xml", comment => $dat, linkW => true}
{/if}
</div>
{elseif $type == "videos"}
{foreach $data as $dat}
{if $dat->getOwner()->isDeleted()}
{php continue;}
{else}
<div class="content">
{include "../components/video.xml", video => $dat}
</div>
{/if}
{/foreach}
{elseif $type == "audios"}
хуй
{/if}
{else}
{ifset customErrorMessage}
{include customErrorMessage}
{else}
{include "../components/nothing.xml"}
{/ifset}
{/if}
</div>
<script>
window.addEventListener("load", (event) => {
document.getElementsByClassName("container_gray")[0].style.minHeight = document.getElementsByClassName("searchOptions")[0].clientHeight+"px";
document.getElementsByClassName("searchOptions")[0].style.minHeight = document.getElementsByClassName("container_gray")[0].clientHeight-3+"px";
})
</script>
{/block}
{block searchOptions}
<div class="searchOptions">
<ul class="searchList">
<li {if $type === "users"} id="used"{/if}><a href="/search?type=users{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id"> {_s_people} {if $type === "users"} ({$count}){/if}</a></li>
<li {if $type === "groups"} id="used"{/if}><a href="/search?type=groups{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id"> {_s_groups} {if $type === "groups"} ({$count}){/if}</a></li>
<li {if $type === "comments"}id="used"{/if}><a href="/search?type=comments{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id">{_s_comments} {if $type === "comments"}({$count}){/if}</a></li>
<li {if $type === "posts"} id="used"{/if}><a href="/search?type=posts{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id"> {_s_posts} {if $type === "posts"} ({$count}){/if}</a></li>
<li {if $type === "videos"} id="used"{/if}><a href="/search?type=videos{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id"> {_s_videos} {if $type === "videos"} ({$count}){/if}</a></li>
<!--<li {if $type === "audios"}id="used"{/if}><a href="/search?type=audios{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id">{_s_audios} {if $type === "audios"} ({$count}){/if}</a></li>-->
<li {if $type === "apps"} id="used"{/if}><a href="/search?type=apps{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id"> {_s_apps} {if $type === "apps"} ({$count}){/if}</a></li>
<!--<li {if $type === "notes"}id="used"{/if}><a href="/search?type=notes{if $_GET['query']}&query={urlencode($_GET['query'])}{/if}&sort=id">{_s_notes} {if $type === "notes"}({$count}){/if}</a></li>-->
</ul>
<div class="searchOption">
<div class="searchOptionName" id="n_sort" onclick="hideParams('sort')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{_s_order_by}</div>
<div class="searchOptionBlock" id="s_sort">
<select name="sort" form="searcher" id="sortyor">
<option value="id" {if $_GET["sort"] == "name"}selected{/if}>{_s_order_by_id}</option>
{if $type == "users"}
<option value="name" {if $_GET["sort"] == "name"}selected{/if}>{_s_order_by_name}</option>
{if OPENVK_ROOT_CONF["openvk"]["preferences"]["commerce"]}
<option value="rating" {if $_GET["sort"] == "rating"}selected{/if}>{_s_order_by_rating}</option>
{/if}
{/if}
</select>
<div id="invertor">
<input type="checkbox" name="invert" value="1" form="searcher" {if !is_null($_GET['invert']) && $_GET['invert'] == "1"}checked{/if}>{_s_order_invert}
</div>
</div>
</div>
{if $type !== "groups" && $type !== "apps"} {* В OpenVK не сохраняется дата создания группы *}
<div class="searchOption">
<div class="searchOptionName" id="n_dates" onclick="hideParams('dates')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{_s_by_date}</div>
<div class="searchOptionBlock" id="s_dates">
<p id="bydate">{_s_date_before}:<br>
<input type="date" name="datebefore"
form="searcher"
id="bydate"
style="width:100%"
value="{if !is_null($_GET['datebefore'])}{$_GET['datebefore']}{/if}"
min="2019-11-19"
max={date('Y-m-d')}></p>
<p id="bydate">{_s_date_after}:<br>
<input type="date" name="dateafter"
form="searcher"
style="width:100%"
id="bydate"
value="{if !is_null($_GET['dateafter'])}{$_GET['dateafter']}{/if}"
min="2019-11-18"
max={date('Y-m-d')}></p>
</div>
</div>
{/if}
{if $type === "users"}
<div class="searchOption">
<div class="searchOptionName" id="n_main" onclick="hideParams('main')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{_main}</div>
<div class="searchOptionBlock" id="s_main">
<input type="text" value="{if !is_null($_GET['status'])}{$_GET['status']}{/if}" form="searcher" placeholder="{_status}" name="status">
<input type="text" value="{if !is_null($_GET['city'])}{$_GET['city']}{/if}" form="searcher" placeholder="{_city}" name="city">
<input type="text" value="{if !is_null($_GET['hometown'])}{$_GET['hometown']}{/if}" form="searcher" placeholder="{_hometown}" name="hometown">
<input name="is_online" type="checkbox" {if !is_null($_GET['is_online']) && $_GET['is_online'] == "1"}checked{/if} form="searcher" value="1">{_s_now_on_site}
</div>
</div>
<div class="searchOption">
<div class="searchOptionName" id="n_gender" onclick="hideParams('gender')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{_gender}</div>
<div class="searchOptionBlock" id="s_gender">
<p><input type="radio" form="searcher" {if $_GET['gender'] == 0}checked{/if} name="gender" value="0">{_male}</p>
<p><input type="radio" form="searcher" {if $_GET['gender'] == 1}checked{/if} name="gender" value="1">{_female}</p>
<p><input type="radio" form="searcher" {if $_GET['gender'] == 2 || is_null($_GET['gender'])}checked{/if} name="gender" value="2">{_s_any}</p>
</div>
</div>
<div class="searchOption">
<div class="searchOptionName" id="n_relationship" onclick="hideParams('relationship')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{ovk_proc_strtr(tr("relationship"), 14)}</div>
<div class="searchOptionBlock" id="s_relationship">
<select name="maritalstatus" form="searcher">
<option n:foreach="range(0, 8) as $i" value="{$i}" {if $_GET['maritalstatus'] == $i}selected{/if} form="searcher">
{tr("relationship_".$i)}
</option>
</select>
</div>
</div>
<div class="searchOption">
<div class="searchOptionName" id="n_politViews" onclick="hideParams('politViews')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{_politViews}</div>
<div class="searchOptionBlock" id="s_politViews">
<select name="politViews" form="searcher">
<option n:foreach="range(0, 9) as $i" value="{$i}" {if $_GET['politViews'] == $i}selected{/if} form="searcher">
{tr("politViews_".$i)}
</option>
</select>
</div>
</div>
<div class="searchOption">
<div class="searchOptionName" id="n_contacts" onclick="hideParams('contacts')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{_contacts}</div>
<div class="searchOptionBlock" id="s_contacts">
<input type="text" name="email" value="{if !is_null($_GET['email'])}{$_GET['email']}{/if}" form="searcher" placeholder="{_email}">
<input type="text" name="telegram" value="{if !is_null($_GET['telegram'])}{$_GET['telegram']}{/if}" form="searcher" placeholder="{_telegram}"><br id="contacts">
<input type="text" name="site" value="{if !is_null($_GET['site'])}{$_GET['site']}{/if}" form="searcher" placeholder="{_personal_website}"><br id="contacts">
<input type="text" name="address" value="{if !is_null($_GET['address'])}{$_GET['address']}{/if}" form="searcher" placeholder="{_address}">
</div>
</div>
<div class="searchOption">
<div class="searchOptionName" id="n_interests" onclick="hideParams('interests')"><img src="/assets/packages/static/openvk/img/hide.png" class="searchHide">{_interests}</div>
<div class="searchOptionBlock" id="s_interests">
<input type="text" value="{if !is_null($_GET['interests'])}{$_GET['interests']}{/if}" form="searcher" placeholder="{_interests}" name="interests">
<input type="text" value="{if !is_null($_GET['fav_mus'])}{$_GET['fav_mus']}{/if}" form="searcher" placeholder="{_favorite_music}" name="fav_mus">
<input type="text" value="{if !is_null($_GET['fav_films'])}{$_GET['fav_films']}{/if}" form="searcher" placeholder="{_favorite_films}" name="fav_films">
<input type="text" value="{if !is_null($_GET['fav_shows'])}{$_GET['fav_shows']}{/if}" form="searcher" placeholder="{_favorite_shows}" name="fav_shows">
<input type="text" value="{if !is_null($_GET['fav_books'])}{$_GET['fav_books']}{/if}" form="searcher" placeholder="{_favorite_books}" name="fav_books">
<input type="text" value="{if !is_null($_GET['fav_quote'])}{$_GET['fav_quote']}{/if}" form="searcher" placeholder="{_favorite_quotes}" name="fav_quote">
</div>
</div>
<!--<input name="with_photo" type="checkbox" {if !is_null($_GET['with_photo']) && $_GET['with_photo'] == "on"}checked{/if} form="searcher">{_s_with_photo}-->
{/if}
<input class="button" type="button" id="dnt" value="{_reset}" onclick="resetSearch()">
</div>
{/block}

View file

@ -420,11 +420,11 @@
</tr>
<tr n:if="!is_null($user->getHometown())">
<td class="label"><span class="nobold">{_hometown}:</span></td>
<td class="data">{$user->getHometown()}</td>
<td class="data"><a href="/search?type=users&query=&hometown={urlencode($user->getHometown())}">{$user->getHometown()}</a></td>
</tr>
<tr>
<td class="label"><span class="nobold">{_politViews}:</span></td>
<td class="data">{var $pviews = $user->getPoliticalViews()}{_"politViews_$pviews"}</td>
<td class="data"><a {if $user->getPoliticalViews() != 0}href="/search?type=users&query=&politViews={$user->getPoliticalViews()}"{/if}>{var $pviews = $user->getPoliticalViews()}{_"politViews_$pviews"}</a></td>
</tr>
<tr n:if="!is_null($user->getBirthday())">
<td class="label"><span class="nobold">{_birth_date}:</span></td>
@ -470,7 +470,7 @@
</tr>
<tr n:if="!is_null($user->getCity())">
<td class="label"><span class="nobold">{_city}:</span></td>
<td class="data">{$user->getCity()}</td>
<td class="data"><a href="/search?type=users&query=&city={$user->getCity()}">{$user->getCity()}</a></td>
</tr>
<tr n:if="!is_null($user->getPhysicalAddress())">
<td class="label"><span class="nobold">{_address}:</span></td>
@ -484,23 +484,54 @@
<tbody n:ifcontent>
<tr n:if="!is_null($user->getInterests())">
<td class="label"><span class="nobold">{_interests}: </span></td>
<td class="data">{$user->getInterests()}</td>
<td class="data">
{var $interests = explode(", ", $user->getInterests())}
{foreach $interests as $interest}
<a href="/search?type=users&query=&interests={urlencode($interest)}">{$interest}</a>{if $interest != end($interests)},{/if}
{/foreach}
</td>
</tr>
<tr n:if="!is_null($user->getFavoriteMusic())">
<td class="label"><span class="nobold">{_favorite_music}: </span></td>
<td class="data">{$user->getFavoriteMusic()}</td>
<td class="data">
{var $musics = explode(", ", $user->getFavoriteMusic())}
{foreach $musics as $music}
<a href="/search?type=users&query=&fav_mus={urlencode($music)}">{$music}</a>{if $music != end($musics)},{/if}
{/foreach}
</td>
</tr>
<tr n:if="!is_null($user->getFavoriteFilms())">
<td class="label"><span class="nobold">{_favorite_films}: </span></td>
<td class="data">{$user->getFavoriteFilms()}</td>
<td class="data">
{var $films = explode(", ", $user->getFavoriteFilms())}
{foreach $films as $film}
<a href="/search?type=users&query=&fav_films={urlencode($film)}">{$film}</a>{if $film != end($films)},{/if}
{/foreach}
</td>
</tr>
<tr n:if="!is_null($user->getFavoriteShows())">
<td class="label"><span class="nobold">{_favorite_shows}: </span></td>
<td class="data">{$user->getFavoriteShows()}</td>
<td class="data">
{var $shows = explode(", ", $user->getFavoriteShows())}
{foreach $shows as $show}
<a href="/search?type=users&query=&fav_shows={urlencode($show)}">{$show}</a>{if $show != end($shows)},{/if}
{/foreach}
</td>
</tr>
<tr n:if="!is_null($user->getFavoriteBooks())">
<td class="label"><span class="nobold">{_favorite_books}: </span></td>
<td class="data">{$user->getFavoriteBooks()}</td>
<td class="data">
{var $books = explode(", ", $user->getFavoriteBooks())}
{foreach $books as $book}
<a href="/search?type=users&query=&fav_books={urlencode($book)}">{$book}</a>{if $book != end($books)},{/if}
{/foreach}
</td>
</tr>
<tr n:if="!is_null($user->getFavoriteQuote())">
<td class="label"><span class="nobold">{_favorite_quotes}: </span></td>

View file

@ -29,11 +29,12 @@
</div>
</div>
<div n:if="isset($thisUser) &&! ($compact ?? false)" class="post-menu">
<a href="#_comment{$comment->getId()}" class="date">{$comment->getPublicationTime()}</a>&nbsp;|
<a {if is_null($linkW)}href="#_comment{$comment->getId()}"{else}href="wall{!is_null($comment->getTarget()) ? $comment->getTarget()->getPrettyId() : $comment->getOwner()->getId()}#_comment{$comment->getId()}"{/if} class="date">{$comment->getPublicationTime()}</a>&nbsp;|
{if $comment->canBeDeletedBy($thisUser)}
<a href="/comment{$comment->getId()}/delete">{_delete}</a>&nbsp;|
{/if}
<a class="comment-reply">{_reply}</a>
{if is_null($linkW)}
<a class="comment-reply">{_reply}</a>{/if}
<div style="float: right; font-size: .7rem;">
<a class="post-like-button" href="/comment{$comment->getId()}/like?hash={rawurlencode($csrfToken)}">
<div class="heart" style="{if $comment->hasLikeFrom($thisUser)}opacity: 1;{else}opacity: 0.4;{/if}"></div>

View file

@ -0,0 +1,35 @@
<table>
<tbody>
<tr>
<td valign="top">
<div class="video-preview">
<a href="/video{$video->getPrettyId()}">
<img src="{$video->getThumbnailURL()}"
style="max-width: 170px; max-height: 127px; margin: auto;" >
</a>
</div>
</td>
<td valign="top" style="width: 100%">
{ifset infotable}
{include infotable, x => $dat}
{else}
<a href="/video{$video->getPrettyId()}">
<b>
{$video->getName()}
</b>
</a>
<br/>
<p>
<span>{$video->getDescription() ?? ""}</span>
</p>
<span style="color: grey;">{_video_uploaded} {$video->getPublicationTime()}</span><br/>
<p>
<a href="/video{$video->getPrettyId()}">{_view_video}</a>
{if $video->getCommentsCount() > 0}| <a href="/video{$video->getPrettyId()}#comments">{_comments} ({$video->getCommentsCount()})</a>{/if}
</p>
{/ifset}
</td>
</tr>
</tbody>
</table>

View file

@ -97,6 +97,14 @@ h1 {
background-size: 1.5px 41px;
}
.header_navigation .nodivider {
display: inline-block;
height: 29px;
padding: 11px 4px 0 7px;
background: none;
background-size: 1.5px 41px;
}
.header_navigation .link a {
color: #D7D7D7;
text-decoration: none;
@ -670,6 +678,7 @@ select {
font-family: tahoma, verdana, arial, sans-serif;
width: 100%;
box-sizing: border-box;
outline:none;
}
.header2 {
@ -2301,6 +2310,167 @@ a.poll-retract-vote {
display: none;
}
.searchOptions
{
overflow: hidden;
width:25.5%;
border-top:1px solid #E5E7E6;
float:right;
scrollbar-width: none;
font-size:12px;
background-color:#f7f7f7;
margin-right: -7px;
}
.searchBtn
{
border: solid 1px #575757;
background-color: #696969;
color:white;
margin-left: -11px;
padding-bottom:2px;
width:80px;
cursor: pointer;
box-shadow: 0px 2px 0px 0px rgba(255, 255, 255, 0.18) inset;
margin-top: 1px;
}
.searchBtn:active
{
border: solid 1px #666666;
background-color: #696969;
color:white;
box-shadow: 0px -2px 0px 0px rgba(255, 255, 255, 0.18) inset;
}
.searchList
{
list-style: none;
user-select: none;
padding-left:0px;
}
.searchList #used
{
margin-left:0px;
color: white;
padding:2px;
padding-top:5px;
padding-bottom:5px;
border: solid 0.125rem #696969;
background:linear-gradient(#888888,#858585);
margin-bottom:2px;
padding-left:9px;
width:87%;
}
.searchList #used a
{
color: white;
}
.sr:focus
{
outline:none;
}
.searchHide
{
padding-right: 5px;
}
.searchList li
{
margin-left:0px;
color: #2B587A !important;
cursor:pointer;
padding:2px;
padding-top:5px;
padding-bottom:5px;
margin-bottom:2px;
padding-left:9px;
}
.searchList li a
{
min-width:100%;
}
.searchList li:hover
{
margin-left:0px;
color: #2B587A !important;
background:#ebebeb;
padding:2px;
padding-top:5px;
padding-bottom:5px;
margin-bottom:2px;
padding-left:9px;
width:91%;
}
.whatFind
{
color:rgb(128, 128, 128);
background:none;
border:none;
position:absolute;
width:150px;
cursor:pointer;
right:80px;
text-align:right;
margin-top: 0.5px;
}
.searchOptionName
{
cursor:pointer;
background-color: #EAEAEA;
padding-left:5px;
padding-top:5px;
padding-bottom:5px;
width: 90%;
font-weight: 600;
color: #585858;
border-bottom: 2px solid #E4E4E4;
}
.searchOption
{
user-select: none;
}
.searchOptionBlock
{
margin-top: -5px;
padding-top:10px;
max-width:92%;
padding-bottom:6px;
}
.searchOptionBlock select
{
padding-left:7px;
padding-top:3px;
padding-bottom:3px;
cursor:pointer;
}
.searchOptionBlock input[type=text], input[type=date]
{
margin-bottom:5px;
}
.borderup
{
border-top:1px solid #E5E7E6;
}
#searchInput
{
transition: .3s linear;
}
#standaloneCommentBox {
position: sticky;
top: 0;

BIN
Web/static/img/hide.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

BIN
Web/static/img/show.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

View file

@ -568,6 +568,80 @@ function deleteAvatar(avatar)
]);
}
function expandSearch()
{
// console.log("search expanded")
let els = document.querySelectorAll("div.dec")
for(const element of els)
{
element.style.display = "none"
}
document.querySelector(".whatFind").style.display = "block";
document.querySelector(".whatFind").style.marginRight = "-80px";
document.getElementById("searchInput").style.width = "627px";
document.getElementById("searchInput").style.background = "none";
document.getElementById("searchInput").style.backgroundColor = "#fff";
document.getElementById("searchInput").style.paddingLeft = "6px";
srch.classList.add("nodivider")
}
async function decreaseSearch()
{
// чтобы люди успели выбрать что искать и поиск не скрывался сразу
await new Promise(r => setTimeout(r, 4000));
// console.log("search decreased")
if(document.activeElement !== searchInput)
{
document.getElementById("searchInput").style.background = "url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px";
document.getElementById("searchInput").style.backgroundColor = "#fff";
document.getElementById("searchInput").style.paddingLeft = "18px";
document.getElementById("searchInput").style.width = "120px";
document.querySelector(".whatFind").style.display = "none";
await new Promise(r => setTimeout(r, 300));
srch.classList.remove("nodivider")
let els = document.querySelectorAll("div.dec")
for(const element of els)
{
element.style.display = "inline-block"
}
}
}
function hideParams(name)
{
$("#s_"+name).slideToggle(250, "swing");
if($(`#n_${name} img`).attr("src") == "/assets/packages/static/openvk/img/hide.png")
{
$("#n_"+name+" img").attr("src", "/assets/packages/static/openvk/img/show.png");
} else {
$("#n_"+name+" img").attr("src", "/assets/packages/static/openvk/img/hide.png");
}
}
function resetSearch()
{
let inputs = document.querySelectorAll("input")
let selects = document.querySelectorAll("select")
for(const input of inputs)
{
if(input != dnt) {
input.value = ""
}
}
for(const select of selects)
{
if(select != sortyor && select != document.querySelector(".whatFind")) {
select.value = 0
}
}
}
$(document).on("scroll", () => {
if($(document).scrollTop() > $(".sidebar").height() + 50) {
$(".floating_sidebar")[0].classList.add("show");

View file

@ -91,6 +91,7 @@
"no_information_provided" = "No information provided.";
"deceased_person" = "Deceased person";
"none" = "none";
"desc_none" = "no description";
"send" = "Send";
"years_zero" = "0 year old";
@ -478,7 +479,12 @@
"apply_style_for_this_device" = "Apply style only for this device";
"search_for_groups" = "Search for groups";
"search_for_people" = "Search for people";
"search_for_users" = "Search for people";
"search_for_posts" = "Search for posts";
"search_for_comments" = "Search for comments";
"search_for_videos" = "Search for videos";
"search_for_apps" = "Search for apps";
"search_for_notes" = "Search for notes";
"search_button" = "Find";
"search_placeholder" = "Start typing any name, title or word";
"results_zero" = "No results";
@ -1450,3 +1456,48 @@
"tour_section_14_bottom_text_1" = "Screenshots";
"tour_section_14_bottom_text_2" = "This concludes the tour of the site. If you want to try our mobile app, create your own group here, invite your friends or find new ones, or just have some fun in general, you can do it right now with a small <a href='/reg'>registration</a>";
"tour_section_14_bottom_text_3" = "This concludes the tour of the site";
/* Search */
"s_people" = "People";
"s_groups" = "Clubs";
"s_events" = "Events";
"s_apps" = "Applications";
"s_questions" = "Questions";
"s_notes" = "Notes";
"s_themes" = "Themes";
"s_posts" = "Posts";
"s_comments" = "Comments";
"s_videos" = "Videos";
"s_audios" = "Music";
"s_by_people" = "for people";
"s_by_groups" = "for groups";
"s_by_posts" = "for posts";
"s_by_comments" = "for comments";
"s_by_videos" = "for videos";
"s_by_apps" = "for apps";
"s_by_audios" = "for musics";
"s_order_by" = "Order by...";
"s_order_by_id" = "By id";
"s_order_by_name" = "By name";
"s_order_by_random" = "By random";
"s_order_by_rating" = "By rating";
"s_order_invert" = "Invert";
"s_by_date" = "By date";
"s_date_before" = "Before";
"s_date_after" = "After";
"s_main" = "Main";
"s_now_on_site" = "now on site";
"s_with_photo" = "with photo";
"s_only_in_names" = "only in names";
"s_any" = "any";
"reset" = "Reset";
"closed_group_post" = "This is a post from private group";
"deleted_target_comment" = "This comment belongs to deleted post";

View file

@ -80,6 +80,7 @@
"no_information_provided" = "Информация отсутствует.";
"deceased_person" = "Страница покойного человека";
"none" = "отсутствует";
"desc_none" = "описание отсутствует";
"send" = "Отправить";
"years_zero" = "0 лет";
"years_one" = "1 год";
@ -452,7 +453,12 @@
"round_avatars" = "Круглые";
"apply_style_for_this_device" = "Применить стиль только для этого устройства";
"search_for_groups" = "Поиск групп";
"search_for_people" = "Поиск людей";
"search_for_users" = "Поиск людей";
"search_for_posts" = "Поиск записей";
"search_for_comments" = "Поиск комментариев";
"search_for_videos" = "Поиск видео";
"search_for_apps" = "Поиск приложений";
"search_for_notes" = "Поиск записок";
"search_button" = "Найти";
"search_placeholder" = "Начните вводить любое имя, название или слово";
"results_zero" = "Ни одного результата";
@ -1343,4 +1349,49 @@
"tour_section_14_bottom_text_1" = "Скриншоты приложения";
"tour_section_14_bottom_text_2" = "На этом экскурсия по сайту завершена. Если вы хотите попробовать наше мобильное приложение, создать здесь свою группу, позвать своих друзей или найти новых, или вообще просто как-нибудь поразвлекаться, то это можно сделать прямо сейчас, пройдя небольшую <a href='/reg'>регистрацию</a>";
"tour_section_14_bottom_text_3" = "На этом экскурсия по сайту завершена."
"tour_section_14_bottom_text_3" = "На этом экскурсия по сайту завершена.";
/* Search */
"s_people" = "Люди";
"s_groups" = "Группы";
"s_events" = "События";
"s_apps" = "Приложения";
"s_questions" = "Вопросы";
"s_notes" = "Заметки";
"s_themes" = "Темы";
"s_posts" = "Записи";
"s_comments" = "Комментарии";
"s_videos" = "Видео";
"s_audios" = "Аудио";
"s_by_people" = "по людям";
"s_by_groups" = "по группам";
"s_by_posts" = "по записям";
"s_by_comments" = "по комментариям";
"s_by_videos" = "по видео";
"s_by_apps" = "по приложениям";
"s_by_audios" = "по музыке";
"s_order_by" = "Порядок";
"s_order_by_id" = "По id";
"s_order_by_name" = "По имени";
"s_order_by_random" = "По случайности";
"s_order_by_rating" = "По рейтингу";
"s_order_invert" = "Инвертировать";
"s_by_date" = "По дате";
"s_date_before" = "До";
"s_date_after" = "После";
"s_main" = "Основное";
"s_now_on_site" = "cейчас на сайте";
"s_with_photo" = "с фото";
"s_only_in_names" = "только в именах";
"s_any" = "любой";
"reset" = "Сброс";
"closed_group_post" = "Эта запись из закрытой группы";
"deleted_target_comment" = "Этот комментарий принадлежит к удалённой записи";

View file

@ -151,6 +151,9 @@
"pinned" = "высказыванiе наверху";
"comments_tip" = "Будьте первымъ, кто оставитъ замѣчанiе.";
"your_comment" = "Вашъ комментарій";
"auditory" = "Смотритѣли";
"in_wall" = "на странiцу";
"in_group" = "в общѣство";
"shown" = "Показано";
"x_out_of" = "$1 изъ";
"wall_zero" = "Нѣтъ извѣстій";
@ -236,6 +239,7 @@
"only_administrators" = "Только администраторы";
"website" = "Сайтъ";
"managed" = "Управляемые";
"size" = "Размеръ";
"administrators_one" = "$1 администраторъ";
"administrators_few" = "$1 администратора";
@ -294,6 +298,35 @@
"albums_few" = "$1 альбома";
"albums_many" = "$1 альбомовъ";
"albums_other" = "$1 альбомовъ";
"albums_list_zero" = "У Васъ нетъ нi одного альбома с картiнками";
"albums_list_one" = "У Васъ одiн альбом с картiнками";
"albums_list_few" = "У Васъ $1 альбома с картiнками";
"albums_list_many" = "У Васъ $1 альбомовъ с картiнками";
"albums_list_other" = "У Васъ $1 альбомовъ с картiнками";
"add_image" = "Вклѣить фото";
"add_image_group" = "Вклѣйка фото";
"upload_new_picture" = "Вклеiть новую фото";
"uploading_new_image" = "Вклѣйка нового фото";
"friends_avatar" = "Знакомымъ будетъ проще узнать Васъ, если вы вклѣите своё настоящое фото.";
"groups_avatar" = "Хорошое фото сделает Вашу группу более узнаваѣмой.";
"formats_avatar" = "Вы можете вклѣить фото в формате JPG, GIF или PNG.";
"troubles_avatar" = "Ежѣли вознiкают проблѣмы с прикрѣплѣнiем, попробуйтѣ вклѣить фото меньшего размера.";
"webcam_avatar" = "Ежѣли Вашъ компьютер имѣет фотоаппаратъ, Вы можѣте <a href='javascript:'>сделать быстрое фото »</a>";
"update_avatar_notification" = "Фото странiцы обновлено";
"update_avatar_description" = "Нажмiте сюда, чтобы пѣрейти к просмотру";
"deleting_avatar" = "Вырѣзка фото";
"deleting_avatar_sure" = "Вы дѣйствительно хотите отклѣить фото?";
"deleted_avatar_notification" = "Фото успешно отклѣено";
"save_changes" = "Сохранiть измѣненiя";
"upd_m" = "обновил фото своѣй странiцы";
"upd_f" = "обновила фото своѣй странiцы";
"upd_g" = "обновило фото общѣства";
/* Notes */
@ -375,7 +408,12 @@
"round_avatars" = "Круглые";
"search_for_groups" = "Поискъ обществъ";
"search_for_people" = "Поискъ людей";
"search_for_users" = "Поискъ граждан";
"search_for_posts" = "Поискъ высказыванiй";
"search_for_comments" = "Поискъ очерковъ";
"search_for_videos" = "Поискъ синематографовъ";
"search_for_apps" = "Поискъ забав";
"search_for_notes" = "Поискъ запiсокъ";
"search_button" = "Найти";
"results_zero" = "Ни одного результата";
"results_one" = "Одинъ результатъ";
@ -689,3 +727,47 @@
"warning" = "Вниманіе";
"question_confirm" = "Это дѣйствіе нельзя отмѣнить. Вы дѣйствительно увѣрены въ томъ что хотите сдѣлать?";
/* Search */
"s_people" = "Гражданѣ";
"s_groups" = "Общѣства";
"s_events" = "События";
"s_apps" = "Забавы";
"s_questions" = "Вопросы";
"s_notes" = "Заметки";
"s_themes" = "Тѣмы";
"s_posts" = "Высказыванiя";
"s_comments" = "Очерки";
"s_videos" = "Сiнѣматографы";
"s_audios" = "Аудио";
"s_by_people" = "по гражданам";
"s_by_groups" = "по общѣствам";
"s_by_posts" = "по запiсям";
"s_by_comments" = "по очеркамъ";
"s_by_videos" = "по сiнѣматографамъ";
"s_by_apps" = "по забавам";
"s_by_audios" = "по музыке";
"s_order_by" = "Расположѣнiе";
"s_order_by_id" = "По порядковому номеру";
"s_order_by_name" = "По паспорту";
"s_order_by_random" = "По случайности";
"s_order_by_rating" = "По рейтингу";
"s_order_invert" = "Отразiть";
"s_by_date" = "По датѣ";
"s_date_before" = "До";
"s_date_after" = "После";
"s_main" = "Основное";
"s_now_on_site" = "cейчас тутъ";
"s_with_photo" = "с фотокарточкой";
"s_only_in_names" = "только в имѣнахъ";
"s_any" = "любой";
"reset" = "Сбросъ";
"closed_group_post" = "Это высказыванiе изъ закрытого общѣства";
"deleted_target_comment" = "Этотъ отзыв принадлѣжит к удалѣнному высказыванiю";

View file

@ -1,3 +1,5 @@
#include <ru>
"__locale" = "su_SU.utf8;su_SU.UTF-8;Rus";
"__WinEncoding" = "Windows-1251";
@ -154,6 +156,9 @@
"pinned" = "закреплено";
"comments_tip" = "Гражданин, будьте первым, кто напишет отзыв!";
"your_comment" = "Ваш отзыв";
"auditory" = "Зрители";
"in_wall" = "в досье";
"in_group" = "в собрание";
"shown" = "Показано";
"x_out_of" = "$1 из";
"wall_zero" = "нет записей";
@ -244,6 +249,7 @@
"only_administrators" = "Только администраторы";
"website" = "Сайт";
"managed" = "Управляемые";
"size" = "Размер";
"administrators_one" = "$1 администратор";
"administrators_few" = "$1 администратора";
@ -308,6 +314,36 @@
"albums_few" = "$1 альбома с картинками";
"albums_many" = "$1 альбомов с картинками";
"albums_other" = "$1 альбомов с картинками";
"albums_list_zero" = "У Вас нет ни одного альбома с картинками";
"albums_list_one" = "У Вас один альбом с картинками";
"albums_list_few" = "У Вас $1 альбома с картинками";
"albums_list_many" = "У Вас $1 альбомов с картинками";
"albums_list_other" = "У Вас $1 альбомов с картинками";
"add_image" = "Поставить фотокарточку";
"add_image_group" = "Загрузка фотокарточки";
"upload_new_picture" = "Загрузить новую фотокарточку";
"uploading_new_image" = "Загрузка новой фотокарточки";
"friends_avatar" = "Знакомым будет проще узнать Вас, если вы загрузите свою настоящую фотокарточку.";
"groups_avatar" = "Хорошая фотокарточка сделает Ваше собрание более узнаваемым.";
"formats_avatar" = "Вы можете загрузить плёнку в формате JPG, GIF или PNG.";
"troubles_avatar" = "Если возникают проблемы с прикреплением, попробуйте выбрать фотокарточку меньшего размера.";
"webcam_avatar" = "Если ваш компьютер оснащён фотокамерой, Вы можете <a href='javascript:'>сделать быструю фотокарточку »</a>";
"update_avatar_notification" = "Фотокарточка досье обновлена";
"update_avatar_description" = "Нажмите сюда, чтобы перейти к рассмотрению";
"deleting_avatar" = "Удаление фотокарточки";
"deleting_avatar_sure" = "Вы действительно хотите удалить фотокарточку?";
"deleted_avatar_notification" = "Фотокарточка успешно откреплена";
"save_changes" = "Сохранить изменения";
"upd_m" = "обновил фотокарточку на своём досье";
"upd_f" = "обновила фотокарточку на своём досье";
"upd_g" = "обновило фотокарточку собрания";
/* Notes */
@ -390,8 +426,14 @@
"cut" = "Обрезка";
"round_avatars" = "Круглая картинка";
"search_for_groups" = "Розыск клубов";
"search_for_people" = "Розыск граждан";
"search_for_groups" = "Розыск собраний";
"search_for_users" = "Розыск граждан";
"search_for_posts" = "Розыск записей";
"search_for_comments" = "Розыск отзывов";
"search_for_videos" = "Розыск кинолент";
"search_for_apps" = "Розыск приложений";
"search_for_notes" = "Розыск записок";
"search_button" = "Найти";
"search_placeholder" = "Начните вводить любое имя, название или слово";
"results_zero" = "Ни одного результата";
@ -889,3 +931,48 @@
"instance_links" = "Ссылки страны:";
"my_apps" = "Досуг и отдых";
/* Search */
"s_people" = "Граждане";
"s_groups" = "Собрания";
"s_events" = "События";
"s_apps" = "Приложения";
"s_questions" = "Вопросы";
"s_notes" = "Заметки";
"s_themes" = "Темы";
"s_posts" = "Записи";
"s_comments" = "Отзывы";
"s_videos" = "Киноленты";
"s_audios" = "Аудио";
"s_by_people" = "по гражданам";
"s_by_groups" = "по собраниям";
"s_by_posts" = "по записям";
"s_by_comments" = "по отзывам";
"s_by_videos" = "по кинолентам";
"s_by_apps" = "по приложениям";
"s_by_audios" = "по музыке";
"s_order_by" = "Расположение";
"s_order_by_id" = "По номерам";
"s_order_by_name" = "По имени";
"s_order_by_random" = "Наобум";
"s_order_by_rating" = "По соц. рейтингу";
"s_order_invert" = "Отразить";
"s_by_date" = "По дате";
"s_date_before" = "До";
"s_date_after" = "После";
"s_main" = "Паспорт";
"s_now_on_site" = "cейчас доступен";
"s_with_photo" = "с фотокарточкой";
"s_only_in_names" = "только в паспорте";
"s_any" = "любой";
"reset" = "Сброс";
"closed_group_post" = "Эта запись из закрытого собрания";
"deleted_target_comment" = "Этот отзыв надлежит к удалённой записи";

View file

@ -226,6 +226,110 @@ input[type="radio"] {
border-color: #514534;
}
.searchOptions
{
overflow-y: hidden;
overflow-x:hidden;
width:28.8%;
border-top:1px solid #2B2B2B;
float:right;
scrollbar-width: none;
font-size:12px;
background-color:#1e1a2b;
margin-right: -7px;
}
.searchBtn
{
border: solid 1px #484848;
background-color: #333;
color:#c6d2e8;
margin-left: -3px;
padding-bottom:2px;
width:80px;
cursor: pointer;
box-shadow: 0px 2px 0px 0px rgba(111, 111, 111, 0.18) inset;
}
.searchBtn:active
{
border: solid 1px #414141;
background-color: rgb(77, 77, 77);
color:white;
box-shadow: 0px -2px 0px 0px rgba(255, 255, 255, 0.18) inset;
}
.searchList #used
{
margin-left:0px;
color: white;
padding:2px;
padding-top:5px;
padding-bottom:5px;
border: solid 0.125rem #2f2f2f;
background: linear-gradient(#3c3c3c,#393939);
margin-bottom:2px;
padding-left:5px;
width:90%;
}
.searchList #used a
{
color: white;
}
.searchHide
{
padding-right: 5px;
}
.searchList li
{
margin-left:0px;
color: #2B587A !important;
cursor:pointer;
padding:2px;
padding-top:5px;
padding-bottom:5px;
margin-bottom:2px;
padding-left:5px;
}
.searchList li a
{
min-width:100%;
}
.searchList li:hover
{
margin-left:0px;
color: #2B587A !important;
background:#181522;
padding:2px;
padding-top:5px;
padding-bottom:5px;
margin-bottom:2px;
padding-left:5px;
width:91%;
}
.searchOptionName
{
cursor:pointer;
background-color: #120e1f;
padding-left:5px;
padding-top:5px;
padding-bottom:5px;
width: 90%;
font-weight: 600;
color: #c6d2e8;
}
.borderup
{
border-top:1px solid #2f2f2f;
}
#backdropEditor {
background-image: url("/themepack/midnight/0.0.2.7/resource/backdrop-editor.gif") !important;
border-color: #473e66 !important;

View file

@ -245,3 +245,95 @@ input[type=checkbox] {
width:100%;
background-color:#3c3c3c
}
.searchOptions
{
overflow-y: hidden;
overflow-x:hidden;
width:28.8%;
border-top:1px solid #2B2B2B;
float:right;
scrollbar-width: none;
font-size:12px;
background-color:#F6F6F6;
margin-right: -7px;
}
.searchBtn
{
border: none;
background-color: #555555;
color:#ffffff;
margin-left: -3px;
padding-bottom:2px;
width:80px;
cursor: pointer;
box-shadow: none;
}
.searchBtn:active
{
border: none;
background-color: rgb(77, 77, 77);
color:white;
box-shadow: none;
}
.searchList #used
{
margin-left:0px;
color: white;
padding:2px;
padding-top:5px;
padding-bottom:5px;
border: none;
background: #a4a4a4;
margin-bottom:2px;
padding-left:5px;
width:90%;
}
.searchList #used a
{
color: white;
}
.searchHide
{
padding-right: 5px;
}
.searchList li:hover
{
margin-left:0px;
color: #2B587A !important;
background:#eeeeee;
padding:2px;
padding-top:5px;
padding-bottom:5px;
margin-bottom:2px;
padding-left:5px;
width:91%;
}
.searchOptionName
{
cursor:pointer;
background-color: #a4a4a4;
padding-left:5px;
padding-top:5px;
padding-bottom:5px;
width: 90%;
font-weight: 600;
color: #fff;
}
.searchOptionName img
{
display:none;
}
.borderup
{
border-top:1px solid #2f2f2f;
}