mirror of
https://github.com/openvk/openvk
synced 2024-11-13 10:39:24 +03:00
Merge pull request #282 from maksalees/pinning-groups-to-left-menu
Pinning groups to the left menu
This commit is contained in:
commit
202c203b80
9 changed files with 105 additions and 1 deletions
|
@ -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;
|
||||||
|
|
|
@ -42,5 +42,10 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -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
|
function renderEdit(): void
|
||||||
{
|
{
|
||||||
$this->assertUserLoggedIn();
|
$this->assertUserLoggedIn();
|
||||||
|
|
|
@ -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']"
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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}"
|
||||||
|
|
2
install/sqls/00009-pinned-clubs.sql
Normal file
2
install/sqls/00009-pinned-clubs.sql
Normal 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;
|
2
locales
2
locales
|
@ -1 +1 @@
|
||||||
Subproject commit ce4ede6f8c6cb42f2421969fab23da933c81b52b
|
Subproject commit a4003623be856185679a7976423b7914455d8ab9
|
Loading…
Reference in a new issue