Pinning groups to the left menu

This commit allows you to pin groups to the left menu (max 10 groups, only those in which you are the administrator) from the My Groups page. Fixes #186
This commit is contained in:
Maxim Leshchenko 2021-11-10 10:45:06 +02:00
parent 610b2bda6d
commit e3358fcfa5
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; return is_null($this->getRecord()->owner_comment) ? "" : $this->getRecord()->owner_comment;
} }
function isOwnerClubPinned(): bool
{
return (bool) $this->getRecord()->owner_club_pinned;
}
function getDescription(): ?string function getDescription(): ?string
{ {
return $this->getRecord()->about; return $this->getRecord()->about;

View file

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

View file

@ -473,6 +473,38 @@ class User extends RowModel
return sizeof($sel); 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 function getMeetings(int $page = 1): \Traversable
{ {
$sel = $this->getRecord()->related("event_turnouts.user")->page($page, OPENVK_DEFAULT_PER_PAGE); $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\Themes\Themepacks;
use openvk\Web\Models\Entities\Photo; use openvk\Web\Models\Entities\Photo;
use openvk\Web\Models\Repositories\Users; use openvk\Web\Models\Repositories\Users;
use openvk\Web\Models\Repositories\Clubs;
use openvk\Web\Models\Repositories\Albums; use openvk\Web\Models\Repositories\Albums;
use openvk\Web\Models\Repositories\Videos; use openvk\Web\Models\Repositories\Videos;
use openvk\Web\Models\Repositories\Notes; use openvk\Web\Models\Repositories\Notes;
@ -80,6 +81,38 @@ final class UserPresenter extends OpenVKPresenter
$this->template->page = $this->queryParam("p") ?? 1; $this->template->page = $this->queryParam("p") ?? 1;
} }
} }
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 function renderEdit(): void
{ {

View file

@ -169,6 +169,12 @@
href="{$menuItem['url']}" href="{$menuItem['url']}"
target="_blank" target="_blank"
class="link">{$menuItem["name"]}</a> 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 <a
n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable']" n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable']"

View file

@ -40,4 +40,23 @@
{block description} {block description}
{$x->getDescription()} {$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} {/block}

View file

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