diff --git a/addons/calendar/data/mail_template_data.xml b/addons/calendar/data/mail_template_data.xml
index 64b89533668..e411500fae8 100644
--- a/addons/calendar/data/mail_template_data.xml
+++ b/addons/calendar/data/mail_template_data.xml
@@ -77,6 +77,9 @@
% endfor
+ % if object.event_id.videocall_location:
+
Join Video Call: ${object.event_id.videocall_location}
+ % endif
@@ -168,6 +171,9 @@
% endfor
+ % if object.event_id.videocall_location:
+ Join Video Call: ${object.event_id.videocall_location}
+ % endif
@@ -257,6 +263,9 @@
% endfor
+ % if object.event_id.videocall_location:
+ Join Video Call: ${object.event_id.videocall_location}
+ % endif
diff --git a/addons/calendar/models/calendar_event.py b/addons/calendar/models/calendar_event.py
index 86aa3c89fef..3ed48e65847 100644
--- a/addons/calendar/models/calendar_event.py
+++ b/addons/calendar/models/calendar_event.py
@@ -3,9 +3,11 @@
from datetime import timedelta
import math
+from uuid import uuid4
import babel.dates
import logging
import pytz
+from werkzeug.urls import url_join
from odoo import api, fields, models
from odoo import tools
@@ -78,6 +80,15 @@ class Meeting(models.Model):
partners |= self.env['res.partner'].browse(active_id)
return partners
+ @api.model
+ def _default_videocall_location(self):
+ if self.env.context.get('calendar_no_videocall'):
+ return False
+ jitsi_url = self.env['ir.config_parameter'].sudo().get_param('website_jitsi.jitsi_server_domain', 'meet.jit.si')
+ if not jitsi_url.startswith('http'):
+ jitsi_url = 'https://' + jitsi_url
+ return url_join(jitsi_url, 'odoo-%s' % (uuid4().hex[:12]))
+
def _find_my_attendee(self):
""" Return the first attendee where the user connected has been invited
from all the meeting_ids in parameters.
@@ -211,6 +222,7 @@ class Meeting(models.Model):
('confidential', 'Only internal users')],
'Privacy', default='public', required=True)
location = fields.Char('Location', tracking=True, help="Location of Event")
+ videocall_location = fields.Char('Join Video Call', default=_default_videocall_location)
show_as = fields.Selection(
[('free', 'Available'),
('busy', 'Busy')], 'Show Time as', default='busy', required=True)
diff --git a/addons/calendar/static/src/scss/calendar.scss b/addons/calendar/static/src/scss/calendar.scss
index 4260c9bad73..63cb48353aa 100644
--- a/addons/calendar/static/src/scss/calendar.scss
+++ b/addons/calendar/static/src/scss/calendar.scss
@@ -68,3 +68,12 @@
font-weight: bold;
}
}
+
+.o_cw_body .o_field_copy {
+ max-width: calc(100% - 6rem);
+ width: unset !important;
+}
+
+.o_cw_body .o_clipboard_button {
+ padding-top: 0px !important;
+}
diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml
index 24006e897d5..bd9a559cc3a 100644
--- a/addons/calendar/views/calendar_views.xml
+++ b/addons/calendar/views/calendar_views.xml
@@ -112,6 +112,11 @@
class="oe_inline"/>
+
+
+
+
+
@@ -255,6 +260,7 @@
event_open_popup="true"
event_limit="5"
color="user_id">
+
diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py
index 7163941fd50..1b82c77662d 100644
--- a/addons/hr_holidays/models/hr_leave.py
+++ b/addons/hr_holidays/models/hr_leave.py
@@ -869,6 +869,7 @@ class HolidaysRequest(models.Model):
meeting_values = meeting_holidays._prepare_holidays_meeting_values()
meetings = self.env['calendar.event'].with_context(
no_mail_to_attendees=True,
+ calendar_no_videocall=True,
active_model=self._name
).create(meeting_values)
for holiday, meeting in zip(meeting_holidays, meetings):
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index d08a0a0c1cc..5a8c60547f2 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -1750,6 +1750,23 @@ var CharCopyClipboard = FieldChar.extend(CopyClipboard, {
className: 'o_field_copy o_text_overflow',
});
+var URLCopyClipboard = FieldChar.extend(CopyClipboard, {
+ description: _lt("Copy to Clipboard"),
+ clipboardTemplate: 'CopyClipboardChar',
+ className: 'o_field_copy o_text_overflow o_field_copy_url',
+ events: _.extend({}, FieldChar.prototype.events, {
+ 'click': '_onClick',
+ }),
+
+ _onClick: function(ev) {
+ if(ev.target.className.includes('o_field_copy_url')) {
+ ev.stopPropagation();
+
+ window.open(this.value, '_blank');
+ }
+ }
+});
+
var AbstractFieldBinary = AbstractField.extend({
events: _.extend({}, AbstractField.prototype.events, {
'change .o_input_file': 'on_file_change',
@@ -3756,6 +3773,7 @@ return {
UrlWidget: UrlWidget,
TextCopyClipboard: TextCopyClipboard,
CharCopyClipboard: CharCopyClipboard,
+ URLCopyClipboard: URLCopyClipboard,
JournalDashboardGraph: JournalDashboardGraph,
AceEditor: AceEditor,
FieldColor: FieldColor,
diff --git a/addons/web/static/src/js/fields/field_registry.js b/addons/web/static/src/js/fields/field_registry.js
index bb407cda640..9822537129f 100644
--- a/addons/web/static/src/js/fields/field_registry.js
+++ b/addons/web/static/src/js/fields/field_registry.js
@@ -42,6 +42,7 @@ registry
.add('url', basic_fields.UrlWidget)
.add('CopyClipboardText', basic_fields.TextCopyClipboard)
.add('CopyClipboardChar', basic_fields.CharCopyClipboard)
+ .add('CopyClipboardURL', basic_fields.URLCopyClipboard)
.add('image', basic_fields.FieldBinaryImage)
.add('image_url', basic_fields.CharImageUrl)
.add('kanban.image', basic_fields.KanbanFieldBinaryImage)
diff --git a/addons/web/static/src/scss/fields.scss b/addons/web/static/src/scss/fields.scss
index 70436149d23..8af6342a025 100644
--- a/addons/web/static/src/scss/fields.scss
+++ b/addons/web/static/src/scss/fields.scss
@@ -470,7 +470,7 @@
color: $o-brand-primary;
font-weight: $badge-font-weight;
text-align: center;
- padding-right: 100px;
+ padding-right: 6rem;
word-break: break-word;
.o_clipboard_button {
@include o-position-absolute($top: 0, $right: 0);
@@ -484,6 +484,10 @@
height: 100%;
}
}
+ &.o_field_copy_url {
+ cursor: pointer;
+ padding-left: 3px;
+ }
}
& > .o_field_color {
diff --git a/addons/web/static/src/scss/web_calendar.scss b/addons/web/static/src/scss/web_calendar.scss
index f12fc40726c..9c429491cd7 100644
--- a/addons/web/static/src/scss/web_calendar.scss
+++ b/addons/web/static/src/scss/web_calendar.scss
@@ -687,6 +687,8 @@ $o-cw-filter-avatar-size: 20px;
.o_cw_popover_fields_secondary {
max-height: 170px; // Fallback for old browsers
max-height: 25vh;
+ overflow: auto;
+ padding-bottom: 1px; // prevents the scrollbar to show when not needed
&::-webkit-scrollbar {
background: gray('200');
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 92f360a0abf..4aae9ffa8a3 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -1405,12 +1405,12 @@