Merge pull request #282 from maksalees/pinning-groups-to-left-menu

Pinning groups to the left menu
This commit is contained in:
Vladimir Barinov 2021-11-11 12:46:06 +03:00 committed by GitHub
commit 202c203b80
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 105 additions and 1 deletions

View file

@ -95,6 +95,11 @@ class Club extends RowModel
return is_null($this->getRecord()->owner_comment) ? "" : $this->getRecord()->owner_comment;
}
function isOwnerClubPinned(): bool
{
return (bool) $this->getRecord()->owner_club_pinned;
}
function getDescription(): ?string
{
return $this->getRecord()->about;

View file

@ -42,5 +42,10 @@ class Manager extends RowModel
return is_null($this->getRecord()->comment) ? "" : $this->getRecord()->comment;
}
function isClubPinned(): bool
{
return (bool) $this->getRecord()->club_pinned;
}
use Traits\TSubscribable;
}

View file

@ -473,6 +473,38 @@ class User extends RowModel
return sizeof($sel);
}
function getPinnedClubs(): \Traversable
{
foreach($this->getRecord()->related("groups.owner")->where("owner_club_pinned", true) as $target) {
$target = (new Clubs)->get($target->id);
if(!$target) continue;
yield $target;
}
foreach($this->getRecord()->related("group_coadmins.user")->where("club_pinned", true) as $target) {
$target = (new Clubs)->get($target->club);
if(!$target) continue;
yield $target;
}
}
function getPinnedClubCount(): int
{
return sizeof($this->getRecord()->related("groups.owner")->where("owner_club_pinned", true)) + sizeof($this->getRecord()->related("group_coadmins.user")->where("club_pinned", true));
}
function isClubPinned(Club $club): bool
{
if($club->getOwner()->getId() === $this->getId())
return $club->isOwnerClubPinned();
$manager = $club->getManager($this);
if(!is_null($manager))
return $manager->isClubPinned();
}
function getMeetings(int $page = 1): \Traversable
{
$sel = $this->getRecord()->related("event_turnouts.user")->page($page, OPENVK_DEFAULT_PER_PAGE);

View file

@ -4,6 +4,7 @@ use openvk\Web\Util\Sms;
use openvk\Web\Themes\Themepacks;
use openvk\Web\Models\Entities\Photo;
use openvk\Web\Models\Repositories\Users;
use openvk\Web\Models\Repositories\Clubs;
use openvk\Web\Models\Repositories\Albums;
use openvk\Web\Models\Repositories\Videos;
use openvk\Web\Models\Repositories\Notes;
@ -81,6 +82,38 @@ final class UserPresenter extends OpenVKPresenter
}
}
function renderPinClub(): void
{
$this->assertUserLoggedIn();
$club = (new Clubs)->get((int) $this->queryParam("club"));
if(!$club)
$this->notFound();
if(!$club->canBeModifiedBy($this->user->identity ?? NULL))
$this->flashFail("err", "Ошибка доступа", "У вас недостаточно прав, чтобы изменять этот ресурс.");
$isClubPinned = $this->user->identity->isClubPinned($club);
if(!$isClubPinned && $this->user->identity->getPinnedClubCount() > 10)
$this->flashFail("err", "Ошибка", "Находится в левом меню могут максимум 10 групп");
if($club->getOwner()->getId() === $this->user->identity->getId()) {
$club->setOwner_Club_Pinned(!$isClubPinned);
$club->save();
} else {
$manager = $club->getManager($this->user->identity);
if(!is_null($manager)) {
$manager->setClub_Pinned(!$isClubPinned);
$manager->save();
}
}
if($isClubPinned)
$this->flashFail("succ", "Операция успешна", "Группа " . $club->getName() . " была успешно удалена из левого меню");
else
$this->flashFail("succ", "Операция успешна", "Группа " . $club->getName() . " была успешно добавлена в левое меню");
}
function renderEdit(): void
{
$this->assertUserLoggedIn();

View file

@ -169,6 +169,12 @@
href="{$menuItem['url']}"
target="_blank"
class="link">{$menuItem["name"]}</a>
<div n:if="$thisUser->getPinnedClubCount() > 0" style="height: 1px;background: #CCC;margin: 4px 0 2px;"></div>
<a
n:foreach="$thisUser->getPinnedClubs() as $club"
href="{$club->getURL()}"
style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap;"
class="link">{$club->getName()}</a>
<a
n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable']"

View file

@ -40,4 +40,23 @@
{block description}
{$x->getDescription()}
{if $x->canBeModifiedBy($thisUser ?? NULL)}
{var clubPinned = $thisUser->isClubPinned($x)}
<table n:if="$clubPinned || $thisUser->getPinnedClubCount() <= 10">
<tbody>
<tr>
<td width="120" valign="top"><span class="nobold">{_actions}: </span></td>
<td>
<a href="/groups_pin?club={$x->getId()}&hash={rawurlencode($csrfToken)}">
{if $clubPinned}
{_remove_from_sidebar}
{else}
{_add_to_sidebar}
{/if}
</a>
</td>
</tr>
</tbody>
</table>
{/if}
{/block}

View file

@ -151,6 +151,8 @@ routes:
handler: "Group->modifyAdmin"
- url: "/groups{num}"
handler: "User->groups"
- url: "/groups_pin"
handler: "User->pinClub"
- url: "/groups_create"
handler: "Group->create"
- url: "/audios{num}"

View file

@ -0,0 +1,2 @@
ALTER TABLE `groups` ADD COLUMN `owner_club_pinned` BOOLEAN NOT NULL DEFAULT FALSE AFTER `owner_hidden`;
ALTER TABLE `group_coadmins` ADD COLUMN `club_pinned` BOOLEAN DEFAULT FALSE NOT NULL;

@ -1 +1 @@
Subproject commit ce4ede6f8c6cb42f2421969fab23da933c81b52b
Subproject commit a4003623be856185679a7976423b7914455d8ab9