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 @@