Intial timezone support

This commit is contained in:
Andris Reinman 2016-04-29 15:35:00 +03:00
parent 478237e60f
commit ae8a79ea07
5 changed files with 187 additions and 146 deletions

270
lib/tz.js
View file

@ -1,147 +1,127 @@
'use strict';
module.exports.list = [
'Pacific/Midway',
'Pacific/Samoa',
'Pacific/Honolulu',
'US/Alaska',
'America/Los_Angeles',
'America/Tijuana',
'US/Arizona',
'America/Chihuahua',
'America/Chihuahua',
'America/Mazatlan',
'US/Mountain',
'America/Managua',
'US/Central',
'America/Mexico_City',
'America/Mexico_City',
'America/Monterrey',
'Canada/Saskatchewan',
'America/Bogota',
'US/Eastern',
'US/East-Indiana',
'America/Lima',
'America/Bogota',
'Canada/Atlantic',
'America/Caracas',
'America/La_Paz',
'America/Santiago',
'Canada/Newfoundland',
'America/Sao_Paulo',
'America/Argentina/Buenos_Aires',
'America/Argentina/Buenos_Aires',
'America/Godthab',
'America/Noronha',
'Atlantic/Azores',
'Atlantic/Cape_Verde',
'Africa/Casablanca',
'Europe/London',
'Etc/Greenwich',
'Europe/Lisbon',
'Europe/London',
'Africa/Monrovia',
'UTC',
'Europe/Amsterdam',
'Europe/Belgrade',
'Europe/Berlin',
'Europe/Berlin',
'Europe/Bratislava',
'Europe/Brussels',
'Europe/Budapest',
'Europe/Copenhagen',
'Europe/Ljubljana',
'Europe/Madrid',
'Europe/Paris',
'Europe/Prague',
'Europe/Rome',
'Europe/Sarajevo',
'Europe/Skopje',
'Europe/Stockholm',
'Europe/Vienna',
'Europe/Warsaw',
'Africa/Lagos',
'Europe/Zagreb',
'Europe/Athens',
'Europe/Bucharest',
'Africa/Cairo',
'Africa/Harare',
'Europe/Helsinki',
'Europe/Istanbul',
'Asia/Jerusalem',
'Europe/Helsinki',
'Africa/Johannesburg',
'Europe/Riga',
'Europe/Sofia',
'Europe/Tallinn',
'Europe/Vilnius',
'Asia/Baghdad',
'Asia/Kuwait',
'Europe/Minsk',
'Africa/Nairobi',
'Asia/Riyadh',
'Europe/Volgograd',
'Asia/Tehran',
'Asia/Muscat',
'Asia/Baku',
'Europe/Moscow',
'Asia/Muscat',
'Europe/Moscow',
'Asia/Tbilisi',
'Asia/Yerevan',
'Asia/Kabul',
'Asia/Karachi',
'Asia/Karachi',
'Asia/Tashkent',
'Asia/Calcutta',
'Asia/Kolkata',
'Asia/Calcutta',
'Asia/Calcutta',
'Asia/Calcutta',
'Asia/Katmandu',
'Asia/Almaty',
'Asia/Dhaka',
'Asia/Dhaka',
'Asia/Yekaterinburg',
'Asia/Rangoon',
'Asia/Bangkok',
'Asia/Bangkok',
'Asia/Jakarta',
'Asia/Novosibirsk',
'Asia/Hong_Kong',
'Asia/Chongqing',
'Asia/Hong_Kong',
'Asia/Krasnoyarsk',
'Asia/Kuala_Lumpur',
'Australia/Perth',
'Asia/Singapore',
'Asia/Taipei',
'Asia/Ulan_Bator',
'Asia/Urumqi',
'Asia/Irkutsk',
'Asia/Tokyo',
'Asia/Tokyo',
'Asia/Seoul',
'Asia/Tokyo',
'Australia/Adelaide',
'Australia/Darwin',
'Australia/Brisbane',
'Australia/Canberra',
'Pacific/Guam',
'Australia/Hobart',
'Australia/Melbourne',
'Pacific/Port_Moresby',
'Australia/Sydney',
'Asia/Yakutsk',
'Asia/Vladivostok',
'Pacific/Auckland',
'Pacific/Fiji',
'Pacific/Kwajalein',
'Asia/Kamchatka',
'Asia/Magadan',
'Pacific/Fiji',
'Asia/Magadan',
'Asia/Magadan',
'Pacific/Auckland',
'Pacific/Tongatapu'
];
// Timezone list from https://github.com/tamaspap/timezones (MIT licensed)
module.exports.list = {
'Pacific/Midway': '(UTC-11:00) Midway Island',
'Pacific/Samoa': '(UTC-11:00) Samoa',
'Pacific/Honolulu': '(UTC-10:00) Hawaii',
'US/Alaska': '(UTC-09:00) Alaska',
'America/Los_Angeles': '(UTC-08:00) Pacific Time (US & Canada)',
'America/Tijuana': '(UTC-08:00) Tijuana',
'US/Arizona': '(UTC-07:00) Arizona',
'America/Chihuahua': '(UTC-07:00) La Paz',
'America/Mazatlan': '(UTC-07:00) Mazatlan',
'US/Mountain': '(UTC-07:00) Mountain Time (US & Canada)',
'America/Managua': '(UTC-06:00) Central America',
'US/Central': '(UTC-06:00) Central Time (US & Canada)',
'America/Mexico_City': '(UTC-06:00) Mexico City',
'America/Monterrey': '(UTC-06:00) Monterrey',
'Canada/Saskatchewan': '(UTC-06:00) Saskatchewan',
'America/Bogota': '(UTC-05:00) Quito',
'US/Eastern': '(UTC-05:00) Eastern Time (US & Canada)',
'US/East-Indiana': '(UTC-05:00) Indiana (East)',
'America/Lima': '(UTC-05:00) Lima',
'Canada/Atlantic': '(UTC-04:00) Atlantic Time (Canada)',
'America/Caracas': '(UTC-04:30) Caracas',
'America/La_Paz': '(UTC-04:00) La Paz',
'America/Santiago': '(UTC-04:00) Santiago',
'Canada/Newfoundland': '(UTC-03:30) Newfoundland',
'America/Sao_Paulo': '(UTC-03:00) Brasilia',
'America/Argentina/Buenos_Aires': '(UTC-03:00) Georgetown',
'America/Godthab': '(UTC-03:00) Greenland',
'America/Noronha': '(UTC-02:00) Mid-Atlantic',
'Atlantic/Azores': '(UTC-01:00) Azores',
'Atlantic/Cape_Verde': '(UTC-01:00) Cape Verde Is.',
'Africa/Casablanca': '(UTC+00:00) Casablanca',
'Europe/London': '(UTC+00:00) London',
'Etc/Greenwich': '(UTC+00:00) Greenwich Mean Time : Dublin',
'Europe/Lisbon': '(UTC+00:00) Lisbon',
'Africa/Monrovia': '(UTC+00:00) Monrovia',
UTC: '(UTC+00:00) UTC',
'Europe/Amsterdam': '(UTC+01:00) Amsterdam',
'Europe/Belgrade': '(UTC+01:00) Belgrade',
'Europe/Berlin': '(UTC+01:00) Bern',
'Europe/Bratislava': '(UTC+01:00) Bratislava',
'Europe/Brussels': '(UTC+01:00) Brussels',
'Europe/Budapest': '(UTC+01:00) Budapest',
'Europe/Copenhagen': '(UTC+01:00) Copenhagen',
'Europe/Ljubljana': '(UTC+01:00) Ljubljana',
'Europe/Madrid': '(UTC+01:00) Madrid',
'Europe/Paris': '(UTC+01:00) Paris',
'Europe/Prague': '(UTC+01:00) Prague',
'Europe/Rome': '(UTC+01:00) Rome',
'Europe/Sarajevo': '(UTC+01:00) Sarajevo',
'Europe/Skopje': '(UTC+01:00) Skopje',
'Europe/Stockholm': '(UTC+01:00) Stockholm',
'Europe/Vienna': '(UTC+01:00) Vienna',
'Europe/Warsaw': '(UTC+01:00) Warsaw',
'Africa/Lagos': '(UTC+01:00) West Central Africa',
'Europe/Zagreb': '(UTC+01:00) Zagreb',
'Europe/Athens': '(UTC+02:00) Athens',
'Europe/Bucharest': '(UTC+02:00) Bucharest',
'Africa/Cairo': '(UTC+02:00) Cairo',
'Africa/Harare': '(UTC+02:00) Harare',
'Europe/Helsinki': '(UTC+02:00) Kyiv',
'Europe/Istanbul': '(UTC+02:00) Istanbul',
'Asia/Jerusalem': '(UTC+02:00) Jerusalem',
'Africa/Johannesburg': '(UTC+02:00) Pretoria',
'Europe/Riga': '(UTC+02:00) Riga',
'Europe/Sofia': '(UTC+02:00) Sofia',
'Europe/Tallinn': '(UTC+02:00) Tallinn',
'Europe/Vilnius': '(UTC+02:00) Vilnius',
'Asia/Baghdad': '(UTC+03:00) Baghdad',
'Asia/Kuwait': '(UTC+03:00) Kuwait',
'Europe/Minsk': '(UTC+03:00) Minsk',
'Africa/Nairobi': '(UTC+03:00) Nairobi',
'Asia/Riyadh': '(UTC+03:00) Riyadh',
'Europe/Volgograd': '(UTC+03:00) Volgograd',
'Asia/Tehran': '(UTC+03:30) Tehran',
'Asia/Muscat': '(UTC+04:00) Muscat',
'Asia/Baku': '(UTC+04:00) Baku',
'Europe/Moscow': '(UTC+04:00) St. Petersburg',
'Asia/Tbilisi': '(UTC+04:00) Tbilisi',
'Asia/Yerevan': '(UTC+04:00) Yerevan',
'Asia/Kabul': '(UTC+04:30) Kabul',
'Asia/Karachi': '(UTC+05:00) Karachi',
'Asia/Tashkent': '(UTC+05:00) Tashkent',
'Asia/Calcutta': '(UTC+05:30) Sri Jayawardenepura',
'Asia/Kolkata': '(UTC+05:30) Kolkata',
'Asia/Katmandu': '(UTC+05:45) Kathmandu',
'Asia/Almaty': '(UTC+06:00) Almaty',
'Asia/Dhaka': '(UTC+06:00) Dhaka',
'Asia/Yekaterinburg': '(UTC+06:00) Ekaterinburg',
'Asia/Rangoon': '(UTC+06:30) Rangoon',
'Asia/Bangkok': '(UTC+07:00) Hanoi',
'Asia/Jakarta': '(UTC+07:00) Jakarta',
'Asia/Novosibirsk': '(UTC+07:00) Novosibirsk',
'Asia/Hong_Kong': '(UTC+08:00) Hong Kong',
'Asia/Chongqing': '(UTC+08:00) Chongqing',
'Asia/Krasnoyarsk': '(UTC+08:00) Krasnoyarsk',
'Asia/Kuala_Lumpur': '(UTC+08:00) Kuala Lumpur',
'Australia/Perth': '(UTC+08:00) Perth',
'Asia/Singapore': '(UTC+08:00) Singapore',
'Asia/Taipei': '(UTC+08:00) Taipei',
'Asia/Ulan_Bator': '(UTC+08:00) Ulaan Bataar',
'Asia/Urumqi': '(UTC+08:00) Urumqi',
'Asia/Irkutsk': '(UTC+09:00) Irkutsk',
'Asia/Tokyo': '(UTC+09:00) Tokyo',
'Asia/Seoul': '(UTC+09:00) Seoul',
'Australia/Adelaide': '(UTC+09:30) Adelaide',
'Australia/Darwin': '(UTC+09:30) Darwin',
'Australia/Brisbane': '(UTC+10:00) Brisbane',
'Australia/Canberra': '(UTC+10:00) Canberra',
'Pacific/Guam': '(UTC+10:00) Guam',
'Australia/Hobart': '(UTC+10:00) Hobart',
'Australia/Melbourne': '(UTC+10:00) Melbourne',
'Pacific/Port_Moresby': '(UTC+10:00) Port Moresby',
'Australia/Sydney': '(UTC+10:00) Sydney',
'Asia/Yakutsk': '(UTC+10:00) Yakutsk',
'Asia/Vladivostok': '(UTC+11:00) Vladivostok',
'Pacific/Auckland': '(UTC+12:00) Wellington',
'Pacific/Fiji': '(UTC+12:00) Marshall Is.',
'Pacific/Kwajalein': '(UTC+12:00) International Date Line West',
'Asia/Kamchatka': '(UTC+12:00) Kamchatka',
'Asia/Magadan': '(UTC+12:00) Solomon Is.',
'Pacific/Tongatapu': '(UTC+13:00) Nuku\'alofa'
};

