• Odoo10中calendar视图点击事件


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

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

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

  • 相关阅读:
    安全工具
    WebRTC媒体协商及实践
    流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
    基于 WebRTC 技术的实时通信服务开发实践
    实时音视频互动系列(下):基于 WebRTC 技术的实战解析
    WebRTC基于浏览器的开发
    webRtc+websocket多人视频通话
    Android IOS WebRTC 音视频开发总结(四九) ffmpeg介绍
    Android IOS WebRTC 音视频开发总结(二五) webrtc优秀资源汇总
    The 3n + 1 problem UVA 100
  • 原文地址:https://www.cnblogs.com/edi-kai/p/10898100.html
Copyright © 2020-2023  润新知