dhtmlx循环事件------笔记

笔记很乱,有空再整理一下。。。微笑


新建事件触发 dhtmlxscheduler.js下

dhtmlxEventable=function(obj){
...
   obj.eventCatcher-->obj.callEvent
...
}

展开repeat event:即循环事件(6个参数,大致7种情况),函数大部分在dhtmlxscheduler_recurring.js文件中

循环事件函数: get_repeat_code(dates) 返回类型和相对应的图:

day_1_ _ _#no

------------------------------------------

week_1___1,2,3,4,5#20

-------------------------------------------

week_2___3,6#

------------------------------------------

month_2___#no

上图中每隔两个月的3号,3体现在event_length=的值

------------------------------------------

month_1_0_2_#10

上图为每个月的第2个星期天,星期天为0

------------------------------------------

month_2_6_1_#no

上图为每年的三月2号

------------------------------------------

year_1_3_2_#no

上图为每年一月第二个星期三

------------------------------------------

先贴张图:初始化重复事件的方法属性


function get_repeat_code(dates) {

      var code = [get_value(els, "repeat")];         

      get_rcode[code[0]](code, dates);
      while (code.length < 5) code.push(""); //code长度小于5则赋值空字符串 例如:code=["day",1,"","",""]

      var repeat = "";

var end = get_end_rule(els);//获取结束规则参数,即井号后的值(“no”,"end_of_date"结束日期,"occurences_count"循环次数)

if (end == "no") {

dates.end = new Date(9999, 1, 1);//无结束时间的循环,设置默认结束时间

repeat = "no";

      } else if (end == "date_of_end") {
          dates.end = str_date(get_value(els, "date_of_end"));
      } else {
          scheduler.transpose_type(code.join("_"));//设置days值,定义this.date[f],this,date[gf]方法体
          repeat = Math.max(1, get_value(els, "occurences_count"));//从els中得到重复的次数
var transp = 0;
          dates.end = scheduler.date.add(new Date(dates.start), repeat + transp, code.join("_"));
    }
 return code.join("_") + "#" + repeat;


---循环事件生成结束时间end_date函数:

scheduler.date.add(new Date(dates.start),repeat+transp,code.join("_"));

---dhtmlx日程控件显示每个方格的事件:

scheduler.repeat_date = function(ev, stack, non_render, from, to, maxCount) {

this.transpose_type(ev.rec_pattern);//解析 循环规则字符串:例如参数1_参数2_参数3_参数4_参数5#参数6

scheduler.transpose_day_week = function(sd, list, cor, size, cor2);//解析第5个参数的函数:

}


scheduler._waiAria = {...} // 日程方格一个一个的显示当天事件 


得到rec_type  事件的开始时间,结束时间

var code;//例如["month","1","1","1","","no"]  month_1_1_1_#no
var ev_start_date=?;  var ev_end_date=?;//得到时间输入框的开始时间和结束时间
var dates_start = new Date(ev_start_date);var dates_end;//事件开始和结束时间
var rec_type;var str;var step;var day = 60 * 60 * 24 * 1000;var days = null;var dates_dot_start;
var this_transponse_size={
    day:1, week:7, month:1, year:12
};
var repeat_type =""?;// 值为第一个参数 day month week year
//得到重复类型 赋值repeat_type--------如果repeat_type有值则为重复事件,为空则为单个事件
//repeat_type有值,执行get_rcode方法
if(repeat_type!=""){
    switch(repeat_type){
        case "day":
            code.push("day");
            if () {//选择每隔几天
                code.push(Math.max(1, day_count每个几天));
            }else {//选择每个工作日
                code.push("week");
                code.push(1);
                code.push("");
                code.push("");
                code.push("1,2,3,4,5");//recurring_workdays每个工作日,可固定写成"1,2,3,4,5"
                code.splice(0, 1);
            }
            break;
        case "week":
            code.push("week");
            code.push(Math.max(1, week_count每几周));
            code.push("");
            code.push("");
            var t = [];
            var col = [];//得到哪几天 例如星期2 星期5  星期天为0 逗号拼接
            var day = dates_start.getDay();
            var start_exists = false;
            for (var i = 0; i < col.length; i++){
                t.push(col[i]);
                start_exists = start_exists || col[i] == day;
            }
            if (!t.length){
                t.push(day);
                start_exists = true;
            }
            t.sort();
            if (false){//scheduler.config.repeat_precise=true
                dates_start = scheduler_date_week_start(dates_start);
                dates_dot_start = true;
            } else if (!start_exists){
                dates_start=scheduler_transpose_day_week(dates_start, t, 1, 7);
                dates_dot_start = true;
            }
    
            code.push(t.join(","));
            break;
        case "month":
            code.push("month");
            if (?) {//选择每隔几个月的几号
                code.push(Math.max(1, month_count隔几个月));
                dates_start.setDate(month_day几号);
            } else {//选择每隔几个月的第几个星期几
                code.push(Math.max(1, month_count2每隔几个月));
                code.push(month_day2星期几);
                code.push(Math.max(1, month_week2第几个));
            }
            dates_dot_start = true;
            break;
//        case "year":
//            code.push("year");
//            if () {//每年几月几号
//                code.push("1");
//                dates.start.setMonth(0);
//                dates.start.setDate(year_day几号);
//                dates.start.setMonth(year_month几月);//1月为0
//            } else {//每年几月份的第几个星期几
//                code.push("1");
//                code.push(year_day2星期几);
//                code.push(year_week2第几个);
//                dates_start.setDate(1);
//                dates_start.setMonth(year_month2几月);//1月为0
//            }
//            dates_dot_start = true;
//            break;
        }        
}
rec_type = get_repeat_code();//赋值循环字符串


function get_repeat_code(dates) {
            while (code.length < 5) code.push("");
            var repeat = "";
            var end = ?;//结束规则 3种值--"no" "date_of_end" "occurences_count"
            if (end == "no") {
                dates_end = new Date(9999, 1, 1);
                repeat = "no";
            }
            else if (end == "date_of_end") {
                dates_end = ?;//结束日期
            }
            else {
                scheduler_transpose_type(code.join("_"));
                repeat = Math.max(1, occurences_count具体循环的次数);
                var transp = 0;
                dates_end = scheduler_date_add(new Date(dates_start), repeat + transp, code.join("_"));
            }
            return code.join("_") + "#" + repeat;
        };
        
function scheduler_date_add(dates_start_date,inc,mode){
    if (str[0] == "day" || str[0] == "week") {
        return this_date_gf1(dates_start_date,inc);
    }else if (str[0] == "month" || str[0] == "year") {
        return this_date_gf2(dates_start_date,inc);
    }
};
function this_date_gf1(sd, inc) {
    var nd = new Date(sd.valueOf());
    if (days) {
        for (var count = 0; count < inc; count++)
            scheduler_transpose_day_week(nd, days, 0, step);
    } else
        nd.setDate(nd.getDate() + inc * step);
    return nd;
};
function this_date_gf2(sd, inc) {
    var nd = new Date(sd.valueOf());
    nd.setMonth(nd.getMonth() + inc * step);
    if (str[3])
        scheduler_date_day_week(nd, str[2], str[3]);
    return nd;
};
function scheduler_date_day_week(sd,day,week){
    sd.setDate(1);
    week = (week - 1) * 7;
    var cday = sd.getDay();
    var nday = day * 1 + week - cday + 1;
    sd.setDate(nday <= week ? (nday + 7) : nday);
};
function scheduler_transpose_type(type){
    str = type.split("_");
    step = this_transponse_size[str[0]] * str[1];
    
    if (str[0] == "day" || str[0] == "week") {
        if (str[4]) {
            days = str[4].split(",");
            if (scheduler.config.start_on_monday) {//start_on_monday=1
                for (var i = 0; i < days.length; i++)
                    days[i] = (days[i] * 1) || 7;
                days.sort();
            }
        }
    }
};

function _get_node_numeric_value(els, name){
    var value = scheduler.form_blocks["recurring"]._get_node_value(els, name);
    return ((value * 1) || 0);
};


function _get_node_value(els, name, multiselect){
    var col = els[name];
    if(!col) return "";
    if(col.length){
        if(multiselect){
            var res = [];
            for (var i = 0; i < col.length; i++)
                if (col[i].checked) res.push(col[i].value);

            return res;
        }else{
            for (var i = 0; i < col.length; i++)
                if (col[i].checked) return col[i].value;
        }
    }

    if(col.value)
        return !multiselect ? col.value : [col.value];
};

function scheduler_transpose_day_week(sd, list, cor, size, cor2) {
    var cday = (sd.getDay() || (scheduler.config.start_on_monday ? 7 : 0)) - cor;//start_on_monday=1
    for (var i = 0; i < list.length; i++) {
        if (list[i] > cday)
            return sd.setDate(sd.getDate() + list[i] * 1 - cday - (size ? cor : cor2));
    }
    scheduler_transpose_day_week(sd, list, cor + size, null, cor);
};

function scheduler_date_week_start(date){
    var shift=date.getDay();
    if (scheduler.config.start_on_monday){//start_on_monday=1
        if (shift===0) shift=6;
        else shift--;
    }
    return this.date_part(this.add(date,-1*shift,"day"));
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值