View file

@ -18,6 +18,7 @@ let uploads = multer({
});
let csvparse = require('csv-parse');
let fs = require('fs');
let tzlist = require('../lib/tz').list;
router.all('/*', (req, res, next) => {
if (!req.user) {
@ -278,6 +279,18 @@ router.get('/subscription/:id/add', passport.csrfProtection, (req, res) => {
data.customFields = fields.getRow(fieldList, data, false, true);
data.useEditor = true;
data.timezones = Object.keys(tzlist).map(tz => {
let selected = false;
if (tz.toLowerCase().trim() === (data.tz || 'UTC').toLowerCase().trim()) {
selected = true;
}
return {
key: tz,
value: tzlist[tz],
selected
};
});
res.render('lists/subscription/add', data);
});
});
@ -308,6 +321,27 @@ router.get('/subscription/:id/edit/:cid', passport.csrfProtection, (req, res) =>
subscription.useEditor = true;
subscription.isSubscribed = subscription.status === 1;
let tzfound = false;
subscription.timezones = Object.keys(tzlist).map(tz => {
let selected = false;
if (tz.toLowerCase().trim() === (subscription.tz || '').toLowerCase().trim()) {
selected = true;
tzfound = true;
}
return {
key: tz,
value: tzlist[tz],
selected
};
});
if (!tzfound && subscription.tz) {
subscription.timezones.push({
key: subscription.tz,
value: subscription.tz,
selected: true
});
}
res.render('lists/subscription/edit', subscription);
});
});

