if (typeof wd == 'undefined') { wd = {}; } if (typeof wd.edit == 'undefined') { wd.edit = {}; } if (typeof timeRanges == 'undefined') { timeRanges = {}; } if (typeof Date.prototype.timeRangeFormat == 'undefined') { Date.prototype.timeRangeFormat = function (fmt) { //author: meizz var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "H+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; } } var today = new Date().timeRangeFormat('yyyy-MM-dd'); function isBefore(time0, time1) { try { return new Date(today + " " + time0).getTime() < new Date(today + " " + time1).getTime(); } catch (error) { return false; } } function isAfter(time0, time1) { try { return new Date(today + " " + time0).getTime() > new Date(today + " " + time1).getTime(); } catch (error) { return false; } } wd.edit.wdDateTimeRange = function (options) { var range = new TimeRange(options); console.log(range); console.log(range.id); //console.log(range.kssj.value("fff")); //console.log(JSON.stringify(range)); } function notNull(obj, msg) { if (obj == null || obj == undefined || obj == "") { throw new Error(msg || "不能为空"); } return obj; } function checkTime(timeStr) { return checkDate(today + " " + timeStr); } function checkDate(dateStr) { return dateStr == "" || !isNaN(new Date(dateStr).getTime()) } class TimeRange { constructor(option) { this.id = "TimeRange." + new Date().getTime(); timeRanges[this.id] = this; this.startName = notNull(option.startName, "找不到startName"); this.endName = notNull(option.endName, "找不到endName"); this._option = option; this.buttons = []; this.init(); } init() { this.kssj = new KssjInput(this.startName, this); this.jssj = new JssjInput(this.endName, this); var btns = this._option.button; var me = this; for (var key in btns) { var btn = btns[key]; var _name = btn.name || key; if (!checkTime(btn.start)) { console.error("开始时间有误" + btn.start); } else if (!checkTime(btn.end)) { console.error("结束时间有误" + btn.end); } me.buttons.push(new TimeRangeButton(_name, btn, me)); } console.log(this.buttons); this.buttons.sort(function (btn0, btn1) { function parseTime(time) { if (!checkTime(time)) { throw new Error("时间格式有误:“" + time + "”"); } return new Date(today + " " + time).getTime(); } var start0 = parseTime(btn0.start); var start1 = parseTime(btn1.start); var end0 = parseTime(btn0.end); var end1 = parseTime(btn1.end); var compare = start0 - start1; return compare == 0 ? (end0 - end1) : compare; }) // TODO 按钮排序 // for (var i = 0; i < this.buttons.length; i++) { // var button = this.buttons[i]; // var btn = button.buttonElement; // var ancor = document.createElement("span"); // ancor.setAttribute("ancor", button.timeRange.id + "." + i); // btn.parentNode.insertBefore(ancor, btn); // } // for (var i = 0; i + 1 < this.buttons.length; i++) { // var button = this.buttons[i]; // var btn = button.buttonElement; // var q = '[ancor="' + button.timeRange.id + "." + (i + 1) + '"]'; // console.log(q) // var ancor = document.querySelector(q); // ancor.parentNode.insertBefore(btn, ancor); // } console.log(this.buttons); this.sortButton(); this.echo() } sortButton() { } /** * 回显值 */ echo() { var k = this.kssj, j = this.jssj; // if (k.date == '' || k.time == "" || j.date == '' || j.time == "") { // return; // } this.foreachButton(function (button) { var be = !isAfter(k.time, button.start); var af = !isBefore(j.time, button.end); if (be && af) { button.check(); } else { button.unCheck(); } }) } getKssj() { return this.kssj.value(); } getJssj() { return this.jssj.value(); } getStartButton() { var result = null; this.foreachButton(function (button) { if (button.isChecked()) { result = button; return false; } }); return result; } getEndButton() { var result = null; this.foreachButtonRevise(function (button) { if (button.isChecked()) { result = button; return false; } }) return result; } foreachButton(fn) { for (var i = 0; i < this.buttons.length; i++) { if (fn.apply(this, [this.buttons[i], i]) == false) { break; } } } foreachButtonRevise(fn) { for (var i = this.buttons.length - 1; i >= 0; i--) { if (fn.apply(this, [this.buttons[i], i]) == false) { break; } } } updateInputValue() { var s = this.getStartButton(); var e = this.getEndButton(); var k = this.kssj; var j = this.jssj; k.updateDataFromInputValue(); j.updateDataFromInputValue(); if (s == null || e == null) { k.time = ""; j.time = ""; } else { var today = new Date().timeRangeFormat("yyyy-MM-dd"); if (k.date == "" && j.date == "") { k.date = today; j.date = today; } else if (j.date == "") { j.date = k.date; } else if (k.date == "") { k.date = j.date; } k.time = s.start; j.time = e.end; } k.value(new Date(k.date + " " + k.time).timeRangeFormat(this._option.format)); j.value(new Date(j.date + " " + j.time).timeRangeFormat(this._option.format)); } } class TimeRangeButton { constructor(inputName, btnOption, timeRange) { this.buttonElement = notNull(document.querySelector("[name='" + inputName + "']"), "找不到元素“" + inputName + "”"); this.id = timeRange.id + ".btn." + inputName; if (this.buttonElement.timeRange && this.buttonElement.timeRange.id != timeRange.id) { throw new Error("这个按钮已经绑定过timerange"); } var me = this; this.name = inputName; this.buttonElement.timeRange = timeRange; this.buttonElement.timeRangeButton = this; /* 改 wdValue -- 规范 wdValue= 命名。Lin this.buttonElement.setAttribute("wdValue", "range-" + inputName); */ this.buttonElement.setAttribute("ssVal", "range-" + inputName); this.buttonElement.setAttribute("timerange-id", timeRange.id); this.buttonElement.setAttribute("range-start", btnOption.start); this.buttonElement.setAttribute("range-end", btnOption.end); this.start = btnOption.start; this.end = btnOption.end; this.timeRange = timeRange; wd.edit.onoffInit('radio', inputName, '', true, null, null, function () { me.click(); }, 'edit'); var selector = "input[name='" + this.name + "'][type='hidden']"; var eles = document.querySelectorAll(selector); if (eles.length > 1) { console.error("有多个元素:" + selector) } this.onoffelement = notNull(eles[0]); } unCheckOthers() { var me = this; this.timeRange.foreachButton(function (button) { if (button != me) { button.unCheck(); } else if (!me.isChecked()) { button.check(); } }); } unCheck() { wd.edit.onoffEdit(this.name, "off"); } check() { if (!this.isChecked()) { wd.edit.onoffEdit(this.name, "range-" + this.name); } } click() { var s = this.timeRange.getStartButton(); var e = this.timeRange.getEndButton(); if (s != e) { var si = s.indexOfButtons(); var ei = e.indexOfButtons(); var startcheck = false; var resetOthers = false; this.timeRange.foreachButton(function (button) { if (button == s) { startcheck = true; return; } else if (button == e) { return false; } if (startcheck && !button.isChecked()) { resetOthers = true; return false; } }); if (resetOthers) { this.unCheckOthers(); } } this.timeRange.updateInputValue(); } indexOfButtons() { return this.timeRange.buttons.indexOf(this); } prevButton() { return this.timeRange.buttons[this.indexOfButtons() - 1]; } nextButton() { return this.timeRange.buttons[this.indexOfButtons() + 1]; } isChecked() { return this.onoffelement.value == "range-" + this.name; } } class TimeRangeInput { constructor(inputName, timeRange) { var me = this; this.id = timeRange.id + ".input." + inputName; this.inputName = inputName; this.inputElement = notNull(document.querySelector("[name='" + inputName + "']"), "找不到元素" + inputName); this.inputElement.setAttribute("timerange-id", timeRange.id); this.timeRange = timeRange; this.updateDataFromInputValue(); this.inputElement.addEventListener("focus", function () { me.updateDataFromInputValue(); me.timeRange.echo(); }); this.inputElement.addEventListener("blur", function () { me.updateDataFromInputValue(); me.timeRange.echo(); }); } updateDataFromInputValue() { var val = this.inputElement.value; var date = "", time = ""; if (val.match(/(\d{4}-\d{2}-\d{2})?\s*?(\d{2}:\d{2}(:\d{2})?)?/)) { if (checkDate(val)) { date = val.replace(/\s*(\d{2}:\d{2}(:\d{2})?)/, ""); time = val.replace(/(\d{4}-\d{2}-\d{2})\s*/, ""); } else { console.error(this.inputName + " “" + val + "” 不是个日期"); this.value(""); } } this.date = date; this.time = time; this.inputElement.setAttribute("range-date", date); this.inputElement.setAttribute("range-time", time); } value(value) { var r = this.inputElement.value; if (value != null) { if (checkDate(value)) { this.inputElement.value = value; this.updateDataFromInputValue(); } else { throw new Error(" “" + value + "” 不是个日期") } } return r; } } class KssjInput extends TimeRangeInput { constructor(inputName, inputRange) { super(inputName, inputRange); this.type = "KSSJ"; } isKssj() { return true; } isJssj() { return false; } } class JssjInput extends TimeRangeInput { constructor(inputName, inputRange) { super(inputName, inputRange); this.type = "KSSJ"; } isKssj() { return false; } isJssj() { return true; } } Object.defineProperty(TimeRangeButton, "timeRange", { enumerable: false }); Object.defineProperty(TimeRangeButton, "buttonElement", { enumerable: false }); Object.defineProperty(TimeRangeInput, "timeRange", { enumerable: false }); Object.defineProperty(TimeRangeInput, "inputElement", { enumerable: false });