记录下Ext.js的日历组件的需求
1.通过js生成某年份的日历表格
2.点击表格可以修改该日期的某属性且变色给予客户相应的提示信息。
分析:打算采用Ext.js原生的GridPanel作为表格UI,因此只需要构造对应的数据结构格式即可。最终效果如下:
构造这样的表格在该Grid中需要的表头定义为
columns: [{
header: 年月月,
align: 'left',
columns: [
{
text: '星期一', dataIndex: 'mon', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期二', dataIndex: 'tus', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期三', dataIndex: 'wed', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期四', dataIndex: 'thu', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期五', dataIndex: 'fri', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期六', dataIndex: 'sat', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期日', dataIndex: 'sun', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
}
],
}],
与上列表头对应的数据格式即为
[
{
"mon": 1,
"tus": 2,
"wed": 3,
"thu": 4,
"fri": 5,
"sat": 6,
"sun": 7,
},
{
"mon": 8,
"tus": 9,
"wed": 10,
"thu": 11,
"fri": 12,
"sat": 13,
"sun": 14,
}
]
但是如果还需要给grid的每一个cell进行判断值改变状态进行渲染亮色的话该数据结构是不足以满足的,因此定义如下数据结构格式
val为dayOfMonth的值,key为formatDate格式,status记录是工作日和非工作日,isClick记录当前是否发生更改
[
{
"mon": {
"val": 1,
"key": "2029-01-01",
"status": 1,
"isClick": 0
},
"tus": {
"val": 2,
"key": "2029-01-02",
"status": 1,
"isClick": 0
},
"wed": {
"val": 3,
"key": "2029-01-03",
"status": 1,
"isClick": 0
},
"thu": {
"val": 4,
"key": "2029-01-04",
"status": 1,
"isClick": 0
},
"fri": {
"val": 5,
"key": "2029-01-05",
"status": 1,
"isClick": 0
},
"sat": {
"val": 6,
"key": "2029-01-06",
"status": 0,
"isClick": 0
},
"sun": {
"val": 7,
"key": "2029-01-07",
"status": 0,
"isClick": 0
},
"month": "2029-01"
}
]
该数据生成函数如下所示:
generateDataArr: function (year) {
if (typeof year == 'undefined') {
return [];
}
var me = this;
var dateArr = [];
for (var i = 1; i <= 12; i++) {
var minDate = Ext.Date.parseDate(year +
"-" + XEQJS.common.Util.padLeft(i + "", 2, "0") +
"-01", "Y-m-d");
var maxDate = Ext.Date.add(Ext.Date.add(minDate, Ext.Date.MONTH, 1), Ext.Date.DAY, -1);
var tempDate = minDate;
var obj = {
"mon": {},
"tus": {},
"wed": {},
"thu": {},
"fri": {},
"sat": {},
"sun": {},
"month": Ext.Date.format(minDate, 'Y-m'),
};
for (var j = 1; j <= maxDate.getDate(); j++) {
var el = {
"val": tempDate.getDate(),
"key": Ext.Date.format(tempDate, 'Y-m-d'),
"status": 0,
"isClick":0,//当前单元格是否点击进行修改,0未点击,1点击
}
switch (tempDate.getDay()) {
case 1:
el.status = 1;
Ext.apply(obj.mon, el);
break;
case 2:
el.status = 1;
Ext.apply(obj.tus, el);
break;
case 3:
el.status = 1;
Ext.apply(obj.wed, el);
break;
case 4:
el.status = 1;
Ext.apply(obj.thu, el);
break;
case 5:
el.status = 1;
Ext.apply(obj.fri, el);
break;
case 6:
Ext.apply(obj.sat, el);
break;
case 0:
Ext.apply(obj.sun, el);
break;
}
if (tempDate.getDay() == 0 || Ext.Date.format(tempDate, 'Y-m-d') == Ext.Date.format(maxDate, 'Y-m-d')) {
dateArr.push(obj);
obj = {
"mon": {},
"tus": {},
"wed": {},
"thu": {},
"fri": {},
"sat": {},
"sun": {},
"month": Ext.Date.format(minDate, 'Y-m'),
};
}
tempDate = Ext.Date.add(tempDate, Ext.Date.DAY, 1);
}
}
return dateArr;
}
12个月的日历数据全部生成完毕,但是我们按照月份进行生成还需进行更改归类每个月份,代码如下:
regularCalendarDateCollect: function (dateArr) {
var regularCollect = new Map();
for (var i = 0; i < dateArr.length; i++) {
collector = regularCollect.get(dateArr[i].month);
if (typeof collector == 'undefined' || collector == null) {
var dates = [];
regularCollect.set(dateArr[i].month, dates);
collector = regularCollect.get(dateArr[i].month);
}
collector.push(dateArr[i]);
}
return regularCollect;
},
Grid与store模板如下:
CalendarTemplateGrid: function (obj) {
var me=this;
var curMonthDayStore = Ext.create('Ext.data.Store', {
fields: ['mon', 'tus', 'wed', 'thu', 'fri', 'sat', 'sun'],
data: {'root': obj.datesArr},
proxy: {
type: 'memory',
reader: {
type: 'json',
root: 'root'
}
}
});
var curMonthDayPanel = Ext.create('Ext.grid.Panel', {
margin: '5 0 5 0',
columnWidth: 0.25,
autoScroll: true,
store: curMonthDayStore,
disabled:true,
forceFit: true,
selModel: {
selType: 'cellmodel'
},
selType: 'cellmodel',
columns: [{
header: obj.month,
align: 'left',
columns: [
{
text: '星期一', dataIndex: 'mon', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期二', dataIndex: 'tus', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期三', dataIndex: 'wed', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期四', dataIndex: 'thu', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期五', dataIndex: 'fri', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期六', dataIndex: 'sat', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
},
{
text: '星期日', dataIndex: 'sun', align: 'center', width: "10%",
renderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
return me.cellRenderer(value, metaData, record, rowIndex, colIndex, store,view)
}
}
],
}],
listeners: {
cellclick: function (grid, td, cellIndex, record, tr, rowIndex, e, eOpts) {
}
}
});
return curMonthDayPanel;
},
cellRenderer: function (value, metaData, record, rowIndex, colIndex, store,view) {
Ext.tip.QuickTipManager.init();
if (value.status == 1) {
metaData.tdAttr = " data-qtip = '"+value.key+"'";
metaData.tdCls="a";
}else if(value.status == 0){
metaData.tdAttr = " data-qtip = '"+value.key+"'";
}
if(value.isClick == 1){
metaData.tdAttr = " data-qtip = '"+value.key+"本次变更'";
metaData.tdCls="b";
}
return value.val;
},
.x-grid-cell.a
{
background-color: #7fd09a;
}
.x-grid-cell.b
{
background-color: #69efc5;
}
.x-grid-cell.c
{
background-color: rgba(132, 141, 136, 0.82);
}
放一起即可组装出一个日历gridPanel了