mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-12 13:24:25 +00:00
create event by selecting a calendar range
This commit is contained in:
parent
38c7c8de60
commit
a025883a5d
@ -22,18 +22,19 @@ use Symfony\Component\HttpFoundation\Response;
|
|||||||
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
||||||
use Symfony\Component\Routing\Annotation\Route;
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
use Symfony\Component\Serializer\SerializerInterface;
|
use Symfony\Component\Serializer\SerializerInterface;
|
||||||
|
use function count;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains method to get events (Calendar) from remote calendar.
|
* Contains method to get events (Calendar) from remote calendar.
|
||||||
*/
|
*/
|
||||||
class RemoteCalendarProxyController
|
class RemoteCalendarProxyController
|
||||||
{
|
{
|
||||||
|
private PaginatorFactory $paginatorFactory;
|
||||||
|
|
||||||
private RemoteCalendarConnectorInterface $remoteCalendarConnector;
|
private RemoteCalendarConnectorInterface $remoteCalendarConnector;
|
||||||
|
|
||||||
private SerializerInterface $serializer;
|
private SerializerInterface $serializer;
|
||||||
|
|
||||||
private PaginatorFactory $paginatorFactory;
|
|
||||||
|
|
||||||
public function __construct(PaginatorFactory $paginatorFactory, RemoteCalendarConnectorInterface $remoteCalendarConnector, SerializerInterface $serializer)
|
public function __construct(PaginatorFactory $paginatorFactory, RemoteCalendarConnectorInterface $remoteCalendarConnector, SerializerInterface $serializer)
|
||||||
{
|
{
|
||||||
$this->paginatorFactory = $paginatorFactory;
|
$this->paginatorFactory = $paginatorFactory;
|
||||||
@ -51,9 +52,9 @@ class RemoteCalendarProxyController
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (false === $dateFrom = DateTimeImmutable::createFromFormat(
|
if (false === $dateFrom = DateTimeImmutable::createFromFormat(
|
||||||
DateTimeImmutable::ATOM,
|
DateTimeImmutable::ATOM,
|
||||||
$request->query->get('dateFrom')
|
$request->query->get('dateFrom')
|
||||||
)) {
|
)) {
|
||||||
throw new BadRequestHttpException('dateFrom not parsable');
|
throw new BadRequestHttpException('dateFrom not parsable');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,14 +63,15 @@ class RemoteCalendarProxyController
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (false === $dateTo = DateTimeImmutable::createFromFormat(
|
if (false === $dateTo = DateTimeImmutable::createFromFormat(
|
||||||
DateTimeImmutable::ATOM,
|
DateTimeImmutable::ATOM,
|
||||||
$request->query->get('dateTo')
|
$request->query->get('dateTo')
|
||||||
)) {
|
)) {
|
||||||
throw new BadRequestHttpException('dateTo not parsable');
|
throw new BadRequestHttpException('dateTo not parsable');
|
||||||
}
|
}
|
||||||
|
|
||||||
$events = $this->remoteCalendarConnector->listEventsForUser($user, $dateFrom, $dateTo);
|
$events = $this->remoteCalendarConnector->listEventsForUser($user, $dateFrom, $dateTo);
|
||||||
$paginator = $this->paginatorFactory->create(count($events));
|
$paginator = $this->paginatorFactory->create(count($events));
|
||||||
|
|
||||||
if (count($events) > 0) {
|
if (count($events) > 0) {
|
||||||
$paginator->setItemsPerPage($paginator->getTotalItems());
|
$paginator->setItemsPerPage($paginator->getTotalItems());
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@ class Calendar implements TrackCreationInterface, TrackUpdateInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="CalendarRange", inversedBy="calendars")
|
* @ORM\ManyToOne(targetEntity="CalendarRange", inversedBy="calendars")
|
||||||
|
* @Serializer\Groups({"calendar:read", "read"})
|
||||||
*/
|
*/
|
||||||
private ?CalendarRange $calendarRange = null;
|
private ?CalendarRange $calendarRange = null;
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ class CalendarRange implements TrackCreationInterface, TrackUpdateInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="datetimetz_immutable")
|
* @ORM\Column(type="datetimetz_immutable")
|
||||||
* @groups({"read", "write"})
|
* @groups({"read", "write", "calendar:read"})
|
||||||
*/
|
*/
|
||||||
private ?DateTimeImmutable $endDate = null;
|
private ?DateTimeImmutable $endDate = null;
|
||||||
|
|
||||||
@ -56,13 +56,13 @@ class CalendarRange implements TrackCreationInterface, TrackUpdateInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="datetimetz_immutable")
|
* @ORM\Column(type="datetimetz_immutable")
|
||||||
* @groups({"read", "write"})
|
* @groups({"read", "write", "calendar:read"})
|
||||||
*/
|
*/
|
||||||
private ?DateTimeImmutable $startDate = null;
|
private ?DateTimeImmutable $startDate = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
|
||||||
* @groups({"read", "write"})
|
* @groups({"read", "write", "calendar:read"})
|
||||||
*/
|
*/
|
||||||
private ?User $user = null;
|
private ?User $user = null;
|
||||||
|
|
||||||
|
@ -91,15 +91,19 @@ class CalendarType extends AbstractType
|
|||||||
->addModelTransformer(new CallbackTransformer(
|
->addModelTransformer(new CallbackTransformer(
|
||||||
static function (?DateTimeImmutable $dateTimeImmutable): string {
|
static function (?DateTimeImmutable $dateTimeImmutable): string {
|
||||||
if (null !== $dateTimeImmutable) {
|
if (null !== $dateTimeImmutable) {
|
||||||
$res = date_format($dateTimeImmutable, 'Y-m-d H:i:s');
|
$res = date_format($dateTimeImmutable, DateTimeImmutable::ATOM);
|
||||||
} else {
|
} else {
|
||||||
$res = '';
|
$res = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
},
|
},
|
||||||
static function (?string $dateAsString): DateTimeImmutable {
|
static function (?string $dateAsString): ?DateTimeImmutable {
|
||||||
return new DateTimeImmutable($dateAsString);
|
if ('' === $dateAsString) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DateTimeImmutable::createFromFormat(DateTimeImmutable::ATOM, $dateAsString);
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -108,15 +112,19 @@ class CalendarType extends AbstractType
|
|||||||
->addModelTransformer(new CallbackTransformer(
|
->addModelTransformer(new CallbackTransformer(
|
||||||
static function (?DateTimeImmutable $dateTimeImmutable): string {
|
static function (?DateTimeImmutable $dateTimeImmutable): string {
|
||||||
if (null !== $dateTimeImmutable) {
|
if (null !== $dateTimeImmutable) {
|
||||||
$res = date_format($dateTimeImmutable, 'Y-m-d H:i:s');
|
$res = date_format($dateTimeImmutable, DateTimeImmutable::ATOM);
|
||||||
} else {
|
} else {
|
||||||
$res = '';
|
$res = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
},
|
},
|
||||||
static function (?string $dateAsString): DateTimeImmutable {
|
static function (?string $dateAsString): ?DateTimeImmutable {
|
||||||
return new DateTimeImmutable($dateAsString);
|
if ('' === $dateAsString) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DateTimeImmutable::createFromFormat(DateTimeImmutable::ATOM, $dateAsString);
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -152,6 +152,20 @@ export default {
|
|||||||
this.$store.dispatch('updateEvent', payload);
|
this.$store.dispatch('updateEvent', payload);
|
||||||
},
|
},
|
||||||
onEventClick(payload) {
|
onEventClick(payload) {
|
||||||
|
console.log('onEventClick', payload);
|
||||||
|
|
||||||
|
console.log('extendedProps', payload.event.extendedProps);
|
||||||
|
console.log('isRange', payload.event.extendedProps.is === 'range');
|
||||||
|
|
||||||
|
if (payload.event.extendedProps.is !== 'range') {
|
||||||
|
// do nothing when clicking on remote
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$store.dispatch('associateCalendarToRange', {range: payload.event});
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
this.previousSelectedEvent = this.selectedEvent;
|
this.previousSelectedEvent = this.selectedEvent;
|
||||||
this.previousSelectedEventColor = payload.event.extendedProps.sourceColor;
|
this.previousSelectedEventColor = payload.event.extendedProps.sourceColor;
|
||||||
this.selectedEvent = payload.event;
|
this.selectedEvent = payload.event;
|
||||||
@ -160,6 +174,7 @@ export default {
|
|||||||
payload.event.setProp('borderColor', '#3788d8');
|
payload.event.setProp('borderColor', '#3788d8');
|
||||||
payload.event.setProp('title', 'Choisir cette plage');
|
payload.event.setProp('title', 'Choisir cette plage');
|
||||||
payload.event.setProp('textColor', '#ffffff');
|
payload.event.setProp('textColor', '#ffffff');
|
||||||
|
*/
|
||||||
},
|
},
|
||||||
onEventMouseEnter(payload) {
|
onEventMouseEnter(payload) {
|
||||||
payload.event.setProp('borderColor', '#444444');
|
payload.event.setProp('borderColor', '#444444');
|
||||||
|
@ -8,6 +8,7 @@ import {
|
|||||||
fetchCalendarRangeForUser,
|
fetchCalendarRangeForUser,
|
||||||
fetchCalendarRemoteForUser,
|
fetchCalendarRemoteForUser,
|
||||||
} from './../api';
|
} from './../api';
|
||||||
|
import {datetimeToISO} from 'ChillMainAssets/chill/js/date';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
setCurrentDatesView({ commit, dispatch }, {start, end}) {
|
setCurrentDatesView({ commit, dispatch }, {start, end}) {
|
||||||
@ -106,19 +107,20 @@ export default {
|
|||||||
//mainUserInput.value = payload.users.logged.id;
|
//mainUserInput.value = payload.users.logged.id;
|
||||||
commit('setEvents', payload);
|
commit('setEvents', payload);
|
||||||
},
|
},
|
||||||
updateEvent({ commit, dispatch }, payload) {
|
associateCalendarToRange({ commit, dispatch }, {range}) {
|
||||||
console.log('### action updateEvent', payload);
|
console.log('### action associateCAlendarToRange', range);
|
||||||
let startDateInput = document.getElementById("chill_activitybundle_activity_startDate");
|
let startDateInput = document.getElementById("chill_activitybundle_activity_startDate");
|
||||||
startDateInput.value = payload.event.start.toISOString();
|
startDateInput.value = datetimeToISO(range.start);
|
||||||
let endDateInput = document.getElementById("chill_activitybundle_activity_endDate");
|
let endDateInput = document.getElementById("chill_activitybundle_activity_endDate");
|
||||||
endDateInput.value = payload.event.end.toISOString();
|
endDateInput.value = datetimeToISO(range.end);
|
||||||
let calendarRangeInput = document.getElementById("chill_activitybundle_activity_calendarRange");
|
let calendarRangeInput = document.getElementById("chill_activitybundle_activity_calendarRange");
|
||||||
calendarRangeInput.value = Number(payload.event.extendedProps.calendarRangeId);
|
calendarRangeInput.value = Number(range.extendedProps.calendarRangeId);
|
||||||
|
|
||||||
//dispatch('setMainUser', payload.event.source);
|
//dispatch('setMainUser', payload.event.source);
|
||||||
//let mainUserInput = document.getElementById("chill_activitybundle_activity_mainUser");
|
//let mainUserInput = document.getElementById("chill_activitybundle_activity_mainUser");
|
||||||
//mainUserInput.value = Number(payload.event.source.id);
|
//mainUserInput.value = Number(payload.event.source.id);
|
||||||
commit('setEvents', payload);
|
commit('associateCalendarToRange', {range});
|
||||||
|
return Promise.resolve();
|
||||||
},
|
},
|
||||||
setMainUser({ commit }, mainUser) {
|
setMainUser({ commit }, mainUser) {
|
||||||
console.log('rawMainuser', toRaw(mainUser));
|
console.log('rawMainuser', toRaw(mainUser));
|
||||||
|
@ -26,11 +26,33 @@ export default {
|
|||||||
* Compute the event sources to show on the FullCalendar
|
* Compute the event sources to show on the FullCalendar
|
||||||
*
|
*
|
||||||
* @param state
|
* @param state
|
||||||
* @returns {*[]}
|
* @param getters
|
||||||
|
* @returns {[]}
|
||||||
*/
|
*/
|
||||||
getEventSources(state) {
|
getEventSources(state, getters) {
|
||||||
let sources = [];
|
let sources = [];
|
||||||
|
|
||||||
|
// current calendar
|
||||||
|
if (state.activity.startDate !== null && state.activity.endDate !== null) {
|
||||||
|
const s = {
|
||||||
|
id: 'current',
|
||||||
|
backgroundColor: '#3788d8',
|
||||||
|
borderColor: '#3788d8',
|
||||||
|
textColor: '#ffffff',
|
||||||
|
events: [
|
||||||
|
{
|
||||||
|
title: "Rendez-vous",
|
||||||
|
start: state.activity.startDate,
|
||||||
|
end: state.activity.endDate,
|
||||||
|
allDay: false,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
editable: state.activity.calendarRange === null,
|
||||||
|
};
|
||||||
|
|
||||||
|
sources.push(s);
|
||||||
|
}
|
||||||
|
|
||||||
for (const [userId, kinds] of state.currentView.users.entries()) {
|
for (const [userId, kinds] of state.currentView.users.entries()) {
|
||||||
if (!state.usersData.has(userId)) {
|
if (!state.usersData.has(userId)) {
|
||||||
console.log('try to get events on a user which not exists', userId);
|
console.log('try to get events on a user which not exists', userId);
|
||||||
@ -40,9 +62,11 @@ export default {
|
|||||||
const userData = state.usersData.get(userId);
|
const userData = state.usersData.get(userId);
|
||||||
|
|
||||||
if (kinds.ranges && userData.calendarRanges.length > 0) {
|
if (kinds.ranges && userData.calendarRanges.length > 0) {
|
||||||
|
console.log('first range', userData.calendarRanges[0]);
|
||||||
|
console.log('state activity', state.activity);
|
||||||
const s = {
|
const s = {
|
||||||
id: `ranges_${userId}`,
|
id: `ranges_${userId}`,
|
||||||
events: userData.calendarRanges,
|
events: userData.calendarRanges.filter(r => state.activity.calendarRange === null || r.calendarRangeId !== state.activity.calendarRange.calendarRangeId),
|
||||||
color: userData.mainColor,
|
color: userData.mainColor,
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
textColor: 'black',
|
textColor: 'black',
|
||||||
|
@ -27,6 +27,24 @@ export default {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
associateCalendarToRange(state, {range}) {
|
||||||
|
console.log('userId', range.extendedProps.userId);
|
||||||
|
|
||||||
|
const r = state.usersData.get(range.extendedProps.userId).calendarRanges
|
||||||
|
.find(r => r.calendarRangeId === range.extendedProps.calendarRangeId);
|
||||||
|
|
||||||
|
if (typeof r === 'undefined') {
|
||||||
|
throw Error('Could not find managed calendar range');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('range found', r);
|
||||||
|
|
||||||
|
state.activity.startDate = range.start;
|
||||||
|
state.activity.endDate = range.end;
|
||||||
|
state.activity.calendarRange = r;
|
||||||
|
|
||||||
|
console.log('activity', state.activity);
|
||||||
|
},
|
||||||
|
|
||||||
// ConcernedGroups
|
// ConcernedGroups
|
||||||
addPersonsInvolved(state, payload) {
|
addPersonsInvolved(state, payload) {
|
||||||
|
@ -43,6 +43,8 @@ const calendarRangeToFullCalendarEvent = (entity) => {
|
|||||||
end: entity.endDate.datetime8601,
|
end: entity.endDate.datetime8601,
|
||||||
allDay: false,
|
allDay: false,
|
||||||
userId: entity.user.id,
|
userId: entity.user.id,
|
||||||
|
calendarRangeId: entity.id,
|
||||||
|
is: 'range',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +55,7 @@ const remoteToFullCalendarEvent = (entity) => {
|
|||||||
start: entity.startDate.datetime8601,
|
start: entity.startDate.datetime8601,
|
||||||
end: entity.endDate.datetime8601,
|
end: entity.endDate.datetime8601,
|
||||||
allDay: false,
|
allDay: false,
|
||||||
|
is: 'remote',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,8 +107,8 @@ final class CalendarTypeTest extends TypeTestCase
|
|||||||
$this->assertEquals(8, $calendar->getCalendarRange()->getId());
|
$this->assertEquals(8, $calendar->getCalendarRange()->getId());
|
||||||
$this->assertEquals(9, $calendar->getLocation()->getId());
|
$this->assertEquals(9, $calendar->getLocation()->getId());
|
||||||
$this->assertEquals(true, $calendar->getSendSMS());
|
$this->assertEquals(true, $calendar->getSendSMS());
|
||||||
$this->assertContains(2, $calendar->getUsers()->map(function (User $u) { return $u->getId(); }));
|
$this->assertContains(2, $calendar->getUsers()->map(static function (User $u) { return $u->getId(); }));
|
||||||
$this->assertContains(3, $calendar->getUsers()->map(function (User $u) { return $u->getId(); }));
|
$this->assertContains(3, $calendar->getUsers()->map(static function (User $u) { return $u->getId(); }));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getExtensions()
|
protected function getExtensions()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user