diff --git a/plugin/zoom/admin.php b/plugin/zoom/admin.php index 0543cdca5a..8618ac5d21 100644 --- a/plugin/zoom/admin.php +++ b/plugin/zoom/admin.php @@ -2,7 +2,7 @@ /* For license terms, see /license.txt */ -use Chamilo\PluginBundle\Zoom\JWTClient; +use Chamilo\PluginBundle\Zoom\API\JWTClient; $course_plugin = 'zoom'; // needed in order to load the plugin lang variables $cidReset = true; diff --git a/plugin/zoom/lang/english.php b/plugin/zoom/lang/english.php index 1f08a1d7bd..19cafe9a83 100755 --- a/plugin/zoom/lang/english.php +++ b/plugin/zoom/lang/english.php @@ -36,6 +36,7 @@ $strings['CreatedAt'] = "Created at"; $strings['DeleteMeeting'] = "Delete meeting"; $strings['Details'] = "Details"; $strings['Duration'] = "Duration"; +$strings['DurationInMinutes'] = "Duration (in minutes)"; $strings['EndDate'] = "End Date"; $strings['Instant'] = "Instant"; $strings['Join'] = "Join"; diff --git a/plugin/zoom/lang/french.php b/plugin/zoom/lang/french.php index 876554a952..b4d925173c 100755 --- a/plugin/zoom/lang/french.php +++ b/plugin/zoom/lang/french.php @@ -34,6 +34,7 @@ $strings['CreatedAt'] = "Créé à"; $strings['DeleteMeeting'] = "Effacer la conférence"; $strings['Details'] = "Détail"; $strings['Duration'] = "Durée"; +$strings['DurationInMinutes'] = "Durée (en minutes)"; $strings['EndDate'] = "Date de fin"; $strings['Instant'] = "Instantané"; $strings['Join'] = "Rejoindre"; diff --git a/plugin/zoom/lib/API/BaseMeetingTrait.php b/plugin/zoom/lib/API/BaseMeetingTrait.php new file mode 100644 index 0000000000..8bce307bf4 --- /dev/null +++ b/plugin/zoom/lib/API/BaseMeetingTrait.php @@ -0,0 +1,25 @@ + $value) { if (property_exists($destination, $name)) { diff --git a/plugin/zoom/API/Meeting.php b/plugin/zoom/lib/API/Meeting.php similarity index 62% rename from plugin/zoom/API/Meeting.php rename to plugin/zoom/lib/API/Meeting.php index 66f5d0ea8c..eadcd0d297 100644 --- a/plugin/zoom/API/Meeting.php +++ b/plugin/zoom/lib/API/Meeting.php @@ -1,38 +1,23 @@ value */ public $tracking_fields; @@ -52,11 +37,16 @@ class Meeting } /** + * Creates a Meeting instance from a topic. + * * @param string $topic * @param int $type + * + * @throws Exception + * * @return static */ - public static function fromTopicAndType($topic, $type = self::TYPE_SCHEDULED) + protected static function fromTopicAndType($topic, $type = self::TYPE_SCHEDULED) { $instance = new static(); $instance->topic = $topic; @@ -64,4 +54,12 @@ class Meeting return $instance; } + + /** + * @inheritDoc + */ + protected function itemClass($propertyName) + { + throw new Exception("no such array property $propertyName"); + } } diff --git a/plugin/zoom/API/MeetingInfo.php b/plugin/zoom/lib/API/MeetingInfo.php similarity index 94% rename from plugin/zoom/API/MeetingInfo.php rename to plugin/zoom/lib/API/MeetingInfo.php index 3f6c5b7490..58e78bd3f7 100644 --- a/plugin/zoom/API/MeetingInfo.php +++ b/plugin/zoom/lib/API/MeetingInfo.php @@ -1,7 +1,7 @@ decodeAndRemoveTag(); + $instance->initializeDisplayableProperties(); + return $instance; + } + + /** + * Creates a CourseMeeting instance from a topic. + * + * @param int $courseId + * @param int $sessionId + * @param string $topic + * @param int $type + * + * @throws Exception + * + * @return static + */ + public static function fromCourseSessionTopicAndType($courseId, $sessionId, $topic, $type) + { + $instance = parent::fromTopicAndType($topic, $type); + $instance->setCourseAndSessionId($courseId, $sessionId); + $instance->initializeDisplayableProperties(); + return $instance; + } +} diff --git a/plugin/zoom/lib/CourseMeetingInfoGet.php b/plugin/zoom/lib/CourseMeetingInfoGet.php new file mode 100644 index 0000000000..c7b2e7a25a --- /dev/null +++ b/plugin/zoom/lib/CourseMeetingInfoGet.php @@ -0,0 +1,44 @@ +decodeAndRemoveTag(); + $instance->initializeDisplayableProperties(); + return $instance; + } + + /** + * CourseMeetingListItem constructor. + * + * @param API\MeetingInfoGet $meeting + * + * @throws Exception + * + * @return static + */ + public static function fromMeetingInfoGet($meeting) + { + $instance = new static(); + self::recursivelyCopyObjectProperties($meeting, $instance); + $instance->decodeAndRemoveTag(); + $instance->loadCourse(); + $instance->loadSession(); + $instance->initializeDisplayableProperties(); + + return $instance; + } +} diff --git a/plugin/zoom/lib/CourseMeetingList.php b/plugin/zoom/lib/CourseMeetingList.php new file mode 100644 index 0000000000..9451fd92b2 --- /dev/null +++ b/plugin/zoom/lib/CourseMeetingList.php @@ -0,0 +1,18 @@ +decodeAndRemoveTag(); + $instance->initializeDisplayableProperties(); + return $instance; + } + + /** + * CourseMeetingListItem constructor. + * + * @param API\MeetingListItem $meetingListItem + * + * @throws Exception + * + * @return static + */ + public static function fromMeetingListItem($meetingListItem) + { + $instance = new static(); + self::recursivelyCopyObjectProperties($meetingListItem, $instance); + $instance->decodeAndRemoveTag(); + $instance->initializeDisplayableProperties(); + + return $instance; + } +} diff --git a/plugin/zoom/lib/CourseMeetingTrait.php b/plugin/zoom/lib/CourseMeetingTrait.php new file mode 100644 index 0000000000..641ff33bb2 --- /dev/null +++ b/plugin/zoom/lib/CourseMeetingTrait.php @@ -0,0 +1,99 @@ +course = api_get_course_info_by_id($this->courseId); // TODO cache + } + + public function loadSession() + { + $this->session = api_get_session_info($this->sessionId); // TODO cache + } + + public function setCourseAndSessionId($courseId, $sessionId) + { + $this->courseId = $courseId; + $this->sessionId = $sessionId; + } + + public function tagAgenda() + { + $this->agenda = $this->getUntaggedAgenda().$this->getTag(); + } + + public function untagAgenda() + { + $this->agenda = $this->getUntaggedAgenda(); + } + + /** + * @param int $courseId + * @param int $sessionId + * + * @return bool whether both values match this CourseMeeting + */ + public function matches($courseId, $sessionId) + { + return $courseId == $this->courseId && $sessionId == $this->sessionId; + } + + protected function decodeAndRemoveTag() + { + $this->isTaggedWithCourseId = preg_match(self::getTagPattern(), $this->agenda, $matches); + if ($this->isTaggedWithCourseId) { + $this->setCourseAndSessionId($matches['courseId'], $matches['sessionId']); + $this->untagAgenda(); + } else { + $this->setCourseAndSessionId(0, 0); + } + $this->course = []; + $this->session = []; + } + + protected function getUntaggedAgenda() + { + return str_replace($this->getTag(), '', $this->agenda); + } + + /** + * @return string a tag to append to a meeting agenda so to link it to a (course, session) tuple + */ + private function getTag() + { + return "\n(course $this->courseId, session $this->sessionId)"; + } + + private static function getTagPattern() + { + return '/course (?P\d+), session (?P\d+)/m'; + } +} diff --git a/plugin/zoom/lib/DisplayableMeetingTrait.php b/plugin/zoom/lib/DisplayableMeetingTrait.php new file mode 100644 index 0000000000..778b9d7613 --- /dev/null +++ b/plugin/zoom/lib/DisplayableMeetingTrait.php @@ -0,0 +1,65 @@ +typeName = [ + API\Meeting::TYPE_INSTANT => get_lang('Instant'), + API\Meeting::TYPE_SCHEDULED => get_lang('Scheduled'), + API\Meeting::TYPE_RECURRING_WITH_NO_FIXED_TIME => get_lang('RecurringWithNoFixedTime'), + API\Meeting::TYPE_RECURRING_WITH_FIXED_TIME => get_lang('RecurringWithFixedTime'), + ][$this->type]; + $this->startDateTime = null; + $this->formattedStartTime = ''; + $this->durationInterval = null; + $this->formattedDuration = ''; + if (!empty($this->start_time)) { + $this->startDateTime = new DateTime($this->start_time); + $this->startDateTime->setTimezone(new DateTimeZone(date_default_timezone_get())); + $this->formattedStartTime = $this->startDateTime->format(get_lang('Y-m-d H:i')); + } + if (!empty($this->duration)) { + $now = new DateTime(); + $later = new DateTime(); + $later->add(new DateInterval('PT' . $this->duration . 'M')); + $this->durationInterval = $later->diff($now); + $this->formattedDuration = $this->durationInterval->format(get_lang('%Hh%I')); + } + if (property_exists($this, 'id')) { + $this->detailURL = 'meeting.php?meetingId=' . $this->id; + } + } +} diff --git a/plugin/zoom/lib/zoom_plugin.class.php b/plugin/zoom/lib/zoom_plugin.class.php index 950dbe5279..920e368861 100755 --- a/plugin/zoom/lib/zoom_plugin.class.php +++ b/plugin/zoom/lib/zoom_plugin.class.php @@ -2,17 +2,15 @@ /* For licensing terms, see /license.txt */ -use Chamilo\PluginBundle\Zoom\JWTClient; -use Chamilo\PluginBundle\Zoom\Meeting; -use Chamilo\PluginBundle\Zoom\MeetingInfoGet; -use Chamilo\PluginBundle\Zoom\MeetingListItem; -use Chamilo\PluginBundle\Zoom\ParticipantListItem; -use Chamilo\PluginBundle\Zoom\RecordingMeeting; +use Chamilo\PluginBundle\Zoom\API\JWTClient; +use Chamilo\PluginBundle\Zoom\API\ParticipantListItem; +use Chamilo\PluginBundle\Zoom\API\RecordingMeeting; +use Chamilo\PluginBundle\Zoom\CourseMeeting; +use Chamilo\PluginBundle\Zoom\CourseMeetingInfoGet; +use Chamilo\PluginBundle\Zoom\CourseMeetingListItem; class ZoomPlugin extends Plugin { - const TABLE_NAME = 'plugin_zoom_meeting'; - public $isCoursePlugin = true; protected function __construct() @@ -67,7 +65,7 @@ class ZoomPlugin extends Plugin * * @throws Exception on API error * - * @return MeetingListItem[] matching meetings with extra_data + * @return CourseMeetingListItem[] matching meetings */ public function getPeriodMeetings($type, $startDate, $endDate) { @@ -76,14 +74,21 @@ class ZoomPlugin extends Plugin if (property_exists($meeting, 'start_time')) { $startTime = new DateTime($meeting->start_time); if ($startDate <= $startTime && $startTime <= $endDate) { - $matchingMeetings[] = $meeting; + $matchingMeeting = CourseMeetingListItem::fromMeetingListItem($meeting); + $matchingMeeting->loadCourse(); + $matchingMeeting->loadSession(); + $matchingMeetings[] = $matchingMeeting; } } } - return $this->computeMeetingExtraData($matchingMeetings); + return $matchingMeetings; } + /** + * @return bool whether the logged-in user can manage conferences in this context, that is either + * the current course or session coach, the platform admin or the current course admin + */ public function userIsConferenceManager() { return api_is_coach() @@ -92,17 +97,17 @@ class ZoomPlugin extends Plugin } /** - * Retrieves a meeting properties and extra_data. + * Retrieves a meeting properties. * * @param int $meetingId * * @throws Exception * - * @return Meeting + * @return CourseMeetingInfoGet */ public function getMeeting($meetingId) { - return $this->computeMeetingExtraData([$this->jwtClient()->getMeeting($meetingId)])[0]; + return CourseMeetingInfoGet::fromMeetingInfoGet($this->jwtClient()->getMeeting($meetingId)); } /** @@ -110,11 +115,11 @@ class ZoomPlugin extends Plugin * * @throws Exception on API error * - * @return Meeting[] matching meetings + * @return CourseMeetingListItem[] matching meetings */ public function getLiveMeetings() { - return $this->computeMeetingExtraData($this->getMeetings(JWTClient::MEETING_LIST_TYPE_LIVE)); + return $this->getMeetings(JWTClient::MEETING_LIST_TYPE_LIVE); } /** @@ -122,11 +127,11 @@ class ZoomPlugin extends Plugin * * @throws Exception on API error * - * @return Meeting[] matching meetings + * @return CourseMeetingListItem[] matching meetings */ public function getScheduledMeetings() { - return $this->computeMeetingExtraData($this->getMeetings(JWTClient::MEETING_LIST_TYPE_SCHEDULED)); + return $this->getMeetings(JWTClient::MEETING_LIST_TYPE_SCHEDULED); } /** @@ -134,11 +139,11 @@ class ZoomPlugin extends Plugin * * @throws Exception on API error * - * @return Meeting[] matching meetings + * @return CourseMeetingListItem[] matching meetings */ public function getUpcomingMeetings() { - return $this->computeMeetingExtraData($this->getMeetings(JWTClient::MEETING_LIST_TYPE_UPCOMING)); + return $this->getMeetings(JWTClient::MEETING_LIST_TYPE_UPCOMING); } /** @@ -146,7 +151,7 @@ class ZoomPlugin extends Plugin * * @throws Exception describing the error (message and code) * - * @return MeetingInfoGet meeting + * @return CourseMeetingInfoGet meeting */ public function createInstantMeeting() { @@ -158,7 +163,12 @@ class ZoomPlugin extends Plugin } $courseInfo = api_get_course_info(); $topic .= $courseInfo['title'].', '.date('yy-m-d H:i'); - $meeting = Meeting::fromTopicAndType($topic, Meeting::TYPE_INSTANT); + $meeting = CourseMeeting::fromCourseSessionTopicAndType( + api_get_course_int_id(), + api_get_session_id(), + $topic, + CourseMeeting::TYPE_INSTANT + ); return $this->createMeeting($meeting); } @@ -174,11 +184,16 @@ class ZoomPlugin extends Plugin * * @throws Exception describing the error (message and code) * - * @return MeetingInfoGet meeting + * @return CourseMeetingInfoGet meeting */ public function createScheduledMeeting($startTime, $duration, $topic, $agenda = '', $password = '') { - $meeting = Meeting::fromTopicAndType($topic, Meeting::TYPE_SCHEDULED); + $meeting = CourseMeeting::fromCourseSessionTopicAndType( + api_get_course_int_id(), + api_get_session_id(), + $topic, + CourseMeeting::TYPE_SCHEDULED + ); $meeting->duration = $duration; $meeting->start_time = $startTime->format(DateTimeInterface::ISO8601); $meeting->agenda = $agenda; @@ -190,14 +205,14 @@ class ZoomPlugin extends Plugin /** * Updates a meeting. * - * @param int $meetingId - * @param Meeting $meeting with updated properties + * @param int $meetingId + * @param CourseMeetingInfoGet $meeting with updated properties * * @throws Exception on API error */ public function updateMeeting($meetingId, $meeting) { - $meeting->agenda .= $this->agendaTag(); + $meeting->tagAgenda(); $this->jwtClient()->updateMeeting($meetingId, $meeting); } @@ -291,27 +306,6 @@ class ZoomPlugin extends Plugin return $jwtClient; } - /** - * @return string a tag to append to a meeting agenda so to link it to a (course, session) tuple - */ - private function agendaTag() - { - $courseId = api_get_course_int_id(); - $sessionId = api_get_session_id(); - - return "\n(course $courseId, session $sessionId)"; - } - - private function courseIdAndSessionIdFromAgenda($agenda) - { - return preg_match('/course (?P\d+), session (?P\d+)/m', $agenda, $matches) - ? $matches - : [ - 'courseId' => 0, - 'sessionId' => 0, - ]; - } - /** * Retrieves all meetings of a specific type and linked to current course and session. * @@ -319,76 +313,36 @@ class ZoomPlugin extends Plugin * * @throws Exception on API error * - * @return MeetingListItem[] matching meetings + * @return CourseMeetingListItem[] matching meetings */ private function getMeetings($type) { $matchingMeetings = []; - $tag = $this->agendaTag(); + $courseId = api_get_course_int_id(); + $sessionId = api_get_session_id(); foreach ($this->jwtClient()->getMeetings($type) as $meeting) { - if (property_exists($meeting, 'agenda') && substr($meeting->agenda, -strlen($tag)) === $tag) { - $matchingMeetings[] = $meeting; + $candidateMeeting = CourseMeetingListItem::fromMeetingListItem($meeting); + if ($candidateMeeting->matches($courseId, $sessionId)) { + $matchingMeetings[] = $candidateMeeting; } } return $matchingMeetings; } - /** - * Computes and append extra data for each listed meeting. - * - * @param MeetingListItem[] $meetings list of retrieved meetings - * - * @throws Exception on API error - * - * @return Meeting[]|MeetingListItem[] same meetings with extra_data added - */ - private function computeMeetingExtraData($meetings) - { - $completeMeetings = []; - $tag = $this->agendaTag(); - $typeNames = [ - Meeting::TYPE_INSTANT => get_lang('Instant'), - Meeting::TYPE_SCHEDULED => get_lang('Scheduled'), - Meeting::TYPE_RECURRING_WITH_NO_FIXED_TIME => get_lang('RecurringWithNoFixedTime'), - Meeting::TYPE_RECURRING_WITH_FIXED_TIME => get_lang('RecurringWithFixedTime'), - ]; - foreach ($meetings as $meeting) { - $completeMeeting = $meeting; - $startTime = new DateTime($meeting->start_time); - $duration = new DateInterval('PT'.$meeting->duration.'M'); - $completeMeeting->extra_data = [ - 'type_name' => $typeNames[$meeting->type], - 'formatted_start_time' => $startTime->format(get_lang('Y-m-d H:i')), - 'formatted_duration' => $duration->format(get_lang('%Hh%I')), - 'meeting_details_url' => 'meeting.php?meetingId='.$meeting->id, - ]; - if (property_exists($meeting, 'agenda')) { - $completeMeeting->extra_data['stripped_agenda'] = substr($meeting->agenda, 0, -strlen($tag)); - $courseIdAndSessionId = $this->courseIdAndSessionIdFromAgenda($meeting->agenda); - $completeMeeting->extra_data['course'] = api_get_course_info_by_id($courseIdAndSessionId['courseId']); - $completeMeeting->extra_data['session'] = api_get_session_info($courseIdAndSessionId['sessionId']); - } - $completeMeetings[] = $completeMeeting; - } - - return $completeMeetings; - } - /** * Creates a meeting and returns it. * - * @param Meeting $meeting a meeting with at least a type and a topic + * @param CourseMeeting $meeting a meeting with at least a type and a topic * * @throws Exception describing the error (message and code) * - * @return MeetingInfoGet meeting + * @return CourseMeetingInfoGet meeting */ private function createMeeting($meeting) { $meeting->settings->auto_recording = 'cloud'; - $meeting->agenda .= $this->agendaTag(); - - return $this->jwtClient()->createMeeting($meeting); + $meeting->tagAgenda(); + return CourseMeetingInfoGet::fromMeetingInfoGet($this->jwtClient()->createMeeting($meeting)); } } diff --git a/plugin/zoom/meeting.php b/plugin/zoom/meeting.php index 9ad8bdc14b..83ad4309fb 100755 --- a/plugin/zoom/meeting.php +++ b/plugin/zoom/meeting.php @@ -1,8 +1,6 @@ userIsConferenceManager()) { $editMeetingForm = new FormValidator('editMeetingForm'); $editMeetingForm->addHidden('meetingId', $meeting->id); - if (Meeting::TYPE_SCHEDULED === $meeting->type + if ($meeting::TYPE_SCHEDULED === $meeting->type || - Meeting::TYPE_RECURRING_WITH_FIXED_TIME === $meeting->type + $meeting::TYPE_RECURRING_WITH_FIXED_TIME === $meeting->type ) { $startTimeDatePicker = $editMeetingForm->addDateTimePicker('start_time', get_lang('StartTime')); - $durationNumeric = $editMeetingForm->addNumeric('duration', get_lang('Duration')); + $editMeetingForm->setRequired($startTimeDatePicker); + $durationNumeric = $editMeetingForm->addNumeric('duration', get_lang('DurationInMinutes')); + $editMeetingForm->setRequired($durationNumeric); } $topicText = $editMeetingForm->addText('topic', get_lang('Topic')); $agendaTextArea = $editMeetingForm->addTextarea('agenda', get_lang('Agenda'), ['maxlength' => 2000]); @@ -43,6 +43,7 @@ if ($plugin->userIsConferenceManager()) { $editMeetingForm->addButtonUpdate(get_lang('UpdateMeeting')); if ($editMeetingForm->validate()) { $meeting->start_time = $editMeetingForm->getSubmitValue('start_time'); + $meeting->timezone = date_default_timezone_get(); $meeting->duration = $editMeetingForm->getSubmitValue('duration'); $meeting->topic = $editMeetingForm->getSubmitValue('topic'); $meeting->agenda = $editMeetingForm->getSubmitValue('agenda'); @@ -58,10 +59,10 @@ if ($plugin->userIsConferenceManager()) { try { $editMeetingForm->setDefaults( [ - 'start_time' => $meeting->start_time, + 'start_time' => $meeting->startDateTime->format('c'), 'duration' => $meeting->duration, 'topic' => $meeting->topic, - 'agenda' => $meeting->extra_data['stripped_agenda'], + 'agenda' => $meeting->agenda, ] ); } catch (Exception $exception) { diff --git a/plugin/zoom/start.php b/plugin/zoom/start.php index e1c8a42c82..9110f87173 100755 --- a/plugin/zoom/start.php +++ b/plugin/zoom/start.php @@ -43,7 +43,8 @@ if ($plugin->userIsConferenceManager()) { $scheduleMeetingForm = new FormValidator('scheduleMeetingForm'); $startTimeDatePicker = $scheduleMeetingForm->addDateTimePicker('start_time', get_lang('StartTime')); $scheduleMeetingForm->setRequired($startTimeDatePicker); - $durationNumeric = $scheduleMeetingForm->addNumeric('duration', get_lang('Duration')); + $durationNumeric = $scheduleMeetingForm->addNumeric('duration', get_lang('DurationInMinutes')); + $scheduleMeetingForm->setRequired($durationNumeric); $topicText = $scheduleMeetingForm->addText('topic', get_lang('Topic'), true); $agendaTextArea = $scheduleMeetingForm->addTextarea('agenda', get_lang('Agenda'), ['maxlength' => 2000]); // $passwordText = $scheduleMeetingForm->addText('password', get_lang('Password'), false, ['maxlength' => '10']); @@ -79,14 +80,6 @@ if ($plugin->userIsConferenceManager()) { $tpl->assign('scheduleMeetingForm', $scheduleMeetingForm->returnForm()); } -try { - $tpl->assign('liveMeetings', $plugin->getLiveMeetings()); -} catch (Exception $exception) { - Display::addFlash( - Display::return_message('Could not retrieve live meeting list: '.$exception->getMessage(), 'error') - ); -} - try { $tpl->assign('scheduledMeetings', $plugin->getScheduledMeetings()); } catch (Exception $exception) { diff --git a/plugin/zoom/view/admin.tpl b/plugin/zoom/view/admin.tpl index 080609e13a..5bdb34708b 100644 --- a/plugin/zoom/view/admin.tpl +++ b/plugin/zoom/view/admin.tpl @@ -12,12 +12,12 @@ {% for meeting in meetings %} - {{ meeting.extra_data.formatted_start_time }} - {{ meeting.extra_data.course ? meeting.extra_data.course.title : '-' }} - {{ meeting.extra_data.session ? meeting.extra_data.session.name : '-' }} + {{ meeting.formattedStartTime }} + {{ meeting.course ? meeting.course.title : '-' }} + {{ meeting.session ? meeting.session.name : '-' }} {{ meeting.topic }} - + {{ 'Details'|get_lang }} diff --git a/plugin/zoom/view/meeting.tpl b/plugin/zoom/view/meeting.tpl index 8f5ba436f6..e08d1f50d6 100644 --- a/plugin/zoom/view/meeting.tpl +++ b/plugin/zoom/view/meeting.tpl @@ -1,19 +1,25 @@ -
+ +
{{ 'Course'|get_lang }}
- {% if meeting.extra_data.course %} - - {{ meeting.extra_data.course.title }} + {% if meeting.course %} + + {{ meeting.course.title }} {% else %} - {% endif %}
{{ 'Session'|get_lang }}
-
{{ meeting.extra_data.session ? meeting.extra_data.session.name : '-' }}
+
{{ meeting.session ? meeting.session.name : '-' }}
{{ 'Status'|get_lang }}
{{ meeting.status }}
@@ -22,16 +28,16 @@
{{ meeting.topic }}
{{ 'Agenda'|get_lang }}
-
{{ meeting.extra_data.stripped_agenda| nl2br }}
+
{{ meeting.agenda| nl2br }}
{{ 'Type'|get_lang }}
-
{{meeting.extra_data.type_name}}
+
{{meeting.typeName}}
{{ 'StartTime'|get_lang }}
-
{{ meeting.extra_data.formatted_start_time }}
+
{{ meeting.formattedStartTime }}
{{ 'Duration'|get_lang }}
-
({{ meeting.extra_data.formatted_duration }})
+
{{ meeting.formattedDuration }}
{% if isConferenceManager %} diff --git a/plugin/zoom/view/start.tpl b/plugin/zoom/view/start.tpl index d62d1a8a2c..ef1d280c1e 100644 --- a/plugin/zoom/view/start.tpl +++ b/plugin/zoom/view/start.tpl @@ -1,23 +1,6 @@ -{% if liveMeetings %} - -{% for meeting in liveMeetings %} -

{{ meeting.topic }}

-

{{ meeting.agenda }}

-

- - {{ 'Join'|get_lang }} - -

-{% endfor %} -{% else %} - -{% endif %} {% if createInstantMeetingForm %} {{ createInstantMeetingForm }} {% endif %} -
{% if scheduledMeetings %}