有個需求,須要根據該條記錄的狀態字段來控制點擊calendar時是否須要打開form視圖,解決方案以下:重寫了web_calendar的get_fc_init_options()方法中的eventClick()方法css
對於Odoo10中calendar視圖,底層用的是fullcalendar.js框架,odoo又對fullcalendar作了封裝,也就是web_calendar.js。html
咱們能夠根據本身的須要在web_calendar.js的基礎上作修改。web
web_calendar.js中對點擊事件作了處理,代碼以下:app
1 get_fc_init_options: function () { 2 //Documentation here : http://arshaw.com/fullcalendar/docs/ 3 var self = this; 4 return $.extend({}, get_fc_defaultOptions(), { 5 defaultView: (this.mode == "month")? "month" : ((this.mode == "week")? "agendaWeek" : ((this.mode == "day")? "agendaDay" : "agendaWeek")), 6 header: false, 7 selectable: !this.options.read_only_mode && this.create_right, 8 selectHelper: true, 9 editable: this.editable, 10 droppable: true, 11 12 // callbacks 13 viewRender: function(view) { 14 var mode = (view.name == "month")? "month" : ((view.name == "agendaWeek") ? "week" : "day"); 15 if(self.$buttons !== undefined) { 16 self.$buttons.find('.active').removeClass('active'); 17 self.$buttons.find('.o_calendar_button_' + mode).addClass('active'); 18 } 19 20 var title = self.title + ' (' + ((mode === "week")? _t("Week ") : "") + view.title + ")"; 21 self.set({'title': title}); 22 23 self.$calendar.fullCalendar('option', 'height', Math.max(290, parseInt(self.$('.o_calendar_view').height()))); 24 25 setTimeout(function() { 26 var $fc_view = self.$calendar.find('.fc-view'); 27 var width = $fc_view.find('> table').width(); 28 $fc_view.find('> div').css('width', (width > $fc_view.width())? width : '100%'); // 100% = fullCalendar default 29 }, 0); 30 }, 31 windowResize: function() { 32 self.$calendar.fullCalendar('render'); 33 }, 34 eventDrop: function (event, _day_delta, _minute_delta, _all_day, _revertFunc) { 35 var data = self.get_event_data(event); 36 self.proxy('update_record')(event._id, data); // we don't revert the event, but update it. 37 }, 38 eventResize: function (event, _day_delta, _minute_delta, _revertFunc) { 39 var data = self.get_event_data(event); 40 self.proxy('update_record')(event._id, data); 41 }, 42 eventRender: function (event, element, view) { 43 element.find('.fc-event-title').html(event.title + event.attendee_avatars); 44 }, 45 eventAfterRender: function (event, element, view) { 46 if ((view.name !== 'month') && (((event.end-event.start)/60000)<=30)) { 47 //if duration is too small, we see the html code of img 48 var current_title = $(element.find('.fc-event-time')).text(); 49 var new_title = current_title.substr(0,current_title.indexOf("<img")>0?current_title.indexOf("<img"):current_title.length); 50 element.find('.fc-event-time').html(new_title); 51 } 52 }, 53 eventClick: function (event) { self.open_event(event._id,event.title); }, 54 select: function (start_date, end_date, all_day, _js_event, _view) { 55 var data_template = self.get_event_data({ 56 start: start_date, 57 end: end_date, 58 allDay: all_day, 59 }); 60 self.open_quick_create(data_template); 61 }, 62 63 unselectAuto: false, 64 });
其中的點擊事件就是方法eventClick(event) {self.open_event(event._id, event.title);}框架
而後咱們對該方法作修改,根據咱們本身實際的業務需求來判斷是否調用self.open_event()方法,來實現控制是否須要彈窗:ui
1 get_fc_init_options: function () { 2 var self = this; 3 var res = this._super.apply(this, arguments); 4 5 if (self.model == 'esw.working.hours.assign') { 6 // self.write_right = self.can_writable; 7 self.write_right = false; 8 return $.extend( 9 res, 10 { 11 selectable: self.creatable, 12 13 eventClick: function (event) { 14 15 self.dataset.read_ids([parseInt(event._id)], _.keys(this.fields)).done(function (incomplete_records) { 16 self.perform_necessary_name_gets(incomplete_records).then(function (records) { 17 18 var need_open = false; 19 if (records.length > 0) { 20 if ('is_filled_in' in records[0]){ 21 if (records[0].is_filled_in){ 22 var fill_time = new Date(records[0].wh_filled_in_datetime); 23 // var fill_time = new Date('2019-03-01 16:02:06'); 24 var d_val = (new Date() - fill_time) / (24*60*60*1000) 25 if (d_val < 30){ 26 // Dialog.confirm(this, _t("工時已提報,是否從新提報?"), { 27 // confirm_callback: function () { 28 self.open_event(event._id, event.title); 29 // } 30 // }) 31 32 } else { 33 Dialog.alert(this, _t("提報日期已超過30天,不容許修改")); 34 } 35 }else { 36 need_open = true; 37 } 38 } else { 39 need_open = true; 40 } 41 42 if (need_open) 43 self.open_event(event._id, event.title); 44 } 45 46 }); 47 }); 48 49 }, 50 } 51 ); 52 }else { 53 return self._super.apply(this, arguments); 54 } 55 56 },
感受這個方法有點笨,若是你們有什麼更好的方法,能夠留言說下,謝謝this
但願能夠幫到有須要的人,你們共同進步................................................................spa