| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- 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 });
|