mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-25 08:09:02 +01:00
* Calendar: allow to schedule a videoconference via Jitsi
This commit is contained in:
parent
8995574feb
commit
075362984a
@ -248,6 +248,16 @@ class calendar_boupdate extends calendar_bo
|
|||||||
// See if we need to reset any participant statuses
|
// See if we need to reset any participant statuses
|
||||||
$this->check_reset_stati($event, $old_event);
|
$this->check_reset_stati($event, $old_event);
|
||||||
|
|
||||||
|
// generate a video-room-url, if we need one and not already have one
|
||||||
|
if ($event['videoconference'] && empty($event['##videoconference']) && class_exists('EGroupware\\Status\\Videoconference\\Call'))
|
||||||
|
{
|
||||||
|
$event['##videoconference'] = EGroupware\Status\Videoconference\Call::genUniqueRoomID();
|
||||||
|
}
|
||||||
|
elseif(empty($event['videoconference']))
|
||||||
|
{
|
||||||
|
$event['##videoconference'] = '';
|
||||||
|
}
|
||||||
|
|
||||||
//echo "saving $event[id]="; _debug_array($event);
|
//echo "saving $event[id]="; _debug_array($event);
|
||||||
$event2save = $event;
|
$event2save = $event;
|
||||||
|
|
||||||
@ -681,9 +691,10 @@ class calendar_boupdate extends calendar_bo
|
|||||||
* @param int|string $user_or_email
|
* @param int|string $user_or_email
|
||||||
* @param string $ical_method ='REQUEST'
|
* @param string $ical_method ='REQUEST'
|
||||||
* @param string $role ='REQ-PARTICIPANT'
|
* @param string $role ='REQ-PARTICIPANT'
|
||||||
|
* @param string $notify_externals =null event-specific overwrite, default preferences
|
||||||
* @return boolean true if user requested to be notified, false if not
|
* @return boolean true if user requested to be notified, false if not
|
||||||
*/
|
*/
|
||||||
static public function email_update_requested($user_or_email, $ical_method='REQUEST', $role='REQ-PARTICIPANT')
|
static public function email_update_requested($user_or_email, $ical_method='REQUEST', $role='REQ-PARTICIPANT',$notify_externals=null)
|
||||||
{
|
{
|
||||||
// check if email is from a user
|
// check if email is from a user
|
||||||
if (is_numeric($user_or_email))
|
if (is_numeric($user_or_email))
|
||||||
@ -703,7 +714,7 @@ class calendar_boupdate extends calendar_bo
|
|||||||
{
|
{
|
||||||
$prefs = array(
|
$prefs = array(
|
||||||
'calendar' => array(
|
'calendar' => array(
|
||||||
'receive_updates' => $GLOBALS['egw_info']['user']['preferences']['calendar']['notify_externals'],
|
'receive_updates' => $notify_externals ?: $GLOBALS['egw_info']['user']['preferences']['calendar']['notify_externals'],
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -803,7 +814,7 @@ class calendar_boupdate extends calendar_bo
|
|||||||
* @param array $to_notify numerical user-ids as keys (!) (value is not used)
|
* @param array $to_notify numerical user-ids as keys (!) (value is not used)
|
||||||
* @param array $old_event Event before the change
|
* @param array $old_event Event before the change
|
||||||
* @param array $new_event =null Event after the change
|
* @param array $new_event =null Event after the change
|
||||||
* @param int/string $user =0 User/participant who started the notify, default current user
|
* @param int|string $user =0 User/participant who started the notify, default current user
|
||||||
* @return bool true/false
|
* @return bool true/false
|
||||||
*/
|
*/
|
||||||
function send_update($msg_type,$to_notify,$old_event,$new_event=null,$user=0)
|
function send_update($msg_type,$to_notify,$old_event,$new_event=null,$user=0)
|
||||||
@ -813,6 +824,7 @@ class calendar_boupdate extends calendar_bo
|
|||||||
{
|
{
|
||||||
$to_notify = array();
|
$to_notify = array();
|
||||||
}
|
}
|
||||||
|
$notify_externals = $new_event ? $new_event['##notify_externals'] : $old_event['##notify_externals'];
|
||||||
$disinvited = $msg_type == MSG_DISINVITE ? array_keys($to_notify) : array();
|
$disinvited = $msg_type == MSG_DISINVITE ? array_keys($to_notify) : array();
|
||||||
|
|
||||||
$owner = $old_event ? $old_event['owner'] : $new_event['owner'];
|
$owner = $old_event ? $old_event['owner'] : $new_event['owner'];
|
||||||
@ -879,7 +891,7 @@ class calendar_boupdate extends calendar_bo
|
|||||||
}
|
}
|
||||||
// unless we notfiy externals about everything aka 'responses'
|
// unless we notfiy externals about everything aka 'responses'
|
||||||
// we will notify only an external chair, if only one exists
|
// we will notify only an external chair, if only one exists
|
||||||
if ($GLOBALS['egw_info']['user']['calendar']['notify_externals'] !== 'responses')
|
if (($notify_externals ?: $GLOBALS['egw_info']['user']['calendar']['notify_externals']) !== 'responses')
|
||||||
{
|
{
|
||||||
// check if we have *only* an external chair
|
// check if we have *only* an external chair
|
||||||
$chair = null;
|
$chair = null;
|
||||||
@ -912,6 +924,9 @@ class calendar_boupdate extends calendar_bo
|
|||||||
calendar_so::split_status($statusid, $quantity, $role);
|
calendar_so::split_status($statusid, $quantity, $role);
|
||||||
if ($this->debug > 0) error_log(__METHOD__." trying to notify $userid, with $statusid ($role)");
|
if ($this->debug > 0) error_log(__METHOD__." trying to notify $userid, with $statusid ($role)");
|
||||||
|
|
||||||
|
// hack to add videoconference in event description, by allways setting $cleared_event
|
||||||
|
$cleared_event = $this->read($event['id'], null, true, 'server');
|
||||||
|
|
||||||
if (!is_numeric($userid))
|
if (!is_numeric($userid))
|
||||||
{
|
{
|
||||||
$res_info = $this->resource_info($userid);
|
$res_info = $this->resource_info($userid);
|
||||||
@ -922,7 +937,7 @@ class calendar_boupdate extends calendar_bo
|
|||||||
{
|
{
|
||||||
// --> use only details from (private-)cleared event only containing resource ($userid)
|
// --> use only details from (private-)cleared event only containing resource ($userid)
|
||||||
// reading server timezone, to be able to use cleared event for iCal generation further down
|
// reading server timezone, to be able to use cleared event for iCal generation further down
|
||||||
$cleared_event = $this->read($event['id'], null, true, 'server');
|
//$cleared_event = $this->read($event['id'], null, true, 'server');
|
||||||
$this->clear_private_infos($cleared_event, array($userid));
|
$this->clear_private_infos($cleared_event, array($userid));
|
||||||
}
|
}
|
||||||
$userid = $res_info['responsible'];
|
$userid = $res_info['responsible'];
|
||||||
@ -935,6 +950,7 @@ class calendar_boupdate extends calendar_bo
|
|||||||
{
|
{
|
||||||
$preferences = new Api\Preferences($owner);
|
$preferences = new Api\Preferences($owner);
|
||||||
$owner_prefs = $preferences->read_repository();
|
$owner_prefs = $preferences->read_repository();
|
||||||
|
if (!empty($notify_externals)) $owner_prefs['calendar']['notify_externals'] = $notify_externals;
|
||||||
}
|
}
|
||||||
if ($role != 'CHAIR' && // always notify externals CHAIRs
|
if ($role != 'CHAIR' && // always notify externals CHAIRs
|
||||||
(empty($owner_prefs['calendar']['notify_externals']) ||
|
(empty($owner_prefs['calendar']['notify_externals']) ||
|
||||||
@ -971,6 +987,7 @@ class calendar_boupdate extends calendar_bo
|
|||||||
{
|
{
|
||||||
$preferences = new Api\Preferences($owner);
|
$preferences = new Api\Preferences($owner);
|
||||||
$GLOBALS['egw_info']['user']['preferences'] = $owner_prefs = $preferences->read_repository();
|
$GLOBALS['egw_info']['user']['preferences'] = $owner_prefs = $preferences->read_repository();
|
||||||
|
if (!empty($notify_externals)) $owner_prefs['calendar']['notify_externals'] = $notify_externals;
|
||||||
}
|
}
|
||||||
$part_prefs = $owner_prefs;
|
$part_prefs = $owner_prefs;
|
||||||
$part_prefs['calendar']['receive_updates'] = $owner_prefs['calendar']['notify_externals'];
|
$part_prefs['calendar']['receive_updates'] = $owner_prefs['calendar']['notify_externals'];
|
||||||
@ -1031,6 +1048,26 @@ class calendar_boupdate extends calendar_bo
|
|||||||
$olddate->setTimezone($timezone);
|
$olddate->setTimezone($timezone);
|
||||||
$details['olddate'] = $olddate->format($timeformat);
|
$details['olddate'] = $olddate->format($timeformat);
|
||||||
}
|
}
|
||||||
|
// generate a personal videoconference url, if we need one
|
||||||
|
if (!empty($event['##videoconference']) && class_exists('EGroupware\\Status\\Videoconference\\Call'))
|
||||||
|
{
|
||||||
|
$details['videoconference'] = EGroupware\Status\Videoconference\Call::genMeetingUrl($event['##videoconference'], [
|
||||||
|
'name' => $fullname,
|
||||||
|
'email' => is_numeric($userid) ? Api\Accounts::id2name($userid, 'account_email') : $userid,
|
||||||
|
// todo: contacts and email-addresses (eg. Gravatar-Url)
|
||||||
|
'avatar' => Api\Framework::getUrl(Api\Egw::link('/api/avatar.php', array('account_id' => $userid))),
|
||||||
|
'account_id' => $userid
|
||||||
|
]);
|
||||||
|
$event_arr['videoconference'] = [
|
||||||
|
'field' => lang('Videoconference'),
|
||||||
|
'data' => $details['videoconference'],
|
||||||
|
];
|
||||||
|
// hack to add videoconference-url to ical, only if description was NOT cleared
|
||||||
|
if (isset($cleared_event['description']))
|
||||||
|
{
|
||||||
|
$cleared_event['description'] = lang('Videoconference').': '.$details['videoconference']."\n\n".$event['description'];
|
||||||
|
}
|
||||||
|
}
|
||||||
//error_log(__METHOD__."() userid=$userid, timezone=".$timezone->getName().", startdate=$details[startdate], enddate=$details[enddate], updated=$details[updated], olddate=$details[olddate]");
|
//error_log(__METHOD__."() userid=$userid, timezone=".$timezone->getName().", startdate=$details[startdate], enddate=$details[enddate], updated=$details[updated], olddate=$details[olddate]");
|
||||||
|
|
||||||
list($subject,$notify_body) = explode("\n",$GLOBALS['egw']->preferences->parse_notify($notify_msg,$details),2);
|
list($subject,$notify_body) = explode("\n",$GLOBALS['egw']->preferences->parse_notify($notify_msg,$details),2);
|
||||||
@ -1113,7 +1150,8 @@ class calendar_boupdate extends calendar_bo
|
|||||||
'user_id' => $userid,
|
'user_id' => $userid,
|
||||||
'type' => $m_type,
|
'type' => $m_type,
|
||||||
'id' => $event['id'],
|
'id' => $event['id'],
|
||||||
'app' => 'calendar'
|
'app' => 'calendar',
|
||||||
|
'videoconference' => $details['videoconference'],
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if ($m_type === MSG_ALARM) $notification->set_popupdata('calendar', array('egw_pr_notify' => 1, 'type' => $m_type));
|
if ($m_type === MSG_ALARM) $notification->set_popupdata('calendar', array('egw_pr_notify' => 1, 'type' => $m_type));
|
||||||
|
@ -262,8 +262,8 @@ class calendar_uiforms extends calendar_ui
|
|||||||
'recur_exception' => array(),
|
'recur_exception' => array(),
|
||||||
'title' => $title ? $title : '',
|
'title' => $title ? $title : '',
|
||||||
'category' => $cat_id,
|
'category' => $cat_id,
|
||||||
'videoconference' => !empty($_GET['videoconference']),
|
'##videoconference' => !empty($_GET['videoconference']),
|
||||||
'notify_externals' => !empty($_GET['videoconference']) ? 'yes' : $this->cal_prefs['notify_externals'],
|
'##notify_externals' => !empty($_GET['videoconference']) ? 'yes' : $this->cal_prefs['notify_externals'],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -434,6 +434,9 @@ class calendar_uiforms extends calendar_ui
|
|||||||
case 'cal_resources':
|
case 'cal_resources':
|
||||||
case 'status_date':
|
case 'status_date':
|
||||||
break;
|
break;
|
||||||
|
case 'notify_externals':
|
||||||
|
$event['##notify_externals'] = $data;
|
||||||
|
break;
|
||||||
case 'participant':
|
case 'participant':
|
||||||
foreach($data as $participant)
|
foreach($data as $participant)
|
||||||
{
|
{
|
||||||
@ -536,7 +539,7 @@ class calendar_uiforms extends calendar_ui
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default: // existing participant row
|
default: // existing participant row
|
||||||
if (!is_array($data)) continue; // widgets in participant tab, above participant list
|
if (!is_array($data)) continue 2; // widgets in participant tab, above participant list
|
||||||
$quantity = $status = $role = null;
|
$quantity = $status = $role = null;
|
||||||
foreach(array('uid','status','quantity','role') as $name)
|
foreach(array('uid','status','quantity','role') as $name)
|
||||||
{
|
{
|
||||||
@ -1509,7 +1512,7 @@ class calendar_uiforms extends calendar_ui
|
|||||||
'mail' => array('label' => 'Mail all participants', 'title' => 'Compose a mail to all participants after the event is saved'),
|
'mail' => array('label' => 'Mail all participants', 'title' => 'Compose a mail to all participants after the event is saved'),
|
||||||
'sendrequest' => array('label' => 'Meetingrequest to all participants', 'title' => 'Send meetingrequest to all participants after the event is saved'),
|
'sendrequest' => array('label' => 'Meetingrequest to all participants', 'title' => 'Send meetingrequest to all participants after the event is saved'),
|
||||||
),
|
),
|
||||||
'participants[nofify_externals]' => [
|
'participants[notify_externals]' => [
|
||||||
'yes' => ['label' => 'Yes', 'title' => 'Notify all externals (non-users) about this event'],
|
'yes' => ['label' => 'Yes', 'title' => 'Notify all externals (non-users) about this event'],
|
||||||
'no' => ['label' => 'No', 'title' => 'Do NOT notify externals (non-users) about this event'],
|
'no' => ['label' => 'No', 'title' => 'Do NOT notify externals (non-users) about this event'],
|
||||||
'never' => ['label' => 'Never', 'title' => 'Never notify externals (non-users) about events I create'],
|
'never' => ['label' => 'Never', 'title' => 'Never notify externals (non-users) about events I create'],
|
||||||
@ -1680,6 +1683,11 @@ class calendar_uiforms extends calendar_ui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// set videoconference from existence of url in cfs
|
||||||
|
if (!isset($event['videoconference']) && !empty($event['##videoconference']))
|
||||||
|
{
|
||||||
|
$event['videoconference'] = !empty($event['##videoconference']);
|
||||||
|
}
|
||||||
|
|
||||||
$etpl = new Etemplate();
|
$etpl = new Etemplate();
|
||||||
if (!$etpl->read($preserv['template']))
|
if (!$etpl->read($preserv['template']))
|
||||||
@ -1818,6 +1826,15 @@ class calendar_uiforms extends calendar_ui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$content['participants']['status_date'] = $preserv['actual_date'];
|
$content['participants']['status_date'] = $preserv['actual_date'];
|
||||||
|
// set notify_externals in participants from cfs
|
||||||
|
if (!empty($event['##notify_externals']))
|
||||||
|
{
|
||||||
|
$content['participants']['notify_externals'] = $event['##notify_externals'];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$content['participants']['notify_externals'] = $this->cal_prefs['notify_externals'];
|
||||||
|
}
|
||||||
$preserved = array_merge($preserv,$content);
|
$preserved = array_merge($preserv,$content);
|
||||||
$event['new_alarm']['options'] = $content['new_alarm']['options'];
|
$event['new_alarm']['options'] = $content['new_alarm']['options'];
|
||||||
if ($event['alarm'])
|
if ($event['alarm'])
|
||||||
@ -1987,7 +2004,9 @@ class calendar_uiforms extends calendar_ui
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$etpl->exec('calendar.calendar_uiforms.process_edit',$content,$sel_options,$readonlys,$preserved,$preserved['no_popup'] ? 0 : 2);
|
$etpl->exec('calendar.calendar_uiforms.process_edit',$content,$sel_options,$readonlys,$preserved+[
|
||||||
|
'##videoconference' => $content['##videoconference'],
|
||||||
|
],$preserved['no_popup'] ? 0 : 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +53,9 @@
|
|||||||
<column/>
|
<column/>
|
||||||
</columns>
|
</columns>
|
||||||
<rows>
|
<rows>
|
||||||
<row class="th"></row>
|
<row>
|
||||||
|
<select label="Notify externals" id="notify_externals" span="all" align="right"/>
|
||||||
|
</row>
|
||||||
<row disabled="@no_add" height="60" class="et2_toolbar">
|
<row disabled="@no_add" height="60" class="et2_toolbar">
|
||||||
<calendar-owner id="participant" allowFreeEntries="true" span="4" empty_label="Add new participants or resource" onchange="app.calendar.participantOnChange"/>
|
<calendar-owner id="participant" allowFreeEntries="true" span="4" empty_label="Add new participants or resource" onchange="app.calendar.participantOnChange"/>
|
||||||
<hbox width="100%">
|
<hbox width="100%">
|
||||||
@ -62,9 +64,6 @@
|
|||||||
<button id="add" align="right" image="add" novalidate="1" statustext="Please first select participants on the left and then use plus button to add them" background_image="1" readonly="true" ro_image="add"/>
|
<button id="add" align="right" image="add" novalidate="1" statustext="Please first select participants on the left and then use plus button to add them" background_image="1" readonly="true" ro_image="add"/>
|
||||||
</hbox>
|
</hbox>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
|
||||||
<select label="Notify externals" id="nofify_externals" span="all" align="right"/>
|
|
||||||
</row>
|
|
||||||
<row class="th thb">
|
<row class="th thb">
|
||||||
<description value="Type"/>
|
<description value="Type"/>
|
||||||
<description value="Participants"/>
|
<description value="Participants"/>
|
||||||
@ -232,7 +231,7 @@
|
|||||||
<label for="location" value="Location"/>
|
<label for="location" value="Location"/>
|
||||||
<hbox span="2">
|
<hbox span="2">
|
||||||
<textbox id="location" maxlength="255" class="et2_fullWidth"/>
|
<textbox id="location" maxlength="255" class="et2_fullWidth"/>
|
||||||
<checkbox label="Videoconference" id="videoconference"/>
|
<checkbox label="Videoconference" id="videoconference" onchange="if (this.checked) document.getElementById('calendar-edit_notify_externals').value='yes';"/>
|
||||||
</hbox>
|
</hbox>
|
||||||
<description/>
|
<description/>
|
||||||
<taglist-cat id="category" height="190" empty_label="Categories" multiple="toggle" class="et2_fullWidth" rows="1" />
|
<taglist-cat id="category" height="190" empty_label="Categories" multiple="toggle" class="et2_fullWidth" rows="1" />
|
||||||
|
Loading…
Reference in New Issue
Block a user