diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 2d22783cb..0793db796 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,6 +1,7 @@ 7.5.6 - Internationalized Calendar templates - fixed: exporting as HTML leaks sessions for inaccessible assets, + - new YUI based date picker 7.5.5 - fixed: Several typos in the new Calendar help documentation. diff --git a/lib/WebGUI/Form/Date.pm b/lib/WebGUI/Form/Date.pm index 63a77f5df..4ee9ad69d 100644 --- a/lib/WebGUI/Form/Date.pm +++ b/lib/WebGUI/Form/Date.pm @@ -193,32 +193,23 @@ sub toHtml { # NOTE: Cannot fix time zone since we don't have a complete date/time } - my $language = WebGUI::International->new($self->session)->getLanguage($self->session->user->profileField("language"),"languageAbbreviation"); - unless ($language) { - $language = WebGUI::International->new($self->session)->getLanguage("English","languageAbbreviation"); - } - $self->session->style->setScript($self->session->url->extras('calendar/calendar.js'),{ type=>'text/javascript' }); - $self->session->style->setScript($self->session->url->extras('calendar/lang/calendar-'.$language.'.js'),{ type=>'text/javascript' }); - $self->session->style->setScript($self->session->url->extras('calendar/calendar-setup.js'),{ type=>'text/javascript' }); - $self->session->style->setLink($self->session->url->extras('calendar/calendar-win2k-1.css'), { rel=>"stylesheet", type=>"text/css", media=>"all" }); - my $mondayFirst = $self->session->user->profileField("firstDayOfWeek") ? "1" : "0"; - return WebGUI::Form::Text->new($self->session, + $self->session->style->setLink($self->session->url->extras('yui/build/calendar/assets/skins/sam/calendar.css'), { rel=>"stylesheet", type=>"text/css", media=>"all" }); + $self->session->style->setScript($self->session->url->extras('yui/build/yahoo/yahoo-min.js'),{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->url->extras('yui/build/dom/dom-min.js'),{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->url->extras('yui/build/event/event-min.js'),{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->url->extras('yui/build/calendar/calendar-min.js'),{ type=>'text/javascript' }); + my $firstDow = $self->session->user->profileField("firstDayOfWeek"); + $self->session->style->setRawHeadTags(""); + $self->session->style->setScript($self->session->url->extras('yui-webgui/build/datepicker/datepicker.js'),{ type=>'text/javascript' }); + + return WebGUI::Form::Text->new($self->session, name=>$self->get("name"), value=>$value, size=>$self->get("size"), - extras=>$self->get("extras"), - id=>$self->get('id'), + extras=>$self->get("extras") . ' onfocus="YAHOO.WebGUI.Form.DatePicker.display(this);"', + id=>$self->get('id'), maxlength=>$self->get("maxlength") - )->toHtml . ''; + )->toHtml; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Form/DateTime.pm b/lib/WebGUI/Form/DateTime.pm index 16ffcf95a..c9f7768c7 100644 --- a/lib/WebGUI/Form/DateTime.pm +++ b/lib/WebGUI/Form/DateTime.pm @@ -168,33 +168,23 @@ sub toHtml { ->set_time_zone($self->session->user->profileField("timeZone")) ->toMysql; } - my $i18n = WebGUI::International->new($self->session); - my $language = $i18n->getLanguage($self->session->user->profileField("language"),"languageAbbreviation"); - unless ($language) { - $language = $i18n->getLanguage("English","languageAbbreviation"); - } - $self->session->style->setScript($self->session->url->extras('calendar/calendar.js'),{ type=>'text/javascript' }); - $self->session->style->setScript($self->session->url->extras('calendar/lang/calendar-'.$language.'.js'),{ type=>'text/javascript' }); - $self->session->style->setScript($self->session->url->extras('calendar/calendar-setup.js'),{ type=>'text/javascript' }); - $self->session->style->setLink($self->session->url->extras('calendar/calendar-win2k-1.css'), { rel=>"stylesheet", type=>"text/css", media=>"all" }); - my $mondayFirst = $self->session->user->profileField("firstDayOfWeek") ? "true" : "false"; + $self->session->style->setLink($self->session->url->extras('yui/build/calendar/assets/skins/sam/calendar.css'), { rel=>"stylesheet", type=>"text/css", media=>"all" }); + $self->session->style->setScript($self->session->url->extras('yui/build/yahoo/yahoo-min.js'),{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->url->extras('yui/build/dom/dom-min.js'),{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->url->extras('yui/build/event/event-min.js'),{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->url->extras('yui/build/calendar/calendar-min.js'),{ type=>'text/javascript' }); + my $firstDow = $self->session->user->profileField("firstDayOfWeek"); + $self->session->style->setRawHeadTags(""); + $self->session->style->setScript($self->session->url->extras('yui-webgui/build/datepicker/datepicker.js'),{ type=>'text/javascript' }); + return WebGUI::Form::Text->new($self->session, name=>$self->get("name"), value=>$value, size=>$self->get("size"), - extras=>$self->get("extras"), - id=>$self->get('id'), + extras=>$self->get("extras") . ' onfocus="YAHOO.WebGUI.Form.DatePicker.display(this, true);"', + id=>$self->get('id'), maxlength=>$self->get("maxlength") - )->toHtml . ''; + )->toHtml; } #------------------------------------------------------------------- diff --git a/www/extras/yui-webgui/build/datepicker/datepicker.css b/www/extras/yui-webgui/build/datepicker/datepicker.css new file mode 100644 index 000000000..e69de29bb diff --git a/www/extras/yui-webgui/build/datepicker/datepicker.js b/www/extras/yui-webgui/build/datepicker/datepicker.js new file mode 100644 index 000000000..998a72193 --- /dev/null +++ b/www/extras/yui-webgui/build/datepicker/datepicker.js @@ -0,0 +1,143 @@ +YAHOO.namespace('WebGUI.Form'); +YAHOO.WebGUI.Form.DatePicker = { + init: function() { + this.time = {}; + var container = document.createElement('div'); + YAHOO.util.Dom.setStyle(container, 'font-size', '9pt'); + YAHOO.util.Dom.setStyle(container, 'position', 'absolute'); + YAHOO.util.Dom.setStyle(container, 'top', '0'); + YAHOO.util.Dom.addClass(container, 'yui-skin-sam'); + document.body.appendChild(container); + var cal = document.createElement('div'); + YAHOO.util.Dom.generateId(cal); + YAHOO.util.Dom.setStyle(cal, 'display', 'none'); + container.appendChild(cal); + var config = { + title: "Choose a date:", + close: true, + DATE_FIELD_DELIMITER: '-', + DATE_RANGE_DELIMITER: '/', + MDY_YEAR_POSITION: 1, + MDY_MONTH_POSITION: 2, + MDY_DAY_POSITION: 3 + }; + if (window.webguiFirstDayOfWeek) { + config.START_WEEKDAY = webguiFirstDayofWeek; + } + this.calendar = new YAHOO.widget.Calendar(null, cal, config); + this.calendar.selectEvent.subscribe(this.handleSelect, this, true); + this.calendar.beforeShowEvent.subscribe(this.handleBeforeShow, this, true); + this.calendar.showEvent.subscribe(this.handleShow, this, true); + this.calendar.beforeHideEvent.subscribe(this.handleHide, this, true); + this.calendar.renderEvent.subscribe(this.handleRender, this, true); + this.calendar.render(); + }, + handleRender: function(e) { + this.timediv = document.createElement('div'); + YAHOO.util.Dom.setStyle(this.timediv, 'text-align', 'center'); + this.calendar.oDomContainer.appendChild(this.timediv); + this.timediv.appendChild(document.createTextNode('Time: ')); + this.hourEl = document.createElement('input'); + this.hourEl.value = '00'; + this.hourEl.setAttribute('size', 2); + this.hourEl.setAttribute('maxlength', 2); + this.timediv.appendChild(this.hourEl); + this.timediv.appendChild(document.createTextNode(' : ')); + this.minuteEl = document.createElement('input'); + this.minuteEl.value = '00'; + this.minuteEl.setAttribute('size', 2); + this.minuteEl.setAttribute('maxlength', 2); + this.timediv.appendChild(this.minuteEl); + this.secEl = document.createElement('input'); + this.secEl.value = '00'; + this.secEl.setAttribute('size', 2); + this.secEl.setAttribute('maxlength', 2); + YAHOO.util.Dom.setStyle(this.secEl, 'display', 'none'); + this.timediv.appendChild(this.secEl); + this.calendar.oDomContainer.appendChild(this.timediv); + YAHOO.util.Event.on(this.hourEl, 'change', this.handleTimebox, [this.hourEl, 'hour'], this); + YAHOO.util.Event.on(this.minuteEl, 'change', this.handleTimebox, [this.minuteEl, 'minute'], this); + }, + handleTimebox: function(e, obj) { + var input = obj[0]; + var type = obj[1]; + var val = parseInt(input.value); + if (!val) + val = 0; + val = val % (type == 'hour' ? 24 : 60); + input.value = (val < 10 ? '0' : '') + val; + }, + handleBeforeShow: function(e) { + YAHOO.util.Event.on(this.inputBox, 'change', this.handleChange, this, true); + this.handleChange(); + }, + handleShow: function(e) { + var pos = YAHOO.util.Dom.getRegion(this.inputBox); + YAHOO.util.Dom.setXY(this.calendar.oDomContainer, [pos.left, pos.bottom]); + YAHOO.util.Dom.setStyle(this.timediv, 'display', ( this.useTime ? 'block' : 'none')); + }, + handleHide: function(e) { + YAHOO.util.Event.removeListener(this.inputBox, 'change', this.handleChange); + }, + handleSelect: function(e) { + var sel = this.calendar.getSelectedDates()[0]; + var month = sel.getMonth() + 1; + var day = sel.getDate(); + var year = sel.getFullYear(); + this.inputBox.value = '' + (month < 10 ? '0' : '') + month + '-' + (day < 10 ? '0' : '') + day + '-' + year; + this.inputBox.value = year + '-' + (month < 10 ? '0' : '') + month + '-' + (day < 10 ? '0' : '') + day; + if (this.useTime) { + var hour = 1 * this.hourEl.value; + var minute = 1 * this.minuteEl.value; + var sec = 1 * this.secEl.value; + this.inputBox.value += ' ' + (hour < 10 ? '0' : '') + hour + ':' + (minute < 10 ? '0' : '') + minute + ':' + (sec < 10 ? '0' : '') + sec; + } + if (!this.codeSelect) { + this.calendar.hide(); + } + }, + display: function(el, time) { + this.calendar.hide(); + this.inputBox = YAHOO.util.Dom.get(el); + this.useTime = time; + this.calendar.show(); + }, + handleChange: function(e) { + if ((this.inputBox.value != "") && (!this.codeSelect)) { + this.codeSelect = true; + var date; + var res; + var hour, min, sec; + if(res = this.inputBox.value.match(/(\d+)-(\d+)-(\d+)(?: (\d+):(\d+):(\d+))?/)) { + date = res[1] + '-' + res[2] + '-' + res[3]; + if (res[4]) { + hour = (res[4] < 10 ? '0' : '') + (1 * res[4]); + min = (res[5] < 10 ? '0' : '') + (1 * res[5]); + sec = (res[6] < 10 ? '0' : '') + (1 * res[6]); + } + } + if (!hour) + hour = '00'; + if (!min) + min = '00'; + if (!sec) + sec = '00'; + this.hourEl.value = hour; + this.minuteEl.value = min; + this.secEl.value = sec; + this.calendar.select(date); + var selectedDates = this.calendar.getSelectedDates(); + if (selectedDates.length > 0) { + var firstDate = selectedDates[0]; + this.calendar.cfg.setProperty("pagedate", (firstDate.getMonth()+1) + "-" + firstDate.getFullYear()); + this.calendar.render(); + } + this.hourEl.value = hour; + this.minuteEl.value = min; + this.secEl.value = sec; + this.codeSelect = false; + } + } +}; +YAHOO.util.Event.onDOMReady(YAHOO.WebGUI.Form.DatePicker.init, YAHOO.WebGUI.Form.DatePicker, true); + diff --git a/www/extras/yui-webgui/build/datepicker/example.html b/www/extras/yui-webgui/build/datepicker/example.html new file mode 100644 index 000000000..69856c001 --- /dev/null +++ b/www/extras/yui-webgui/build/datepicker/example.html @@ -0,0 +1,28 @@ + + +
+