View file

@ -13,7 +13,6 @@ let fields = require('../lib/models/fields');
let subscriptions = require('../lib/models/subscriptions');
let settings = require('../lib/models/settings');
let openpgp = require('openpgp');
let tzlist = require('../lib/tz').list;
router.get('/subscribe/:cid', (req, res, next) => {
subscriptions.subscribe(req.params.cid, req.ip, (err, subscription) => {

View file

@ -117,6 +117,20 @@
</div>
{{/each}}
<div class="form-group">
<label for="tz" class="col-sm-2 control-label">Timezone</label>
<div class="col-sm-10">
<select name="tz" class="form-control">
<option value="">
Select
</option>
{{#each timezones}}
<option value="{{key}}" {{#if selected}} selected {{/if}}>{{value}}</option>
{{/each}}
</select>
</div>
</div>
<hr />
<div class="form-group">

View file

@ -130,6 +130,20 @@
</div>
{{/each}}
<div class="form-group">
<label for="tz" class="col-sm-2 control-label">Timezone</label>
<div class="col-sm-10">
<select name="tz" class="form-control">
<option value="">
Select
</option>
{{#each timezones}}
<option value="{{key}}" {{#if selected}} selected {{/if}}>{{value}}</option>
{{/each}}
</select>
</div>
</div>
<hr />
<div class="form-group">