* Rewrote global getTimeZones() method
* Rewrite client-side code for reformatting the time zone <select> element according to changes in global getTimeZones() method * Replaced “return false” with call for event.preventDefault() in client-side event-driven code * Rewrote global getDateFormats() and formatDate() methods – caution! getDateFormats() will be removed in the next commit because the dropdown menus in site preferences are obsolete; just committing the code for the record
This commit is contained in:
parent
e5d037cded
commit
84fd98200e
3 changed files with 181 additions and 72 deletions
|
@ -746,35 +746,74 @@ function formatNumber(number, pattern) {
|
||||||
*
|
*
|
||||||
* @param {Date} date
|
* @param {Date} date
|
||||||
* @param {String} format
|
* @param {String} format
|
||||||
* @param {String} type
|
|
||||||
* @returns {String} The formatted date string
|
* @returns {String} The formatted date string
|
||||||
*/
|
*/
|
||||||
function formatDate(date, format, type) {
|
function formatDate(date, format) {
|
||||||
if (!date) {
|
if (!date) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var pattern, site = res.handlers.site;
|
|
||||||
var locale = site.getLocale();
|
var pattern,
|
||||||
var type = java.text.DateFormat[type ? type.toUpperCase() : "FULL"];
|
site = res.handlers.site,
|
||||||
|
locale = site.getLocale();
|
||||||
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case null:
|
case null:
|
||||||
|
case undefined:
|
||||||
|
format = "full"; // Warning! Passing through to next case block!
|
||||||
|
case "short":
|
||||||
|
case "medium":
|
||||||
|
case "long":
|
||||||
|
case "full":
|
||||||
|
var type = java.text.DateFormat[format.toUpperCase()];
|
||||||
pattern = java.text.DateFormat.getDateTimeInstance(type, type, locale).toPattern();
|
pattern = java.text.DateFormat.getDateTimeInstance(type, type, locale).toPattern();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "date":
|
case "date":
|
||||||
|
var type = java.text.DateFormat.FULL
|
||||||
pattern = java.text.DateFormat.getDateInstance(type, locale).toPattern();
|
pattern = java.text.DateFormat.getDateInstance(type, locale).toPattern();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "time":
|
case "time":
|
||||||
|
var type = java.text.DateFormat.SHORT;
|
||||||
pattern = java.text.DateFormat.getTimeInstance(type, locale).toPattern();
|
pattern = java.text.DateFormat.getTimeInstance(type, locale).toPattern();
|
||||||
break;
|
break;
|
||||||
case "short":
|
|
||||||
case "long":
|
|
||||||
pattern = site[format.toLowerCase() + "DateFormat"];
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
pattern = format;
|
pattern = format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*var [dateFormat, timeFormat] = site.longDateFormat.split(",");
|
||||||
|
|
||||||
|
switch (format) {
|
||||||
|
case null:
|
||||||
|
pattern = site.longDateFormat;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "date":
|
||||||
|
var type = java.text.DateFormat[dateFormat.toUpperCase()];
|
||||||
|
pattern = java.text.DateFormat.getDateInstance(type, locale).toPattern();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "time":
|
||||||
|
var type = java.text.DateFormat[timeFormat.toUpperCase()];
|
||||||
|
pattern = java.text.DateFormat.getTimeInstance(type, locale).toPattern();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "short":
|
||||||
|
case "medium":
|
||||||
|
case "long":
|
||||||
|
case "full":
|
||||||
|
var type = java.text.DateFormat[format.toUpperCase()];
|
||||||
|
pattern = java.text.DateFormat.getDateTimeInstance(type, type, locale).toPattern();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
pattern = format;
|
||||||
|
}*/
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return date.format(pattern, site.getLocale(), site.getTimeZone());
|
return date.format(pattern, locale, site.getTimeZone());
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
return "[Invalid date format]";
|
return "[Invalid date format]";
|
||||||
}
|
}
|
||||||
|
@ -857,47 +896,43 @@ function getLocales(language) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* This method returns an array of structs providing two properties each:
|
||||||
|
* <code>value</code> – a unique time zone ID
|
||||||
|
* <code>display</code> – a (more) user-friendly string
|
||||||
|
* Although Java is great in providing all time zones one can imagine, this
|
||||||
|
* vast amount of choices fails to support easy time zone selection.
|
||||||
|
* Furthermore, the L10n features of the java.util.TimeZone class are insufficient
|
||||||
|
* as they do only translate the generic string returned by the getDisplayName()
|
||||||
|
* method (e.g. Central European Time), not the more usable time zone IDs
|
||||||
|
* (e.g. Europe/Vienna). Thus, time zone selection in Antville is rather limited.
|
||||||
* @param {String} language
|
* @param {String} language
|
||||||
* @returns {Object[]} A sorted array containing the corresponding timezones
|
* @returns {Object[]} A sorted array containing the corresponding timezones
|
||||||
*/
|
*/
|
||||||
function getTimeZones(language) {
|
function getTimeZones(language) {
|
||||||
var result = [], timeZone, offset;
|
var result = [],
|
||||||
var locale = getLocale(language);
|
timeZones = [],
|
||||||
var zones = java.util.TimeZone.getAvailableIDs();
|
locale = getLocale(language),
|
||||||
var now = new Date;
|
ids = java.util.TimeZone.getAvailableIDs();
|
||||||
var previousZone;
|
|
||||||
for each (var zone in zones) {
|
|
||||||
timeZone = java.util.TimeZone.getTimeZone(zone);
|
|
||||||
if (!previousZone || !timeZone.hasSameRules(previousZone)) {
|
|
||||||
offset = timeZone.getRawOffset();
|
|
||||||
result.push({
|
|
||||||
value: zone,
|
|
||||||
display: timeZone.getDisplayName(timeZone.inDaylightTime(now),
|
|
||||||
java.util.TimeZone.LONG, locale) + " (UTC" + (offset /
|
|
||||||
Date.ONEHOUR).format("+00;-00") + ":" + (Math.abs(offset %
|
|
||||||
Date.ONEHOUR) / Date.ONEMINUTE).format("00") + ")"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
previousZone = timeZone.clone();
|
|
||||||
}
|
|
||||||
result.sort(new String.Sorter("value"));
|
|
||||||
return result;
|
|
||||||
|
|
||||||
var group;
|
for each (let id in ids) {
|
||||||
result.forEach(function(zone) {
|
// Exclude confusing time zones
|
||||||
var parts = zone.value.split("/");
|
if (id.length < 4 || !id.contains("/") ||
|
||||||
if (parts.length > 1) {
|
id.startsWith("Etc") || id.startsWith("System")) {
|
||||||
if (parts[0] !== group) {
|
continue;
|
||||||
group = parts[0];
|
|
||||||
zone.group = group;
|
|
||||||
}
|
}
|
||||||
zone.display = parts.splice(1).join(String.EMPTY) + zone.display;
|
let timeZone = java.util.TimeZone.getTimeZone(id);
|
||||||
} else {
|
// Exclude more confusing time zones
|
||||||
zone.display = zone.value + zone.display;
|
if (timeZone.getDisplayName().startsWith("GMT")) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
});
|
result.push({
|
||||||
return result;
|
value: timeZone.getID(),
|
||||||
|
display: timeZone.getID().replace(/_/g, String.SPACE)
|
||||||
|
})
|
||||||
|
timeZones.push(timeZone);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.sort(new String.Sorter("display"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -910,6 +945,84 @@ function getDateFormats(type, locale, timeZone) {
|
||||||
type || (type = "short");
|
type || (type = "short");
|
||||||
locale || (locale = java.util.Locale.getDefault());
|
locale || (locale = java.util.Locale.getDefault());
|
||||||
timeZone || (timeZone = java.util.TimeZone.getDefault());
|
timeZone || (timeZone = java.util.TimeZone.getDefault());
|
||||||
|
|
||||||
|
var now = new Date, result = [], patterns = {};
|
||||||
|
var types = ["short", "medium", "long", "full"];
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 'long':
|
||||||
|
for each (let dateFormat in types) {
|
||||||
|
let datePattern = java.text.DateFormat[dateFormat.toUpperCase()];
|
||||||
|
for each (let timeFormat in types) {
|
||||||
|
let timePattern = java.text.DateFormat[timeFormat.toUpperCase()];
|
||||||
|
let sdf = java.text.DateFormat.getDateTimeInstance(datePattern, timePattern, locale);
|
||||||
|
let pattern = sdf.toPattern();
|
||||||
|
//res.debug(sdf.getDateTimeInstance().toPattern());
|
||||||
|
//res.debug('pattern: ' + pattern)
|
||||||
|
if (patterns[pattern]) {
|
||||||
|
//continue;
|
||||||
|
}
|
||||||
|
patterns[pattern] = true;
|
||||||
|
sdf.setTimeZone(timeZone);
|
||||||
|
let format = [dateFormat, timeFormat].join();
|
||||||
|
result.push([format, sdf.format(now)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
case 'long-old':
|
||||||
|
for each (let timeType in types) {
|
||||||
|
let pattern = java.text.DateFormat[timeType.toUpperCase()];
|
||||||
|
let sdf = java.text.DateFormat.getDateInstance(pattern, locale);
|
||||||
|
pattern = sdf.toPattern();
|
||||||
|
//res.debug(sdf.getDateTimeInstance().toPattern());
|
||||||
|
//res.debug('pattern: ' + pattern)
|
||||||
|
if (patterns[pattern]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
patterns[pattern] = true;
|
||||||
|
sdf.setTimeZone(timeZone);
|
||||||
|
result.push([encodeForm(pattern), sdf.format(now)]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
case 'short':
|
||||||
|
return result;
|
||||||
|
for each (let timeType in types) {
|
||||||
|
let pattern = java.text.DateFormat[timeType.toUpperCase()];
|
||||||
|
let sdf = java.text.DateFormat.getTimeInstance(pattern, locale);
|
||||||
|
pattern = sdf.toPattern();
|
||||||
|
//res.debug(sdf.getDateTimeInstance().toPattern());
|
||||||
|
//res.debug('pattern: ' + pattern)
|
||||||
|
if (patterns[pattern]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
patterns[pattern] = true;
|
||||||
|
sdf.setTimeZone(timeZone);
|
||||||
|
result.push([encodeForm(pattern), sdf.format(now)]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
default:
|
||||||
|
for each (let dateType in types) {
|
||||||
|
let datePattern = java.text.DateFormat[dateType.toUpperCase()];
|
||||||
|
for each (let timeType in types) {
|
||||||
|
let timePattern = java.text.DateFormat[timeType.toUpperCase()];
|
||||||
|
let sdf = java.text.DateFormat.getDateTimeInstance(datePattern, timePattern, locale);
|
||||||
|
let pattern = sdf.toPattern();
|
||||||
|
//res.debug(sdf.getDateTimeInstance().toPattern());
|
||||||
|
//res.debug('pattern: ' + pattern)
|
||||||
|
if (patterns[pattern]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
patterns[pattern] = true;
|
||||||
|
sdf.setTimeZone(timeZone);
|
||||||
|
result.push([encodeForm(pattern), sdf.format(now)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
var types = [type];
|
var types = [type];
|
||||||
types.push(type === "long" ? "full" : "medium");
|
types.push(type === "long" ? "full" : "medium");
|
||||||
var now = new Date, result = [], patterns = {};
|
var now = new Date, result = [], patterns = {};
|
||||||
|
|
|
@ -208,14 +208,10 @@ referrers.push(new Antville.Referrer("<% param.referrer %>",
|
||||||
<td><% site.select timeZone %></td>
|
<td><% site.select timeZone %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="small"><% gettext "Long Date Format" suffix=: %></td>
|
<td class="small"><% gettext "Date Format" suffix=: %></td>
|
||||||
<td><% site.select longDateFormat %></td>
|
<td><% site.select longDateFormat %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="small"><% gettext "Short Date Format" suffix=: %></td>
|
|
||||||
<td><% site.select shortDateFormat %></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="small"><% gettext Notifications suffix=: %></td>
|
<td class="small"><% gettext Notifications suffix=: %></td>
|
||||||
<td><% site.select notificationMode %></td>
|
<td><% site.select notificationMode %></td>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
$(function() {
|
$(function() {
|
||||||
$("a.cancel").click(function() {
|
$("a.cancel").click(function(event) {
|
||||||
|
event.preventDefault();
|
||||||
history.back();
|
history.back();
|
||||||
return false;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var group, groups = [];
|
// Group related <option> elements by inserting additional <optgroup> elements:
|
||||||
$("form #timeZone option").each(function(index, item) {
|
var groups = [],
|
||||||
var zone = $(item);
|
element = $("form#prefs #timeZone");
|
||||||
var parts = zone.val().split("/");
|
element.find("option").each(function(index, item) {
|
||||||
if (parts.length > 1) {
|
var zone = $(item),
|
||||||
if (/* parts[0].indexOf("Etc") === 0 || */
|
parts = zone.html().split("/"), // E.g. Europe/Vienna
|
||||||
parts[0].indexOf("SystemV") === 0) {
|
group = parts[0];
|
||||||
zone.remove();
|
|
||||||
return;
|
if ($.inArray(group, groups) < 0) {
|
||||||
}
|
groups.push(group);
|
||||||
group !== parts[0] && groups.push(group = parts[0]);
|
|
||||||
zone.addClass("group-" + group);
|
|
||||||
zone.text(parts.splice(1).join(", ").replace(/_/g, " "));
|
|
||||||
} else {
|
|
||||||
zone.remove();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var optgroup = $("<optgroup>");
|
groups.sort();
|
||||||
$.each(groups, function(index, item) {
|
$.each(groups, function(index, group) {
|
||||||
$("form #timeZone option.group-" + item).wrapAll(optgroup.clone().attr("label", item));
|
var key = group + "/"; // E.g. Europe/
|
||||||
|
element.find("option:contains(" + key + ")")
|
||||||
|
.wrapAll($("<optgroup>").attr("label", group))
|
||||||
|
.each(function(index, item) {
|
||||||
|
$(item).html($(item).html().replace(key, ""));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue