Ext.js日历组件

本文档详细介绍了如何利用Ext.js的GridPanel构建一个日历组件,包括生成特定年份的日历表格,点击日期修改属性并改变颜色以提供用户提示。数据结构设计用于存储每个日期的状态和点击信息,同时提供了生成和组织数据的函数。最后展示了GridPanel配置和cellRenderer函数,用于展示和处理单元格的样式和提示信息。
摘要由CSDN通过智能技术生成

记录下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了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值