| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- mbui.define(['tool'], function (exports) {
- let tool = mbui.tool;
- var settings = {
- mode: "month",
- weekMode: ["一", "二", "三", "四", "五", "六", "日"],
- newDate: new Date(),
- width: null,
- height: null,
- shwoLunar: false,
- showModeBtn: true,
- showEvent: true,
- success: function (today) {
- console.log(today);
- },
- mark: function (start_date, end_date) {
- console.log(start_date);
- console.log(end_date);
- }
- };
- var Calendar = {
- init: function () {
- var me = this, el = me.el, opts = me.options;
- el.addClass("calendar");
- opts.width = el.width();
- opts.height = el.height();
- typeof (opts.newDate) == "string" ? opts.newDate = me._getDateByString(opts.newDate) : "";
- me._createCalendar();
- //绑定事件
- //changeMode
- el.on("click", ".calendar-mode-select .btn", function (e) {
- e.stopPropagation();
- var modeText = $(this).text();
- var mode = modeText == "月" ? "month" : "year";
- me.changeMode(mode);
- })
- //calendar-cell日期点击事件
- el.on("click", ".calendar-cell", function (e) {
- e.stopPropagation();
- $(".dropdown-month").removeClass("open");
- $(".dropdown-year").removeClass("open");
- var cellDate = $(this).attr("title");
- var viewData = me.viewData;
- var year = parseInt(cellDate.split("年")[0]);
- var month = parseInt(cellDate.split("年")[1].split("月")[0]) - 1;
- var date = parseInt(cellDate.split("年")[1].split("月")[1].split("日")[0]);
- if (opts.mode == "year") {
- if (opts.cellClick) opts.cellClick(year + '-' + (month + 1))
- }
- else if (opts.mode == "month" && month == opts.newDate.getMonth()) {
- if (me.options.cellClick) me.options.cellClick(year + '-' + (month + 1) + '-' + date);
- }
- })
- //年份下拉
- el.on("click", ".calendar-year-select", function (e) {
- e.stopPropagation();
- $(".dropdown-month").removeClass("open");
- $(".dropdown-year").toggleClass("open");
- //创建下拉数据
- var yearText = opts.newDate.getFullYear();
- var s = '';
- for (var i = 0; i < 21; i++) {
- if (i == 10) {
- s += '<li class="year-item active">'
- }
- else {
- s += '<li class="year-item">'
- }
- s += '<span class="year-check">' + (yearText - 10 + i) + '</span>'
- s += '<span >年</span>'
- s += '</li>'
- }
- me.el.find(".dropdown-year").html(s);
- })
- //上一月
- el.on("click", ".calendar-pre", function (e) {
- e.stopPropagation();
- var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1;
- month--;
- if (month < 1) {
- year = year - 1;
- month = 12;
- }
- opts.newDate.setFullYear(year);
- var beforeDate = opts.newDate.getDate();
- opts.newDate.setMonth(month - 1);
- var afterDate = opts.newDate.getDate();
- //处理日期30号,切换到2月不存在30号
- if (beforeDate != afterDate) {
- opts.newDate.setDate(opts.newDate.getDate() - 1);
- }
- opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
- $(".calendar-month-text").text(month + "月");
- $(".calendar-year-text").text(year + "年");
- })
- //下一月
- el.on("click", ".calendar-next", function (e) {
- e.stopPropagation();
- var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1;
- month++;
- if (month > 12) {
- year = year + 1;
- month = 1;
- }
- opts.newDate.setFullYear(year);
- var beforeDate = opts.newDate.getDate();
- opts.newDate.setMonth(month - 1);
- var afterDate = opts.newDate.getDate();
- //处理日期30号,切换到2月不存在30号
- if (beforeDate != afterDate) {
- opts.newDate.setDate(opts.newDate.getDate() - 1);
- }
- opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
- $(".calendar-month-text").text(month + "月");
- $(".calendar-year-text").text(year + "年");
- })
- //年份改变
- el.on("click", ".year-item", function (e) {
- e.stopPropagation();
- $(".dropdown-year").removeClass("open");
- var yearText = $(this).text();
- var yearNum = yearText.split("年")[0];
- if (yearNum == opts.newDate.getFullYear()) return;
- opts.newDate.setFullYear(yearNum);
- opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
- $(".calendar-year-text").text(yearText);
- })
- //月份下拉
- el.on("click", ".calendar-month-select", function (e) {
- e.stopPropagation();
- $(".dropdown-year").removeClass("open");
- $(".dropdown-month").toggleClass("open");
- })
- //月份改变
- el.on("click", ".month-item", function (e) {
- e.stopPropagation();
- $(".dropdown-month").removeClass("open");
- var monthText = $(this).text();
- var monthNum = monthText.split("月")[0];
- if (monthNum == (opts.newDate.getMonth() + 1)) return;
- var beforeDate = opts.newDate.getDate();
- opts.newDate.setMonth(monthNum - 1);
- var afterDate = opts.newDate.getDate();
- //处理日期30号,切换到2月不存在30号
- if (beforeDate != afterDate) {
- opts.newDate.setDate(opts.newDate.getDate() - 1);
- }
- me._refreshCalendar(opts.newDate);
- $(".calendar-month-text").text(monthText);
- })
- $(document.body).on("click", function (e) {
- $(".dropdown-month").removeClass("open");
- $(".dropdown-year").removeClass("open");
- })
- },
- //公开方法
- changeMode: function (mode) {
- var me = this;
- if (mode == me.options.mode) return;
- me.options.mode = mode;
- me._createCalendar();
- },
- getViewDate: function (viewDate) {
- var me = this, opts = me.options, mode = opts.mode, data = opts.data;
- if (!data || data.length == 0) return [];
- var viewData = {}, modeYear = viewDate.getFullYear(), modeMonth = null;
- if (mode == "month") { modeMonth = viewDate.getMonth() };
- //筛选视图数据并转化未对象 要不要转化为属性
- for (var i = 0; i < data.length; i++) {
- var item = data[i];
- var start = me._getDateByString(item.startDate);
- var year = start.getFullYear();
- var month = start.getMonth();
- var date = start.getDate();
- if (modeMonth && year == modeYear && modeMonth == month) {
- if (!viewData[date]) viewData[date] = [];
- viewData[date].push(item);
- }
- else if (!modeMonth && year == modeYear) {
- if (!viewData[month]) viewData[month] = [];
- viewData[month].push(item);
- }
- }
- return viewData;
- },
- _getDateByString: function (stringDate) {
- var me = this;
- var year = stringDate.split("-")[0];
- var month = parseInt(stringDate.split("-")[1]) - 1;
- var date = stringDate.split("-")[2];
- return new Date(year, month, date);
- },
- //私有方法
- _createCalendar: function () {
- var me = this;
- var dateMode = me.options.mode;
- me._createView();
- },
- _createView: function () {
- var me = this, el = me.el, opts = me.options, mode = opts.mode, newDate = opts.newDate, html = '';
- html += me._createToolbar();
- html += '<div class="calendar-body">';
- html += '<table class="calendar-table" cellspacing="0">'
- if (mode == "month") {
- html += me._createHeader();
- }
- html += me._createBody();
- html += '</table>'
- html += '</div>'
- el.html(html);
- if (mode == "month") {
- me._refreshCalendar(newDate);
- }
- else {
- me._refreshYearCalendar(newDate);
- }
- if (me.options.success) me.options.success(newDate);
- },
- _createToolbar: function () {
- var me = this, newDare = me.options.newDate, mode = me.options.mode, showModeBtn = me.options.showModeBtn, s = '';
- var year = newDare.getFullYear();
- var month = newDare.getMonth() + 1;
- s += '<div class="calendar-header">'
- s += '<div class="calendar-select calendar-year-select" >'
- s += '<span class="calendar-year-text"> ' + year + '年</span >'
- s += '<ul id="dropdown-year" class="dropdown-year">'
- s += '</ul>'
- s += '</div> '
- if (mode == "month") {
- s += '<div class="calendar-select calendar-month-select">'
- s += '<span class="calendar-month-text"> ' + month + '月</span >'
- //创建月份下拉
- s += '<ul class="dropdown-month">'
- for (var i = 1; i <= 12; i++) {
- s += '<li class="month-item">'
- s += '<span class="month-check">' + i + '</span>'
- s += '<span >月</span>'
- s += '</li>'
- }
- s += '</ul>'
- s += '</div > '
- }
- if (showModeBtn) {
- s += '<div class="calendar-select calendar-mode-select">'
- s += '<div class="btn-group">'
- if (mode == "month") {
- s += '<span class="btn calendar-select-active">月</span>'
- s += '<span class="btn">年</span>'
- }
- else {
- s += '<span class="btn">月</span>'
- s += '<span class="btn calendar-select-active">年</span>'
- }
- s += '</div>'
- s += '</div>'
- }
- s += '<i class="fa-angle-left calendar-pre"></i><i class="fa-angle-right calendar-next"></i>'
- s += '</div>'
- return s;
- },
- _createHeader: function () {
- var me = this, opts = me.options, weekMode = opts.weekMode;
- var s = '<thead><tr>'
- weekMode.forEach(function (item) {
- s += ' <th class="calendar-column-header" title="周' + item + '"><span class="calendar-column-header-inner">' + item + '</span></th>'
- })
- s += '</thead></tr>'
- return s;
- },
- _createBody: function () {
- var me = this;
- var s = ' <tbody class="calendar-tbody">'
- s += '</tbody>'
- return s;
- },
- _refreshYearCalendar: function (newDate) {
- var me = this, showEvent = me.options.showEvent, s = '';
- //每次都重新获取会不会影响性能
- me.viewData = viewData = me.getViewDate(newDate);
- var year = newDate.getFullYear(), month = newDate.getMonth();
- //四行三列
- for (var i = 0; i < 4; i++) {
- s += '<tr>'
- for (var l = 0; l < 3; l++) {
- renderMonth = i * 3 + l;
- if (month == renderMonth) {
- s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell calendar-thisMonth">';
- }
- else {
- s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell">';
- }
- s += '<div class="calendar-date">';
- s += '<div class="calendar-value">' + (renderMonth + 1) + '月';
- if (showEvent && viewData[renderMonth]) {
- if (viewData[renderMonth].length > 0) {
- s += '<div class="calendar-event"></div>';
- }
- }
- s += '</div>';
- s += '</div></td>';
- }
- s += '</tr>'
- }
- me.el.find(".calendar-tbody").html(s);
- },
- _refreshCalendar: function (newDate) {
- var me = this, showEvent = me.options.showEvent, s = '';
- me.viewData = viewData = me.getViewDate(newDate);
- var _newDate = me._cloneDate(newDate);
- //当前date
- var nowNum = _newDate.getDate();
- //第一天周几
- _newDate.setDate(1);
- var weekDay = _newDate.getDay() == 0 ? 7 : _newDate.getDay();
- //视图第一天
- var viewDate = me._cloneDate(_newDate);
- viewDate.setDate(viewDate.getDate() - weekDay + 1);
- //当前第几周/行 (暂不处理)
- var spileDate = (newDate.getTime() - viewDate.getTime()) / (1000 * 60 * 60 * 24);
- renderDate = me._cloneDate(viewDate);
- var start_date, end_date;
- //固定六行
- for (var i = 0; i < 6; i++) {
- s += '<tr>'
- for (var l = 0; l < 7; l++) {
- var year = renderDate.getFullYear();
- var month = renderDate.getMonth() + 1;
- var date = renderDate.getDate();
- if (i == 0 && l == 0) {
- start_date = year + '-' + month + '-' + date;
- }
- end_date = year + '-' + month + '-' + date;
- if (renderDate.getMonth() < newDate.getMonth()) {
- s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-last-month-cell">';
- }
- else if (renderDate.getMonth() > newDate.getMonth()) {
- s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-next-month-cell">';
- }
- else if (date == nowNum) {
- s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-today">';
- }
- else {
- s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell">';
- }
- s += '<div class="calendar-date">';
- s += '<div class="calendar-value">' + date;
- if (showEvent && viewData[date] && renderDate.getMonth() == newDate.getMonth()) {
- if (viewData[date].length > 0) {
- s += '<div class="calendar-event"></div>';
- }
- }
- s += '</div>';
- s += '</div></td>';
- renderDate.setDate(renderDate.getDate() + 1);
- }
- s += '</tr>'
- }
- me.el.find(".calendar-tbody").html(s);
- if (me.options.mark) me.options.mark(start_date, end_date);
- },
- _cloneDate: function (date) {
- return new Date(date.getFullYear(), date.getMonth(), date.getDate());
- }
- }
- var calendar = function (element, options) {
- Calendar.el = $('#' + element);
- Calendar.options = $.extend(true, {}, settings, options);
- Calendar.init();
- }
- // 输出接口
- exports('calendar', calendar);
- });
|