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

View file

@ -18,6 +18,7 @@ let uploads = multer({
}); });
let csvparse = require('csv-parse'); let csvparse = require('csv-parse');
let fs = require('fs'); let fs = require('fs');
let tzlist = require('../lib/tz').list;
router.all('/*', (req, res, next) => { router.all('/*', (req, res, next) => {
if (!req.user) { 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.customFields = fields.getRow(fieldList, data, false, true);
data.useEditor = 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); res.render('lists/subscription/add', data);
}); });
}); });
@ -308,6 +321,27 @@ router.get('/subscription/:id/edit/:cid', passport.csrfProtection, (req, res) =>
subscription.useEditor = true; subscription.useEditor = true;
subscription.isSubscribed = subscription.status === 1; 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); 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 subscriptions = require('../lib/models/subscriptions');
let settings = require('../lib/models/settings'); let settings = require('../lib/models/settings');
let openpgp = require('openpgp'); let openpgp = require('openpgp');
let tzlist = require('../lib/tz').list;
router.get('/subscribe/:cid', (req, res, next) => { router.get('/subscribe/:cid', (req, res, next) => {
subscriptions.subscribe(req.params.cid, req.ip, (err, subscription) => { subscriptions.subscribe(req.params.cid, req.ip, (err, subscription) => {

View file

@ -117,6 +117,20 @@
</div> </div>
{{/each}} {{/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 /> <hr />
<div class="form-group"> <div class="form-group">

View file

@ -130,6 +130,20 @@
</div> </div>
{{/each}} {{/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 /> <hr />
<div class="form-group"> <div class="form-group">