odoo.define('google_calendar.CalendarView', function (require) { "use strict"; var core = require('web.core'); var Dialog = require('web.Dialog'); var framework = require('web.framework'); const CalendarView = require('calendar.CalendarView'); const CalendarRenderer = require('calendar.CalendarRenderer'); const CalendarController = require('calendar.CalendarController'); const CalendarModel = require('calendar.CalendarModel'); const viewRegistry = require('web.view_registry'); const session = require('web.session'); var _t = core._t; const GoogleCalendarModel = CalendarModel.include({ /** * @override */ init: function () { this._super.apply(this, arguments); this.google_is_sync = true; this.google_pending_sync = false; }, /** * @override */ __get: function () { var result = this._super.apply(this, arguments); result.google_is_sync = this.google_is_sync; return result; }, /** * @override * @returns {Promise} */ async _loadCalendar() { const _super = this._super.bind(this); // When the calendar synchronization takes some time, prevents retriggering the sync while navigating the calendar. if (this.google_pending_sync) { return _super(...arguments); } try { await Promise.race([ new Promise(resolve => setTimeout(resolve, 1000)), this._syncGoogleCalendar(true) ]); } catch (error) { if (error.event) { error.event.preventDefault(); } console.error("Could not synchronize Google events now.", error); this.google_pending_sync = false; } return _super(...arguments); }, _syncGoogleCalendar(shadow = false) { var self = this; var context = this.getSession().user_context; this.google_pending_sync = true; return this._rpc({ route: '/google_calendar/sync_data', params: { model: this.modelName, fromurl: window.location.href, local_context: context, // LUL TODO remove this local_context } }, {shadow}).then(function (result) { if (result.status === "need_config_from_admin" || result.status === "need_auth") { self.google_is_sync = false; } else if (result.status === "no_new_event_from_google" || result.status === "need_refresh") { self.google_is_sync = true; } self.google_pending_sync = false; return result }); }, archiveRecords: function (ids, model) { return this._rpc({ model: model, method: 'action_archive', args: [ids], context: session.user_context, }); }, }) const GoogleCalendarController = CalendarController.include({ custom_events: _.extend({}, CalendarController.prototype.custom_events, { syncGoogleCalendar: '_onGoogleSyncCalendar', archiveRecord: '_onArchiveRecord', }), //-------------------------------------------------------------------------- // Handlers //-------------------------------------------------------------------------- /** * Try to sync the calendar with Google Calendar. According to the result * from Google API, this function may require an action of the user by the * mean of a dialog. * * @private * @returns {OdooEvent} event */ _onGoogleSyncCalendar: function (event) { var self = this; return this.model._syncGoogleCalendar().then(function (o) { if (o.status === "need_auth") { Dialog.alert(self, _t("You will be redirected to Google to authorize access to your calendar!"), { confirm_callback: function() { framework.redirect(o.url); }, title: _t('Redirection'), }); } else if (o.status === "need_config_from_admin") { if (!_.isUndefined(o.action) && parseInt(o.action)) { Dialog.confirm(self, _t("The Google Synchronization needs to be configured before you can use it, do you want to do it now?"), { confirm_callback: function() { self.do_action(o.action); }, title: _t('Configuration'), }); } else { Dialog.alert(self, _t("An administrator needs to configure Google Synchronization before you can use it!"), { title: _t('Configuration'), }); } } else if (o.status === "need_refresh") { self.reload(); } }).then(event.data.on_always, event.data.on_always); }, _onArchiveRecord: function (ev) { var self = this; Dialog.confirm(this, _t("Are you sure you want to archive this record ?"), { confirm_callback: function () { self.model.archiveRecords([ev.data.id], self.modelName).then(function () { self.reload(); }); } }); }, }); const GoogleCalendarRenderer = CalendarRenderer.include({ events: _.extend({}, CalendarRenderer.prototype.events, { 'click .o_google_sync_button': '_onGoogleSyncCalendar', }), custom_events: _.extend({}, CalendarRenderer.prototype.custom_events, { archive_event: '_onArchiveEvent', }), //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- /** * Adds the Sync with Google button in the sidebar * * @private */ _initSidebar: function () { var self = this; this._super.apply(this, arguments); this.$googleButton = $(); if (this.model === "calendar.event") { if (this.state.google_is_sync) { this.$googleButton = $('', {html: _t("Synched with Google")}) .addClass('o_google_sync badge badge-pill badge-success') .prepend($('', {class: "fa mr-2 fa-check"})) .appendTo(self.$sidebar); } else { this.$googleButton = $('