ExtJs 날짜 컨트롤 추가 시간
/*******************************************************************************
* CONSTRUCTOR ****** Parameters: as per Ext.DatePicker
******************************************************************************/
DatetimePicker = function(config) {
/** Call superclass constructor * */
DatetimePicker.superclass.constructor.call(this, config);
};
Ext.extend(DatetimePicker, Ext.DatePicker, {
/**
* Method Name: onRender Description: as per Ext.DatePicker's onRender,
* except renders year in its own cell with arrow-changers in additional
* columns Parameters: as per Ext.DatePicker's onRender Returns: n/a Throws:
* n/a
*/
selectToday : function() {
this.setValue(new Date().clearTime());
var val1 = this.value;
val1.setHours(this.theHours);
val1.setMinutes(this.theMinutes);
this.fireEvent("select", this, val1);
},
handleDateClick : function(e, t) {
e.stopEvent();
if (t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")) {
this.setValue(new Date(t.dateValue));
var val1 = this.value;
val1.setHours(this.theHours);
val1.setMinutes(this.theMinutes);
this.fireEvent("select", this, val1);
}
},
onRender : function(container, position) {
var m = [
'<table cellspacing="0">',
'<tr><td colspan="3"><table cellspacing="0" width="100%"><tr><td class="x-date-left"><a href="#" title="',
this.prevText,
'"> </a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="',
this.nextText, '"> </a></td></tr></table></td></tr>',
'<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'];
var dn = this.dayNames;
for (var i = 0; i < 7; i++) {
var d = this.startDay + i;
if (d > 6) {
d = d - 7;
}
m.push("<th><span>", dn[d].substr(0, 1), "</span></th>");
}
m[m.length] = "</tr></thead><tbody><tr>";
for (i = 0; i < 42; i++) {
if (i % 7 === 0 && i !== 0) {
m[m.length] = "</tr><tr>";
}
m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';
}
m[m.length] = '</tr></tbody></table></td></tr><tr><td class="minutecss"><table cellspacing="0" ><tr>';
m[m.length] = '<td class="y-hour-left"><a href="#" title="down"> </a></td><td class="y-hour-middle" align="center"></td><td class="y-hour-right"><a href="#" title="up"> </a></td>';
m[m.length] = '<td class="y-minute-left"><a href="#" title="down"> </a></td><td class="y-minute-middle" align="center"></td><td class="y-minute-right"><a href="#" title="up"> </a></td>';
m[m.length] = '</tr></table></td><td colspan="2" class="x-date-bottom" align="center"></td></tr></table><div class="x-date-mp"></div>';
var el = document.createElement("div");
el.className = "x-date-picker";
el.innerHTML = m.join("");
container.dom.insertBefore(el, position);
this.el = Ext.get(el);
this.eventEl = Ext.get(el.firstChild);
new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {
handler : this.showPrevMonth,
scope : this,
preventDefault : true,
stopDefault : true
});
new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {
handler : this.showNextMonth,
scope : this,
preventDefault : true,
stopDefault : true
});
new Ext.util.ClickRepeater(this.el.child("td.y-hour-left a"), {
handler : function() {
if (this.theHours > 0) {
this.theHours--;
this.theHours = this.theHours % 24;
var txt = '';
if (this.theHours < 10) {
txt = '0' + this.theHours;
} else {
txt = this.theHours;
}
this.hourLabel.update(txt + ' ');
}
}.createDelegate(this),
scope : this
});
new Ext.util.ClickRepeater(this.el.child("td.y-hour-right a"), {
handler : function() {
this.theHours++;
this.theHours = this.theHours % 24;
var txt = '';
if (this.theHours < 10) {
txt = '0' + this.theHours;
} else {
txt = this.theHours;
}
this.hourLabel.update(txt + ' ');
}.createDelegate(this),
scope : this
});
new Ext.util.ClickRepeater(this.el.child("td.y-minute-left a"), {
handler : function() {
if (this.theMinutes > 0) {
this.theMinutes--;
this.theMinutes = this.theMinutes % 60;
var txt = '';
if (this.theMinutes < 10) {
txt = '0' + this.theMinutes;
} else {
txt = this.theMinutes;
}
this.minuteLabel.update(txt + ' ');
}
}.createDelegate(this),
scope : this
});
new Ext.util.ClickRepeater(this.el.child("td.y-minute-right a"), {
handler : function() {
this.theMinutes++;
this.theMinutes = this.theMinutes % 60;
var txt = '';
if (this.theMinutes < 10) {
txt = '0' + this.theMinutes;
} else {
txt = this.theMinutes;
}
this.minuteLabel.update(txt + ' ');
}.createDelegate(this),
scope : this
});
this.eventEl.on("mousewheel", this.handleMouseWheel, this);
this.monthPicker = this.el.down('div.x-date-mp');
this.monthPicker.enableDisplayMode('block');
var kn = new Ext.KeyNav(this.eventEl, {
"left" : function(e) {
e.ctrlKey ? this.showPrevMonth() : this
.update(this.activeDate.add("d", -1));
},
"right" : function(e) {
e.ctrlKey ? this.showNextMonth() : this
.update(this.activeDate.add("d", 1));
},
"up" : function(e) {
e.ctrlKey ? this.showNextYear() : this
.update(this.activeDate.add("d", -7));
},
"down" : function(e) {
e.ctrlKey ? this.showPrevYear() : this
.update(this.activeDate.add("d", 7));
},
"pageUp" : function(e) {
this.showNextMonth();
},
"pageDown" : function(e) {
this.showPrevMonth();
},
"enter" : function(e) {
e.stopPropagation();
return true;
},
scope : this
});
this.eventEl.on("click", this.handleDateClick, this, {
delegate : "a.x-date-date"
});
this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday,
this);
this.el.unselectable();
this.cells = this.el.select("table.x-date-inner tbody td");
this.textNodes = this.el.query("table.x-date-inner tbody span");
this.mbtn = new Ext.Button({
text : " ",
tooltip : this.monthYearText,
renderTo : this.el.child("td.x-date-middle", true)
});
this.mbtn.on('click', this.showMonthPicker, this);
this.mbtn.el.child(this.mbtn.menuClassTarget)
.addClass("x-btn-with-menu");
var dt1 = new Date();
var txt = '';
this.hourLabel = this.el.child("td.y-hour-middle");
this.theHours = dt1.getHours();
if (this.theHours < 10) {
txt = '0' + this.theHours;
} else {
txt = this.theHours;
}
this.hourLabel.update(txt + ' ');
this.minuteLabel = this.el.child("td.y-minute-middle");
this.theMinutes = dt1.getMinutes();
if (this.theMinutes < 10) {
txt = '0' + this.theMinutes;
} else {
txt = this.theMinutes;
}
this.minuteLabel.update(txt + ' ');
var today = (new Date()).dateFormat(this.format);
var todayBtn = new Ext.Button({
renderTo : this.el.child("td.x-date-bottom", true),
text : String.format(this.todayText, today),
tooltip : String.format(this.todayTip, today),
handler : this.selectToday,
scope : this
});
if (Ext.isIE) {
this.el.repaint();
}
this.update(this.value);
},
/**
* Method Name: update Description: as per Ext.DatePicker's update, except
* updates year label in its own cell Parameters: as per Ext.DatePicker's
* update Returns: n/a Throws: n/a
*/
update : function(date) {
var vd = this.activeDate;
this.activeDate = date;
if (vd && this.el) {
var t = date.getTime();
if (vd.getMonth() == date.getMonth()
&& vd.getFullYear() == date.getFullYear()) {
this.cells.removeClass("x-date-selected");
this.cells.each(function(c) {
if (c.dom.firstChild.dateValue == t) {
c.addClass("x-date-selected");
setTimeout(function() {
try {
c.dom.firstChild.focus();
} catch (e) {
}
}, 50);
return false;
}
});
return;
}
}
var days = date.getDaysInMonth();
var firstOfMonth = date.getFirstDateOfMonth();
var startingPos = firstOfMonth.getDay() - this.startDay;
if (startingPos <= this.startDay) {
startingPos += 7;
}
var pm = date.add("mo", -1);
var prevStart = pm.getDaysInMonth() - startingPos;
var cells = this.cells.elements;
var textEls = this.textNodes;
days += startingPos;
// convert everything to numbers so it's fast
var day = 86400000;
var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart))
.clearTime();
var today = new Date().clearTime().getTime();
var sel = date.clearTime().getTime();
var min = this.minDate
? this.minDate.clearTime()
: Number.NEGATIVE_INFINITY;
var max = this.maxDate
? this.maxDate.clearTime()
: Number.POSITIVE_INFINITY;
var ddMatch = this.disabledDatesRE;
var ddText = this.disabledDatesText;
var ddays = this.disabledDays ? this.disabledDays.join("") : false;
var ddaysText = this.disabledDaysText;
var format = this.format;
var setCellClass = function(cal, cell) {
cell.title = "";
var t = d.getTime();
cell.firstChild.dateValue = t;
if (t == today) {
cell.className += " x-date-today";
cell.title = cal.todayText;
}
if (t == sel) {
cell.className += " x-date-selected";
setTimeout(function() {
try {
cell.firstChild.focus();
} catch (e) {
}
}, 50);
}
// disabling
if (t < min) {
cell.className = " x-date-disabled";
cell.title = cal.minText;
return;
}
if (t > max) {
cell.className = " x-date-disabled";
cell.title = cal.maxText;
return;
}
if (ddays) {
if (ddays.indexOf(d.getDay()) != -1) {
cell.title = ddaysText;
cell.className = " x-date-disabled";
}
}
if (ddMatch && format) {
var fvalue = d.dateFormat(format);
if (ddMatch.test(fvalue)) {
cell.title = ddText.replace("%0", fvalue);
cell.className = " x-date-disabled";
}
}
};
var i = 0;
for (; i < startingPos; i++) {
textEls[i].innerHTML = (++prevStart);
d.setDate(d.getDate() + 1);
cells[i].className = "x-date-prevday";
setCellClass(this, cells[i]);
}
for (; i < days; i++) {
intDay = i - startingPos + 1;
textEls[i].innerHTML = (intDay);
d.setDate(d.getDate() + 1);
cells[i].className = "x-date-active";
setCellClass(this, cells[i]);
}
var extraDays = 0;
for (; i < 42; i++) {
textEls[i].innerHTML = (++extraDays);
d.setDate(d.getDate() + 1);
cells[i].className = "x-date-nextday";
setCellClass(this, cells[i]);
}
this.mbtn.setText(this.monthNames[date.getMonth()] + " "
+ date.getFullYear());
if (this.theHours < 10) {
txt = '0' + this.theHours;
} else {
txt = this.theHours;
}
this.hourLabel.update(txt + ' ');
if (this.theMinutes < 10) {
txt = '0' + this.theMinutes;
} else {
txt = this.theMinutes;
}
this.minuteLabel.update(txt + ' ');
if (!this.internalRender) {
var main = this.el.dom.firstChild;
var w = main.offsetWidth;
this.el.setWidth(w + this.el.getBorderWidth("lr"));
Ext.fly(main).setWidth(w);
this.internalRender = true;
// opera does not respect the auto grow header center column
// then, after it gets a width opera refuses to recalculate
// without a second pass
if (Ext.isOpera && !this.secondPass) {
main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth + main.rows[0].cells[2].offsetWidth))
+ "px";
this.secondPass = true;
this.update.defer(10, this, [date]);
}
}
},
/** *** Public Instance Variables **** */
/**
* Variable Name: nextYearText, prevYearText Description: Hover text for the
* previous year and next year arrow changers Default: as shown Type: string
*/
nextYearText : 'Next Year (Control+Up)',
prevYearText : 'Previous Year (Control+Down)'
});
/**
* Class Name: DatetimeItem Inherits From: Ext.menu.Adapter Contains:
* DatetimePicker Purpose: Effectively overrides Ext.menu.DateItem so that it
* contains DatetimePicker instead of Ext.DatePicker Note: ORIGINAL and NEW
* comments are used to denote what differs from Ext.menu.DateItem
*/
DatetimeItem = function(config) {
// ORIGINAL:
// Ext.menu.DateItem.superclass.constructor.call(this, new
// Ext.DatePicker(config), config);
// NEW:
DatetimeItem.superclass.constructor.call(this, new DatetimePicker(config),
config);
// END NEW
this.picker = this.component;
this.addEvents({
select : true
});
this.picker.on("render", function(picker) {
picker.getEl().swallowEvent("click");
picker.container.addClass("x-menu-date-item");
});
this.picker.on("select", this.onSelect, this);
};
Ext.extend(DatetimeItem, Ext.menu.Adapter, {
onSelect : function(picker, date) {
this.fireEvent("select", this, date, picker);
// ORIGINAL:
// Ext.menu.DateItem.superclass.handleClick.call(this);
// NEW:
DatetimeItem.superclass.handleClick.call(this);
// END NEW
}
});
/**
* Class Name: DatetimeMenu Inherits From: Ext.menu.Menu Contains: DatetimeItem
* Purpose: Effectively overrides Ext.menu.DateMenu so that it contains
* DatetimeItem instead of Ext.menu.DateItem Note: ORIGINAL and NEW comments are
* used to denote what differs from Ext.menu.DateMenu
*/
DatetimeMenu = function(config) {
// ORIGINAL:
// Ext.menu.DateMenu.superclass.constructor.call(this, config);
// this.plain = true;
// var di = new Ext.menu.DateItem(config);
// NEW:
DatetimeMenu.superclass.constructor.call(this, config);
this.plain = true;
var di = new DatetimeItem(config);
// END NEW
this.add(di);
this.picker = di.picker;
this.relayEvents(di, ["select"]);
};
Ext.extend(DatetimeMenu, Ext.menu.Menu);
사용 방법:
var datetime = new Ext.form.DateField({
fieldLabel: 'time',
name: 'planbegintime',
format:'Y-m-d H:i',
menu:new DatetimeMenu()
})
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ExtJS 3.2 학습 노트(3) 사용자 정의 이벤트Extjs에서 모든 상속은 Ext.util에서 합니다.Observable 클래스의 컨트롤은 이벤트를 지원할 수 있습니다. 클래스에 대해 이벤트를 사용자 정의하려면 다음 절차를 따르십시오. 1, 먼저 클래스를 정의합니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.