commit
5bd96c08b0
@ -0,0 +1,19 @@ |
|||||||
|
.calendar-event-info { |
||||||
|
@apply flex flex-col space-y-4; |
||||||
|
|
||||||
|
.invitations-info { |
||||||
|
@apply space-y-2; |
||||||
|
|
||||||
|
&__title { |
||||||
|
@apply text-gray-50 mb-3; |
||||||
|
} |
||||||
|
|
||||||
|
&__item { |
||||||
|
@apply flex text-body-2 flex-row justify-between; |
||||||
|
|
||||||
|
p { |
||||||
|
@apply first:font-semibold; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
<script setup> |
||||||
|
import ShowLinks from "../resource_links/ShowLinks.vue" |
||||||
|
|
||||||
|
defineProps({ |
||||||
|
event: { |
||||||
|
type: Object, |
||||||
|
required: true, |
||||||
|
}, |
||||||
|
}) |
||||||
|
</script> |
||||||
|
|
||||||
|
<template> |
||||||
|
<div class="invitations-info"> |
||||||
|
<h6 |
||||||
|
v-t="'Invitations'" |
||||||
|
class="invitations-info__title" |
||||||
|
/> |
||||||
|
|
||||||
|
<div |
||||||
|
v-if="event.resourceLinkListFromEntity.length" |
||||||
|
class="invitations-info__item" |
||||||
|
> |
||||||
|
<p v-t="'Invitees'" /> |
||||||
|
<div> |
||||||
|
<ShowLinks |
||||||
|
:item="event" |
||||||
|
:show-status="false" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
@ -0,0 +1,69 @@ |
|||||||
|
<script setup> |
||||||
|
import ShowLinks from "../resource_links/ShowLinks.vue" |
||||||
|
import { subscriptionVisibility } from "../../constants/entity/ccalendarevent" |
||||||
|
|
||||||
|
defineProps({ |
||||||
|
event: { |
||||||
|
type: Object, |
||||||
|
required: true, |
||||||
|
}, |
||||||
|
}) |
||||||
|
</script> |
||||||
|
|
||||||
|
<template> |
||||||
|
<div class="invitations-info"> |
||||||
|
<h6 |
||||||
|
v-t="'Subscriptions'" |
||||||
|
class="invitations-info__title" |
||||||
|
/> |
||||||
|
|
||||||
|
<div class="invitations-info__item"> |
||||||
|
<p v-t="'Allow subscriptions'" /> |
||||||
|
<p |
||||||
|
v-if="subscriptionVisibility.no === event.subscriptionVisibility" |
||||||
|
v-text="'No'" |
||||||
|
/> |
||||||
|
<p |
||||||
|
v-else-if="subscriptionVisibility.all === event.subscriptionVisibility" |
||||||
|
v-text="'All system users'" |
||||||
|
/> |
||||||
|
<p |
||||||
|
v-else-if="subscriptionVisibility.class === event.subscriptionVisibility" |
||||||
|
v-text="'Users inside the class'" |
||||||
|
/> |
||||||
|
<p |
||||||
|
v-if="subscriptionVisibility.class === event.subscriptionVisibility" |
||||||
|
v-text="event.subscriptionItemTitle" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div |
||||||
|
v-if="event.maxAttendees" |
||||||
|
class="invitations-info__item" |
||||||
|
> |
||||||
|
<p v-t="'Maximum number of subscriptions'" /> |
||||||
|
<p v-text="event.maxAttendees" /> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div |
||||||
|
v-if="event.maxAttendees" |
||||||
|
class="invitations-info__item" |
||||||
|
> |
||||||
|
<p v-t="'Subscriptions count'" /> |
||||||
|
<p v-text="event.resourceLinkListFromEntity.length" /> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div |
||||||
|
v-if="event.resourceLinkListFromEntity.length" |
||||||
|
class="invitations-info__item" |
||||||
|
> |
||||||
|
<p v-t="'Subscribers'" /> |
||||||
|
<div> |
||||||
|
<ShowLinks |
||||||
|
:item="event" |
||||||
|
:show-status="false" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
import { post } from "./baseService" |
||||||
|
|
||||||
|
export default { |
||||||
|
post, |
||||||
|
} |
||||||
@ -1,137 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
declare(strict_types=1); |
|
||||||
|
|
||||||
/* For licensing terms, see /license.txt */ |
|
||||||
|
|
||||||
namespace Chamilo\CoreBundle\Entity; |
|
||||||
|
|
||||||
use Chamilo\CoreBundle\Traits\TimestampableTypedEntity; |
|
||||||
use Doctrine\Common\Collections\ArrayCollection; |
|
||||||
use Doctrine\Common\Collections\Collection; |
|
||||||
use Doctrine\ORM\Mapping as ORM; |
|
||||||
|
|
||||||
#[ORM\Table(name: 'agenda_event_invitation')] |
|
||||||
#[ORM\Entity()] |
|
||||||
#[ORM\InheritanceType('SINGLE_TABLE')] |
|
||||||
#[ORM\DiscriminatorColumn(name: 'type', type: 'string')] |
|
||||||
#[ORM\DiscriminatorMap([ |
|
||||||
'invitation' => 'Chamilo\CoreBundle\Entity\AgendaEventInvitation', |
|
||||||
'subscription' => 'Chamilo\CoreBundle\Entity\AgendaEventSubscription', |
|
||||||
])] |
|
||||||
class AgendaEventInvitation |
|
||||||
{ |
|
||||||
use TimestampableTypedEntity; |
|
||||||
|
|
||||||
#[ORM\Id] |
|
||||||
#[ORM\Column(type: 'integer')] |
|
||||||
#[ORM\GeneratedValue(strategy: 'AUTO')] |
|
||||||
protected ?int $id = null; |
|
||||||
|
|
||||||
#[ORM\OneToMany( |
|
||||||
mappedBy: 'invitation', |
|
||||||
targetEntity: AgendaEventInvitee::class, |
|
||||||
cascade: ['persist', 'remove'], |
|
||||||
orphanRemoval: true |
|
||||||
)] |
|
||||||
protected Collection $invitees; |
|
||||||
|
|
||||||
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'resourceNodes')] |
|
||||||
#[ORM\JoinColumn(name: 'creator_id', referencedColumnName: 'id', nullable: true, onDelete: 'CASCADE')] |
|
||||||
protected User $creator; |
|
||||||
|
|
||||||
public function __construct() |
|
||||||
{ |
|
||||||
$this->invitees = new ArrayCollection(); |
|
||||||
} |
|
||||||
|
|
||||||
public function getId(): ?int |
|
||||||
{ |
|
||||||
return $this->id; |
|
||||||
} |
|
||||||
|
|
||||||
public function getInvitees(): Collection |
|
||||||
{ |
|
||||||
return $this->invitees; |
|
||||||
} |
|
||||||
|
|
||||||
public function setInvitees(Collection $invitees): self |
|
||||||
{ |
|
||||||
$this->invitees = $invitees; |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
|
|
||||||
public function addInvitee(AgendaEventInvitee $invitee): self |
|
||||||
{ |
|
||||||
$invitee->setInvitation($this); |
|
||||||
$this->invitees->add($invitee); |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
|
|
||||||
public function removeInviteeUser(User $user): self |
|
||||||
{ |
|
||||||
/** @var AgendaEventInvitee $invitee */ |
|
||||||
$invitee = $this |
|
||||||
->invitees |
|
||||||
->filter(function (AgendaEventInvitee $invitee) use ($user) { |
|
||||||
return $invitee->getUser() === $user; |
|
||||||
}) |
|
||||||
->first() |
|
||||||
; |
|
||||||
|
|
||||||
if ($invitee) { |
|
||||||
$this->invitees->removeElement($invitee); |
|
||||||
$invitee->setInvitation(null); |
|
||||||
} |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
|
|
||||||
public function removeInvitees(): self |
|
||||||
{ |
|
||||||
$this->invitees = new ArrayCollection(); |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
|
|
||||||
public function getCreator(): User |
|
||||||
{ |
|
||||||
return $this->creator; |
|
||||||
} |
|
||||||
|
|
||||||
public function setCreator(User $creator): self |
|
||||||
{ |
|
||||||
$this->creator = $creator; |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
|
|
||||||
public function hasUserAsInvitee(User $user): bool |
|
||||||
{ |
|
||||||
return $this->invitees->exists( |
|
||||||
function (int $key, AgendaEventInvitee $invitee) use ($user) { |
|
||||||
return $invitee->getUser() === $user; |
|
||||||
} |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
public function removeInviteesNotInIdList(array $idList): self |
|
||||||
{ |
|
||||||
$toRemove = []; |
|
||||||
|
|
||||||
/** @var AgendaEventInvitee $invitee */ |
|
||||||
foreach ($this->invitees as $key => $invitee) { |
|
||||||
if (!\in_array($invitee->getUser()->getId(), $idList, true)) { |
|
||||||
$toRemove[] = $key; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
foreach ($toRemove as $key) { |
|
||||||
$this->invitees->remove($key); |
|
||||||
} |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,65 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
declare(strict_types=1); |
|
||||||
|
|
||||||
/* For licensing terms, see /license.txt */ |
|
||||||
|
|
||||||
namespace Chamilo\CoreBundle\Entity; |
|
||||||
|
|
||||||
use Chamilo\CoreBundle\Traits\TimestampableTypedEntity; |
|
||||||
use Doctrine\ORM\Mapping as ORM; |
|
||||||
|
|
||||||
#[ORM\Entity] |
|
||||||
#[ORM\Table(name: 'agenda_event_invitee')] |
|
||||||
#[ORM\InheritanceType('SINGLE_TABLE')] |
|
||||||
#[ORM\DiscriminatorColumn(name: 'type', type: 'string')] |
|
||||||
#[ORM\DiscriminatorMap([ |
|
||||||
'invitee' => AgendaEventInvitee::class, |
|
||||||
'subscriber' => AgendaEventSubscriber::class, |
|
||||||
])] |
|
||||||
class AgendaEventInvitee |
|
||||||
{ |
|
||||||
use TimestampableTypedEntity; |
|
||||||
|
|
||||||
#[ORM\Id] |
|
||||||
#[ORM\Column(type: 'integer')] |
|
||||||
#[ORM\GeneratedValue] |
|
||||||
private int $id; |
|
||||||
|
|
||||||
#[ORM\ManyToOne(targetEntity: AgendaEventInvitation::class, inversedBy: 'invitees')] |
|
||||||
#[ORM\JoinColumn(name: 'invitation_id', referencedColumnName: 'id', onDelete: 'CASCADE')] |
|
||||||
private ?AgendaEventInvitation $invitation; |
|
||||||
|
|
||||||
#[ORM\ManyToOne(targetEntity: User::class)] |
|
||||||
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', nullable: true, onDelete: 'SET NULL')] |
|
||||||
private ?User $user; |
|
||||||
|
|
||||||
public function getId(): int |
|
||||||
{ |
|
||||||
return $this->id; |
|
||||||
} |
|
||||||
|
|
||||||
public function getInvitation(): ?AgendaEventInvitation |
|
||||||
{ |
|
||||||
return $this->invitation; |
|
||||||
} |
|
||||||
|
|
||||||
public function setInvitation(?AgendaEventInvitation $invitation): self |
|
||||||
{ |
|
||||||
$this->invitation = $invitation; |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
|
|
||||||
public function getUser(): ?User |
|
||||||
{ |
|
||||||
return $this->user; |
|
||||||
} |
|
||||||
|
|
||||||
public function setUser(?User $user): self |
|
||||||
{ |
|
||||||
$this->user = $user; |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,12 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
declare(strict_types=1); |
|
||||||
|
|
||||||
/* For licensing terms, see /license.txt */ |
|
||||||
|
|
||||||
namespace Chamilo\CoreBundle\Entity; |
|
||||||
|
|
||||||
use Doctrine\ORM\Mapping as ORM; |
|
||||||
|
|
||||||
#[ORM\Entity] |
|
||||||
class AgendaEventSubscriber extends AgendaEventInvitee {} |
|
||||||
@ -1,32 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
declare(strict_types=1); |
|
||||||
|
|
||||||
/* For licensing terms, see /license.txt */ |
|
||||||
|
|
||||||
namespace Chamilo\CoreBundle\Entity; |
|
||||||
|
|
||||||
use Doctrine\ORM\Mapping as ORM; |
|
||||||
|
|
||||||
#[ORM\Entity] |
|
||||||
class AgendaEventSubscription extends AgendaEventInvitation |
|
||||||
{ |
|
||||||
public const SUBSCRIPTION_NO = 0; |
|
||||||
public const SUBSCRIPTION_ALL = 1; |
|
||||||
public const SUBSCRIPTION_CLASS = 2; |
|
||||||
|
|
||||||
#[ORM\Column(name: 'max_attendees', type: 'integer', nullable: false, options: ['default' => 0])] |
|
||||||
protected int $maxAttendees = 0; |
|
||||||
|
|
||||||
public function getMaxAttendees(): int |
|
||||||
{ |
|
||||||
return $this->maxAttendees; |
|
||||||
} |
|
||||||
|
|
||||||
public function setMaxAttendees(int $maxAttendees): self |
|
||||||
{ |
|
||||||
$this->maxAttendees = $maxAttendees; |
|
||||||
|
|
||||||
return $this; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -0,0 +1,34 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Migrations\Schema\V200; |
||||||
|
|
||||||
|
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo; |
||||||
|
use Doctrine\DBAL\Schema\Schema; |
||||||
|
|
||||||
|
class Version20230904173401 extends AbstractMigrationChamilo |
||||||
|
{ |
||||||
|
public function getDescription(): string |
||||||
|
{ |
||||||
|
return 'Calendar: Cleanup about invitations/subscriptions'; |
||||||
|
} |
||||||
|
|
||||||
|
public function up(Schema $schema): void |
||||||
|
{ |
||||||
|
if ($schema->hasTable('agenda_event_invitation')) { |
||||||
|
$this->addSql('ALTER TABLE personal_agenda DROP FOREIGN KEY FK_D8612460AF68C6B'); |
||||||
|
$this->addSql('DROP INDEX UNIQ_D8612460AF68C6B ON personal_agenda'); |
||||||
|
|
||||||
|
$this->addSql('ALTER TABLE personal_agenda DROP agenda_event_invitation_id, DROP collective, DROP subscription_visibility, DROP subscription_item_id'); |
||||||
|
|
||||||
|
$this->addSql('ALTER TABLE agenda_event_invitation DROP FOREIGN KEY FK_52A2D5E161220EA6'); |
||||||
|
$this->addSql('DROP TABLE agenda_event_invitation'); |
||||||
|
|
||||||
|
$this->addSql('ALTER TABLE agenda_event_invitee DROP FOREIGN KEY FK_4F5757FEA76ED395'); |
||||||
|
$this->addSql('DROP TABLE agenda_event_invitee'); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,40 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Repository; |
||||||
|
|
||||||
|
use Chamilo\CoreBundle\Entity\ColorTheme; |
||||||
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; |
||||||
|
use Doctrine\Persistence\ManagerRegistry; |
||||||
|
|
||||||
|
class ColorThemeRepository extends ServiceEntityRepository |
||||||
|
{ |
||||||
|
public function __construct(ManagerRegistry $registry) |
||||||
|
{ |
||||||
|
parent::__construct($registry, ColorTheme::class); |
||||||
|
} |
||||||
|
|
||||||
|
public function deactivateAll(): void |
||||||
|
{ |
||||||
|
$qb = $this->getEntityManager()->createQueryBuilder(); |
||||||
|
$qb |
||||||
|
->update(ColorTheme::class, 'ct') |
||||||
|
->set('ct.active', ':inactive') |
||||||
|
->where( |
||||||
|
$qb->expr()->eq('ct.active', ':active') |
||||||
|
) |
||||||
|
->setParameters(['active' => true, 'inactive' => false]) |
||||||
|
->getQuery() |
||||||
|
->execute() |
||||||
|
; |
||||||
|
} |
||||||
|
|
||||||
|
public function getActiveOne(): ?ColorTheme |
||||||
|
{ |
||||||
|
return $this->findOneBy( |
||||||
|
['active' => true], |
||||||
|
['createdAt' => 'DESC'] |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
@ -1,18 +1,6 @@ |
|||||||
{% extends "@ChamiloCore/Layout/base-layout.html.twig" %} |
{% extends "@ChamiloCore/Layout/no_layout.html.twig" %} |
||||||
{% block chamilo_wrap %} |
|
||||||
{%- autoescape %} |
|
||||||
{% if not from_vue %} |
|
||||||
<div id="app" data-flashes="{{ app.flashes()|json_encode }}"></div> |
|
||||||
{% endif %} |
|
||||||
{% endautoescape -%} |
|
||||||
{% autoescape false %} |
|
||||||
<section id="sectionMainContent" class="section-content"> |
|
||||||
{%- block content %} |
|
||||||
{% include '@ChamiloCore/Layout/vue_setup.html.twig' %} |
|
||||||
{% endblock -%} |
|
||||||
</section> |
|
||||||
{% endautoescape %} |
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block chamilo_footer %} |
{%- block content %} |
||||||
|
{% include '@ChamiloCore/Layout/vue_setup.html.twig' %} |
||||||
|
{# {{ encore_entry_script_tags('vue') }}#} |
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|||||||
Loading…
Reference in new issue