有个需求,需要根据该条记录的状态字段来控制点击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         },

 

感觉这个方法有点笨,如果大家有什么更好的方法,可以留言说下,谢谢

希望可以帮到有需要的人,大家共同进步................................................................

 

posted on 2019-05-21 10:00  汉有游女,君子于役  阅读(631)  评论(0编辑  收藏  举报