有个需求,需要根据该条记录的状态字段来控制点击calendar时是否需要打开form视图,解决方案如下:重写了web_calendar的get_fc_init_options()方法中的eventClick()方法
对于Odoo10中calendar视图,底层用的是fullcalendar.js框架,odoo又对fullcalendar做了封装,也就是web_calendar.js。
我们可以根据自己的需要在web_calendar.js的基础上做修改。
web_calendar.js中对点击事件做了处理,代码如下:
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()方法,来实现控制是否需要弹窗:
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 },
感觉这个方法有点笨,如果大家有什么更好的方法,可以留言说下,谢谢
希望可以帮到有需要的人,大家共同进步................................................................