vesh-cli
Version:
码农村nodejs版本VESH框架脚手架搭建器
217 lines (215 loc) • 11.5 kB
JavaScript
(function (V, W, $) {
//识别 defaultValue value等值
V.registScript(function (path, vm) {
var _ = this, __ = {};
{
V.inherit.apply(_, [W.Control, [path || '<div><span class="p_calender_buttons"><span class="p_calender_buttonleft"><</span><span class="p_calender_title"></span><span class="p_calender_buttonright">></span></span><table><thead></thead><tbody></tbody></table></div>', vm || { data: {}}]]);
__.onLoad = _.onLoad;
__.render = _.render;
}
_.onLoad = function (node) {
_.head = node.find('thead');
_.body = node.find('tbody');
_.title = node.find('span.p_calender_title');
_.left = node.find('span.p_calender_buttonleft');
_.right = node.find('span.p_calender_buttonright');
V.forC(_.events, function (k, v) {
switch (k.toLowerCase()) {
case 'click':
_.body.on('click', 'td', function (e) {
var _this = $(this);
if (_this.hasClass('p_calender_month') && __.isSame(__.Date, new Date(__.Year, __.Month, _this.text()))) {
//同一天不做处理
return;
}
_.body.find('td.p_calender_selectday').removeClass('p_calender_selectday');
_this.addClass('p_calender_selectday');
_.call('click', { e: e, value: (function () {
if (_this.hasClass('p_calender_month')) {
var ret = new Date(__.Year, __.Month - 1, _this.text());
return ret;
} else if (_this.hasClass('p_calender_premonth')) {
var ret = new Date(__.Date.getTime()).add('m', -1);
ret.setDate(parseInt(_this.text()));
__.setDate(ret);
_.call('change', { Month: ret });
return ret;
} else {
var ret = new Date(__.Date.getTime()).add('m', 1);
ret.setDate(parseInt(_this.text()));
__.setDate(ret);
_.call('change', { Month: ret });
return ret;
}
})()
});
V.stopProp(e);
});
break;
case 'change':
break;
default:
_.bindEvent(_.node, k, v);
break;
}
}, function () {
_.title.click(function (e) { _.render({ value: 'today' }); V.stopProp(e); });
_.left.click(function (e) { _.render({ prev: true }); V.stopProp(e); });
_.right.click(function (e) { _.render({ next: true }); V.stopProp(e); });
_.head.append('<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>');
__.initialize(_.body, {
Date: new Date(),
onSelectDay: function (cell) { cell.className = cell.className + " p_calender_selectday"; },
onToday: function (cell) { cell.className = cell.className + " p_calender_today"; }
});
});
};
_.fill = function () { return { value: _.node.val() }; };
_.render = function (data) {
data = __.render(data);
V.forC(data, function (k, v) {
switch (k.toLowerCase()) {
case 'value':
if ('today' == v) {
if (!__.isSameMonth(__.Date, new Date())) {
__.setDate(new Date());
_.call('change', { Month: new Date(__.Date.getTime()) })
}
} else {
__.setDate(v);
}
break;
case 'prev':
if (true == v) {
__.preMonth();
_.call('change', { Month: new Date(__.Date.getTime()) });
}
break;
case 'next':
if (true == v) {
__.nextMonth();
_.call('change', { Month: new Date(__.Date.getTime()) });
}
break;
case 'points':
//todo更新成红色的点
_.body.find('td.p_calender_points').removeClass('p_calender_points');
var sb = V.sb();
V.each(v, function (v2) { sb.appendFormat('td[val={v2}],', { v2: v2 }); }, function () {
_.body.find(sb.append('td[val=a]').clear()).addClass('p_calender_points');
sb = null;
});
break;
case 'success':
//todo更新成对勾按钮
_.body.find('td.p_calender_success').removeClass('p_calender_success');
var sb = V.sb();
V.each(v, function (v2) { sb.appendFormat('td[val={v2}],', { v2: v2 }); }, function () {
_.body.find(sb.append('td[val=a]').clear()).addClass('p_calender_success');
sb = null;
});
break;
}
});
};
__.initialize = function (container, options) {
__.Container = container; //容器(table结构)
__.Days = []; //日期对象列表
__.setOptions(options);
__.Year = __.options.Year;
__.Month = __.options.Month;
__.Date = __.options.Date;
__.onSelectDay = __.options.onSelectDay;
__.onToday = __.options.onToday;
__.onFinish = __.options.onFinish;
__.Draw();
};
//设置默认属性
__.setOptions = function (options) {
__.options = V.merge({
Date: new Date(),
//默认值
Year: new Date().getFullYear(), //显示年
Month: new Date().getMonth() + 1, //显示月
onSelectDay: function (cell) { }, //在选择日期触发
onToday: function (cell) { }, //在当天日期触发
onFinish: function () { } //日历画完后触发
}, options || {});
};
__.setDate = function (d) {
if (__.isSame(__.Date, d)) { }
else if (__.isSameMonth(__.Date, d)) {
__.Container.find('td.p_calender_selectday').removeClass('p_calender_selectday');
__.Container.find('td.p_calender_month:contains("' + d.getDate() + '")').addClass('p_calender_selectday');
__.Date = d;
} else {
__.Date = d;
__.Year = d.getFullYear();
__.Month = d.getMonth() + 1;
//重新画日历
__.Draw();
}
};
//上一个月
__.preMonth = function () {
__.setDate(__.Date.add('m', -1));
};
//下一个月
__.nextMonth = function () {
__.setDate(__.Date.add('m', 1));
};
//画日历
__.Draw = function () {
//用来保存日期列表
var arr = [];
var today = new Date(new Date().toString().split(' ')[0]);
//用当月第一天在一周中的日期值作为当月离第一天的天数
for (var i = 1, firstDay = new Date(__.Year, __.Month - 1, 1).getDay(), lastDay = new Date(__.Year, __.Month - 1, 0).getDate() - firstDay; i <= firstDay; i++) { arr.push(-1 * (lastDay + i)); }
//用当月最后一天在一个月中的日期值作为当月的天数
for (var i = 1, monthDay = new Date(__.Year, __.Month, 0).getDate(); i <= monthDay; i++) { arr.push(i); }
if ((monthDay + firstDay) % 7 > 0)
for (var i = 1, firstDay = new Date(__.Year, __.Month - 1, 1).getDay(), monthDay = new Date(__.Year, __.Month, 0).getDate(); i <= 7 - ((monthDay + firstDay) % 7); i++) { arr.push("+" + i); }
var frag = document.createDocumentFragment();
__.Days = [];
while (arr.length > 0) {
//每个星期插入一个tr
var row = document.createElement("tr");
//每个星期有7天
for (var i = 1; i <= 7; i++) {
var cell = document.createElement("td");
cell.innerHTML = " ";
if (arr.length > 0) {
var d = arr.shift();
var val = parseInt(d);
if (typeof (d.indexOf) == 'undefined' && val > 0)
cell.setAttribute('val', Math.abs(val));
cell.innerHTML = V.format("<div>{val}</div>", { val: Math.abs(val) });
cell.className = val < 0 ? "p_calender_premonth" : ((d.indexOf && d.indexOf('+') >= 0) ? "p_calender_nextmonth" : "p_calender_month");
if ('p_calender_month' == cell.className) {
__.Days[d] = cell;
//判断是否今日
if (__.isSame(new Date(__.Year, __.Month - 1, d), today)) { console.log('today'); __.onToday(cell); }
//判断是否选择日期
if (__.Date && __.isSame(new Date(__.Year, __.Month - 1, d), __.Date)) { __.onSelectDay(cell); }
}
}
row.appendChild(cell);
}
frag.appendChild(row);
}
//先清空内容再插入(ie的table不能用innerHTML)
//while (__.Container.hasChildNodes()) { __.Container.removeChild(__.Container.firstChild); }
__.Container.empty()[0].appendChild(frag);
_.title.html(__.Year + " " + __.Month);
__.onFinish();
};
//判断是否同一日
__.isSame = function (d1, d2) {
return (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate());
};
//判断是否同一月
__.isSameMonth = function (d1, d2) {
return (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth());
};
});
})(VJ, VJ.view, jQuery);