mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-27 16:54:04 +00:00
implement timezone
This commit is contained in:
parent
1d64f643b1
commit
55bd6b6d7a
9 changed files with 441 additions and 384 deletions
|
@ -1,11 +1,11 @@
|
||||||
{
|
{
|
||||||
"name": "uptime-kuma",
|
"name": "uptime-kuma",
|
||||||
"version": "0.0.0",
|
"version": "1.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite --host",
|
||||||
"dev-server": "node server/server.js",
|
"dev-server": "node server/server.js",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"serve": "vite preview"
|
"serve": "vite preview --host"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@popperjs/core": "^2.9.2",
|
"@popperjs/core": "^2.9.2",
|
||||||
|
|
|
@ -80,10 +80,12 @@ class Monitor extends BeanModel {
|
||||||
|
|
||||||
} else if (this.type === "port") {
|
} else if (this.type === "port") {
|
||||||
bean.ping = await tcping(this.hostname, this.port);
|
bean.ping = await tcping(this.hostname, this.port);
|
||||||
|
bean.msg = ""
|
||||||
bean.status = 1;
|
bean.status = 1;
|
||||||
|
|
||||||
} else if (this.type === "ping") {
|
} else if (this.type === "ping") {
|
||||||
bean.ping = await ping(this.hostname);
|
bean.ping = await ping(this.hostname);
|
||||||
|
bean.msg = ""
|
||||||
bean.status = 1;
|
bean.status = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,11 +168,8 @@ class Monitor extends BeanModel {
|
||||||
if (value <= sec) {
|
if (value <= sec) {
|
||||||
downtime += value;
|
downtime += value;
|
||||||
} else {
|
} else {
|
||||||
console.log("Now: " + dayjs.utc());
|
|
||||||
console.log("Time: " + dayjs(time))
|
|
||||||
|
|
||||||
let trim = dayjs.utc().diff(dayjs(time), 'second');
|
let trim = dayjs.utc().diff(dayjs(time), 'second');
|
||||||
console.log("trim: " + trim);
|
|
||||||
value = sec - trim;
|
value = sec - trim;
|
||||||
|
|
||||||
if (value < 0) {
|
if (value < 0) {
|
||||||
|
|
|
@ -10,11 +10,8 @@ const passwordHash = require('password-hash');
|
||||||
const jwt = require('jsonwebtoken');
|
const jwt = require('jsonwebtoken');
|
||||||
const Monitor = require("./model/monitor");
|
const Monitor = require("./model/monitor");
|
||||||
|
|
||||||
let stop = false;
|
|
||||||
let interval = 6000;
|
|
||||||
let totalClient = 0;
|
let totalClient = 0;
|
||||||
let jwtSecret = null;
|
let jwtSecret = null;
|
||||||
let loadFromDatabase = true;
|
|
||||||
let monitorList = {};
|
let monitorList = {};
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
|
|
370
server/util.js
370
server/util.js
|
@ -2,6 +2,9 @@
|
||||||
* Common functions - can be used in frontend or backend
|
* Common functions - can be used in frontend or backend
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export function sleep(ms) {
|
export function sleep(ms) {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
|
@ -11,370 +14,3 @@ export function ucfirst(str) {
|
||||||
return firstLetter.toUpperCase() + str.substr(1);
|
return firstLetter.toUpperCase() + str.substr(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// From: https://stackoverflow.com/questions/38399465/how-to-get-list-of-all-timezones-in-javascript
|
|
||||||
const aryIannaTimeZones = [
|
|
||||||
'Europe/Andorra',
|
|
||||||
'Asia/Dubai',
|
|
||||||
'Asia/Kabul',
|
|
||||||
'Europe/Tirane',
|
|
||||||
'Asia/Yerevan',
|
|
||||||
'Antarctica/Casey',
|
|
||||||
'Antarctica/Davis',
|
|
||||||
'Antarctica/DumontDUrville', // https://bugs.chromium.org/p/chromium/issues/detail?id=928068
|
|
||||||
'Antarctica/Mawson',
|
|
||||||
'Antarctica/Palmer',
|
|
||||||
'Antarctica/Rothera',
|
|
||||||
'Antarctica/Syowa',
|
|
||||||
'Antarctica/Troll',
|
|
||||||
'Antarctica/Vostok',
|
|
||||||
'America/Argentina/Buenos_Aires',
|
|
||||||
'America/Argentina/Cordoba',
|
|
||||||
'America/Argentina/Salta',
|
|
||||||
'America/Argentina/Jujuy',
|
|
||||||
'America/Argentina/Tucuman',
|
|
||||||
'America/Argentina/Catamarca',
|
|
||||||
'America/Argentina/La_Rioja',
|
|
||||||
'America/Argentina/San_Juan',
|
|
||||||
'America/Argentina/Mendoza',
|
|
||||||
'America/Argentina/San_Luis',
|
|
||||||
'America/Argentina/Rio_Gallegos',
|
|
||||||
'America/Argentina/Ushuaia',
|
|
||||||
'Pacific/Pago_Pago',
|
|
||||||
'Europe/Vienna',
|
|
||||||
'Australia/Lord_Howe',
|
|
||||||
'Antarctica/Macquarie',
|
|
||||||
'Australia/Hobart',
|
|
||||||
'Australia/Currie',
|
|
||||||
'Australia/Melbourne',
|
|
||||||
'Australia/Sydney',
|
|
||||||
'Australia/Broken_Hill',
|
|
||||||
'Australia/Brisbane',
|
|
||||||
'Australia/Lindeman',
|
|
||||||
'Australia/Adelaide',
|
|
||||||
'Australia/Darwin',
|
|
||||||
'Australia/Perth',
|
|
||||||
'Australia/Eucla',
|
|
||||||
'Asia/Baku',
|
|
||||||
'America/Barbados',
|
|
||||||
'Asia/Dhaka',
|
|
||||||
'Europe/Brussels',
|
|
||||||
'Europe/Sofia',
|
|
||||||
'Atlantic/Bermuda',
|
|
||||||
'Asia/Brunei',
|
|
||||||
'America/La_Paz',
|
|
||||||
'America/Noronha',
|
|
||||||
'America/Belem',
|
|
||||||
'America/Fortaleza',
|
|
||||||
'America/Recife',
|
|
||||||
'America/Araguaina',
|
|
||||||
'America/Maceio',
|
|
||||||
'America/Bahia',
|
|
||||||
'America/Sao_Paulo',
|
|
||||||
'America/Campo_Grande',
|
|
||||||
'America/Cuiaba',
|
|
||||||
'America/Santarem',
|
|
||||||
'America/Porto_Velho',
|
|
||||||
'America/Boa_Vista',
|
|
||||||
'America/Manaus',
|
|
||||||
'America/Eirunepe',
|
|
||||||
'America/Rio_Branco',
|
|
||||||
'America/Nassau',
|
|
||||||
'Asia/Thimphu',
|
|
||||||
'Europe/Minsk',
|
|
||||||
'America/Belize',
|
|
||||||
'America/St_Johns',
|
|
||||||
'America/Halifax',
|
|
||||||
'America/Glace_Bay',
|
|
||||||
'America/Moncton',
|
|
||||||
'America/Goose_Bay',
|
|
||||||
'America/Blanc-Sablon',
|
|
||||||
'America/Toronto',
|
|
||||||
'America/Nipigon',
|
|
||||||
'America/Thunder_Bay',
|
|
||||||
'America/Iqaluit',
|
|
||||||
'America/Pangnirtung',
|
|
||||||
'America/Atikokan',
|
|
||||||
'America/Winnipeg',
|
|
||||||
'America/Rainy_River',
|
|
||||||
'America/Resolute',
|
|
||||||
'America/Rankin_Inlet',
|
|
||||||
'America/Regina',
|
|
||||||
'America/Swift_Current',
|
|
||||||
'America/Edmonton',
|
|
||||||
'America/Cambridge_Bay',
|
|
||||||
'America/Yellowknife',
|
|
||||||
'America/Inuvik',
|
|
||||||
'America/Creston',
|
|
||||||
'America/Dawson_Creek',
|
|
||||||
'America/Fort_Nelson',
|
|
||||||
'America/Vancouver',
|
|
||||||
'America/Whitehorse',
|
|
||||||
'America/Dawson',
|
|
||||||
'Indian/Cocos',
|
|
||||||
'Europe/Zurich',
|
|
||||||
'Africa/Abidjan',
|
|
||||||
'Pacific/Rarotonga',
|
|
||||||
'America/Santiago',
|
|
||||||
'America/Punta_Arenas',
|
|
||||||
'Pacific/Easter',
|
|
||||||
'Asia/Shanghai',
|
|
||||||
'Asia/Urumqi',
|
|
||||||
'America/Bogota',
|
|
||||||
'America/Costa_Rica',
|
|
||||||
'America/Havana',
|
|
||||||
'Atlantic/Cape_Verde',
|
|
||||||
'America/Curacao',
|
|
||||||
'Indian/Christmas',
|
|
||||||
'Asia/Nicosia',
|
|
||||||
'Asia/Famagusta',
|
|
||||||
'Europe/Prague',
|
|
||||||
'Europe/Berlin',
|
|
||||||
'Europe/Copenhagen',
|
|
||||||
'America/Santo_Domingo',
|
|
||||||
'Africa/Algiers',
|
|
||||||
'America/Guayaquil',
|
|
||||||
'Pacific/Galapagos',
|
|
||||||
'Europe/Tallinn',
|
|
||||||
'Africa/Cairo',
|
|
||||||
'Africa/El_Aaiun',
|
|
||||||
'Europe/Madrid',
|
|
||||||
'Africa/Ceuta',
|
|
||||||
'Atlantic/Canary',
|
|
||||||
'Europe/Helsinki',
|
|
||||||
'Pacific/Fiji',
|
|
||||||
'Atlantic/Stanley',
|
|
||||||
'Pacific/Chuuk',
|
|
||||||
'Pacific/Pohnpei',
|
|
||||||
'Pacific/Kosrae',
|
|
||||||
'Atlantic/Faroe',
|
|
||||||
'Europe/Paris',
|
|
||||||
'Europe/London',
|
|
||||||
'Asia/Tbilisi',
|
|
||||||
'America/Cayenne',
|
|
||||||
'Africa/Accra',
|
|
||||||
'Europe/Gibraltar',
|
|
||||||
'America/Godthab',
|
|
||||||
'America/Danmarkshavn',
|
|
||||||
'America/Scoresbysund',
|
|
||||||
'America/Thule',
|
|
||||||
'Europe/Athens',
|
|
||||||
'Atlantic/South_Georgia',
|
|
||||||
'America/Guatemala',
|
|
||||||
'Pacific/Guam',
|
|
||||||
'Africa/Bissau',
|
|
||||||
'America/Guyana',
|
|
||||||
'Asia/Hong_Kong',
|
|
||||||
'America/Tegucigalpa',
|
|
||||||
'America/Port-au-Prince',
|
|
||||||
'Europe/Budapest',
|
|
||||||
'Asia/Jakarta',
|
|
||||||
'Asia/Pontianak',
|
|
||||||
'Asia/Makassar',
|
|
||||||
'Asia/Jayapura',
|
|
||||||
'Europe/Dublin',
|
|
||||||
'Asia/Jerusalem',
|
|
||||||
'Asia/Kolkata',
|
|
||||||
'Indian/Chagos',
|
|
||||||
'Asia/Baghdad',
|
|
||||||
'Asia/Tehran',
|
|
||||||
'Atlantic/Reykjavik',
|
|
||||||
'Europe/Rome',
|
|
||||||
'America/Jamaica',
|
|
||||||
'Asia/Amman',
|
|
||||||
'Asia/Tokyo',
|
|
||||||
'Africa/Nairobi',
|
|
||||||
'Asia/Bishkek',
|
|
||||||
'Pacific/Tarawa',
|
|
||||||
'Pacific/Enderbury',
|
|
||||||
'Pacific/Kiritimati',
|
|
||||||
'Asia/Pyongyang',
|
|
||||||
'Asia/Seoul',
|
|
||||||
'Asia/Almaty',
|
|
||||||
'Asia/Qyzylorda',
|
|
||||||
'Asia/Qostanay', // https://bugs.chromium.org/p/chromium/issues/detail?id=928068
|
|
||||||
'Asia/Aqtobe',
|
|
||||||
'Asia/Aqtau',
|
|
||||||
'Asia/Atyrau',
|
|
||||||
'Asia/Oral',
|
|
||||||
'Asia/Beirut',
|
|
||||||
'Asia/Colombo',
|
|
||||||
'Africa/Monrovia',
|
|
||||||
'Europe/Vilnius',
|
|
||||||
'Europe/Luxembourg',
|
|
||||||
'Europe/Riga',
|
|
||||||
'Africa/Tripoli',
|
|
||||||
'Africa/Casablanca',
|
|
||||||
'Europe/Monaco',
|
|
||||||
'Europe/Chisinau',
|
|
||||||
'Pacific/Majuro',
|
|
||||||
'Pacific/Kwajalein',
|
|
||||||
'Asia/Yangon',
|
|
||||||
'Asia/Ulaanbaatar',
|
|
||||||
'Asia/Hovd',
|
|
||||||
'Asia/Choibalsan',
|
|
||||||
'Asia/Macau',
|
|
||||||
'America/Martinique',
|
|
||||||
'Europe/Malta',
|
|
||||||
'Indian/Mauritius',
|
|
||||||
'Indian/Maldives',
|
|
||||||
'America/Mexico_City',
|
|
||||||
'America/Cancun',
|
|
||||||
'America/Merida',
|
|
||||||
'America/Monterrey',
|
|
||||||
'America/Matamoros',
|
|
||||||
'America/Mazatlan',
|
|
||||||
'America/Chihuahua',
|
|
||||||
'America/Ojinaga',
|
|
||||||
'America/Hermosillo',
|
|
||||||
'America/Tijuana',
|
|
||||||
'America/Bahia_Banderas',
|
|
||||||
'Asia/Kuala_Lumpur',
|
|
||||||
'Asia/Kuching',
|
|
||||||
'Africa/Maputo',
|
|
||||||
'Africa/Windhoek',
|
|
||||||
'Pacific/Noumea',
|
|
||||||
'Pacific/Norfolk',
|
|
||||||
'Africa/Lagos',
|
|
||||||
'America/Managua',
|
|
||||||
'Europe/Amsterdam',
|
|
||||||
'Europe/Oslo',
|
|
||||||
'Asia/Kathmandu',
|
|
||||||
'Pacific/Nauru',
|
|
||||||
'Pacific/Niue',
|
|
||||||
'Pacific/Auckland',
|
|
||||||
'Pacific/Chatham',
|
|
||||||
'America/Panama',
|
|
||||||
'America/Lima',
|
|
||||||
'Pacific/Tahiti',
|
|
||||||
'Pacific/Marquesas',
|
|
||||||
'Pacific/Gambier',
|
|
||||||
'Pacific/Port_Moresby',
|
|
||||||
'Pacific/Bougainville',
|
|
||||||
'Asia/Manila',
|
|
||||||
'Asia/Karachi',
|
|
||||||
'Europe/Warsaw',
|
|
||||||
'America/Miquelon',
|
|
||||||
'Pacific/Pitcairn',
|
|
||||||
'America/Puerto_Rico',
|
|
||||||
'Asia/Gaza',
|
|
||||||
'Asia/Hebron',
|
|
||||||
'Europe/Lisbon',
|
|
||||||
'Atlantic/Madeira',
|
|
||||||
'Atlantic/Azores',
|
|
||||||
'Pacific/Palau',
|
|
||||||
'America/Asuncion',
|
|
||||||
'Asia/Qatar',
|
|
||||||
'Indian/Reunion',
|
|
||||||
'Europe/Bucharest',
|
|
||||||
'Europe/Belgrade',
|
|
||||||
'Europe/Kaliningrad',
|
|
||||||
'Europe/Moscow',
|
|
||||||
'Europe/Simferopol',
|
|
||||||
'Europe/Kirov',
|
|
||||||
'Europe/Astrakhan',
|
|
||||||
'Europe/Volgograd',
|
|
||||||
'Europe/Saratov',
|
|
||||||
'Europe/Ulyanovsk',
|
|
||||||
'Europe/Samara',
|
|
||||||
'Asia/Yekaterinburg',
|
|
||||||
'Asia/Omsk',
|
|
||||||
'Asia/Novosibirsk',
|
|
||||||
'Asia/Barnaul',
|
|
||||||
'Asia/Tomsk',
|
|
||||||
'Asia/Novokuznetsk',
|
|
||||||
'Asia/Krasnoyarsk',
|
|
||||||
'Asia/Irkutsk',
|
|
||||||
'Asia/Chita',
|
|
||||||
'Asia/Yakutsk',
|
|
||||||
'Asia/Khandyga',
|
|
||||||
'Asia/Vladivostok',
|
|
||||||
'Asia/Ust-Nera',
|
|
||||||
'Asia/Magadan',
|
|
||||||
'Asia/Sakhalin',
|
|
||||||
'Asia/Srednekolymsk',
|
|
||||||
'Asia/Kamchatka',
|
|
||||||
'Asia/Anadyr',
|
|
||||||
'Asia/Riyadh',
|
|
||||||
'Pacific/Guadalcanal',
|
|
||||||
'Indian/Mahe',
|
|
||||||
'Africa/Khartoum',
|
|
||||||
'Europe/Stockholm',
|
|
||||||
'Asia/Singapore',
|
|
||||||
'America/Paramaribo',
|
|
||||||
'Africa/Juba',
|
|
||||||
'Africa/Sao_Tome',
|
|
||||||
'America/El_Salvador',
|
|
||||||
'Asia/Damascus',
|
|
||||||
'America/Grand_Turk',
|
|
||||||
'Africa/Ndjamena',
|
|
||||||
'Indian/Kerguelen',
|
|
||||||
'Asia/Bangkok',
|
|
||||||
'Asia/Dushanbe',
|
|
||||||
'Pacific/Fakaofo',
|
|
||||||
'Asia/Dili',
|
|
||||||
'Asia/Ashgabat',
|
|
||||||
'Africa/Tunis',
|
|
||||||
'Pacific/Tongatapu',
|
|
||||||
'Europe/Istanbul',
|
|
||||||
'America/Port_of_Spain',
|
|
||||||
'Pacific/Funafuti',
|
|
||||||
'Asia/Taipei',
|
|
||||||
'Europe/Kiev',
|
|
||||||
'Europe/Uzhgorod',
|
|
||||||
'Europe/Zaporozhye',
|
|
||||||
'Pacific/Wake',
|
|
||||||
'America/New_York',
|
|
||||||
'America/Detroit',
|
|
||||||
'America/Kentucky/Louisville',
|
|
||||||
'America/Kentucky/Monticello',
|
|
||||||
'America/Indiana/Indianapolis',
|
|
||||||
'America/Indiana/Vincennes',
|
|
||||||
'America/Indiana/Winamac',
|
|
||||||
'America/Indiana/Marengo',
|
|
||||||
'America/Indiana/Petersburg',
|
|
||||||
'America/Indiana/Vevay',
|
|
||||||
'America/Chicago',
|
|
||||||
'America/Indiana/Tell_City',
|
|
||||||
'America/Indiana/Knox',
|
|
||||||
'America/Menominee',
|
|
||||||
'America/North_Dakota/Center',
|
|
||||||
'America/North_Dakota/New_Salem',
|
|
||||||
'America/North_Dakota/Beulah',
|
|
||||||
'America/Denver',
|
|
||||||
'America/Boise',
|
|
||||||
'America/Phoenix',
|
|
||||||
'America/Los_Angeles',
|
|
||||||
'America/Anchorage',
|
|
||||||
'America/Juneau',
|
|
||||||
'America/Sitka',
|
|
||||||
'America/Metlakatla',
|
|
||||||
'America/Yakutat',
|
|
||||||
'America/Nome',
|
|
||||||
'America/Adak',
|
|
||||||
'Pacific/Honolulu',
|
|
||||||
'America/Montevideo',
|
|
||||||
'Asia/Samarkand',
|
|
||||||
'Asia/Tashkent',
|
|
||||||
'America/Caracas',
|
|
||||||
'Asia/Ho_Chi_Minh',
|
|
||||||
'Pacific/Efate',
|
|
||||||
'Pacific/Wallis',
|
|
||||||
'Pacific/Apia',
|
|
||||||
'Africa/Johannesburg'
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
export function timezoneList() {
|
|
||||||
let result = [];
|
|
||||||
|
|
||||||
for (let timezone of aryIannaTimeZones) {
|
|
||||||
result.push({
|
|
||||||
name: timezone,
|
|
||||||
value: timezone,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,8 @@ export default {
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
displayText() {
|
displayText() {
|
||||||
return this.value
|
let format = "YYYY-MM-DD HH:mm:ss";
|
||||||
|
return dayjs.utc(this.value).tz(this.$root.timezone).format(format)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<label for="floatingPassword">Password</label>
|
<label for="floatingPassword">Password</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-check mb-3 mt-3">
|
<div class="form-check mb-3 mt-3" >
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" value="remember-me" class="form-check-input" id="remember" v-model="remember">
|
<input type="checkbox" value="remember-me" class="form-check-input" id="remember" v-model="remember">
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import {io} from "socket.io-client";
|
import {io} from "socket.io-client";
|
||||||
import { useToast } from 'vue-toastification'
|
import { useToast } from 'vue-toastification'
|
||||||
|
import dayjs from "dayjs";
|
||||||
const toast = useToast()
|
const toast = useToast()
|
||||||
|
|
||||||
let storage = localStorage;
|
let storage = localStorage;
|
||||||
|
@ -15,6 +16,7 @@ export default {
|
||||||
connected: false,
|
connected: false,
|
||||||
connectCount: 0,
|
connectCount: 0,
|
||||||
},
|
},
|
||||||
|
userTimezone: localStorage.timezone || "auto",
|
||||||
allowLoginDialog: false, // Allowed to show login dialog, but "loggedIn" have to be true too. This exists because prevent the login dialog show 0.1s in first before the socket server auth-ed.
|
allowLoginDialog: false, // Allowed to show login dialog, but "loggedIn" have to be true too. This exists because prevent the login dialog show 0.1s in first before the socket server auth-ed.
|
||||||
loggedIn: false,
|
loggedIn: false,
|
||||||
monitorList: { },
|
monitorList: { },
|
||||||
|
@ -26,7 +28,7 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
socket = io("http://localhost:3001", {
|
socket = io(":3001", {
|
||||||
transports: ['websocket']
|
transports: ['websocket']
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -186,6 +188,17 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
|
|
||||||
|
timezone() {
|
||||||
|
|
||||||
|
if (this.userTimezone === "auto") {
|
||||||
|
return dayjs.tz.guess()
|
||||||
|
} else {
|
||||||
|
return this.userTimezone
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
lastHeartbeatList() {
|
lastHeartbeatList() {
|
||||||
let result = {}
|
let result = {}
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
|
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h2>General</h2>
|
<h2>General</h2>
|
||||||
<form class="mb-3">
|
<form class="mb-3" @submit.prevent="saveGeneral">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="timezone" class="form-label">Timezone</label>
|
<label for="timezone" class="form-label">Timezone</label>
|
||||||
<select class="form-select" aria-label="Default select example" id="timezone">
|
<select class="form-select" id="timezone" v-model="$root.userTimezone">
|
||||||
<option name="auto">Auto: {{ guessTimezone }}</option>
|
<option value="auto">Auto: {{ guessTimezone }}</option>
|
||||||
<option v-for="timezone in timezoneList" :value="timezone.value">{{ timezone.name }}</option>
|
<option v-for="timezone in timezoneList" :value="timezone.value">{{ timezone.name }}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -68,7 +68,9 @@ import utc from 'dayjs/plugin/utc'
|
||||||
import timezone from 'dayjs/plugin/timezone'
|
import timezone from 'dayjs/plugin/timezone'
|
||||||
dayjs.extend(utc)
|
dayjs.extend(utc)
|
||||||
dayjs.extend(timezone)
|
dayjs.extend(timezone)
|
||||||
import {timezoneList} from "../../server/util";
|
import {timezoneList} from "../util-frontend";
|
||||||
|
import { useToast } from 'vue-toastification'
|
||||||
|
const toast = useToast()
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
@ -78,6 +80,7 @@ export default {
|
||||||
return {
|
return {
|
||||||
timezoneList: timezoneList(),
|
timezoneList: timezoneList(),
|
||||||
guessTimezone: dayjs.tz.guess(),
|
guessTimezone: dayjs.tz.guess(),
|
||||||
|
|
||||||
invalidPassword: false,
|
invalidPassword: false,
|
||||||
password: {
|
password: {
|
||||||
currentPassword: "",
|
currentPassword: "",
|
||||||
|
@ -86,7 +89,18 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
|
saveGeneral() {
|
||||||
|
localStorage.timezone = this.$root.userTimezone;
|
||||||
|
toast.success("Saved.")
|
||||||
|
},
|
||||||
|
|
||||||
savePassword() {
|
savePassword() {
|
||||||
if (this.password.newPassword !== this.password.repeatNewPassword) {
|
if (this.password.newPassword !== this.password.repeatNewPassword) {
|
||||||
this.invalidPassword = true;
|
this.invalidPassword = true;
|
||||||
|
|
397
src/util-frontend.js
Normal file
397
src/util-frontend.js
Normal file
|
@ -0,0 +1,397 @@
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
import utc from 'dayjs/plugin/utc'
|
||||||
|
import timezone from 'dayjs/plugin/timezone'
|
||||||
|
|
||||||
|
dayjs.extend(utc)
|
||||||
|
dayjs.extend(timezone)
|
||||||
|
|
||||||
|
|
||||||
|
function getTimezoneOffset(timeZone) {
|
||||||
|
const now = new Date();
|
||||||
|
const tzString = now.toLocaleString('en-US', { timeZone });
|
||||||
|
const localString = now.toLocaleString('en-US');
|
||||||
|
const diff = (Date.parse(localString) - Date.parse(tzString)) / 3600000;
|
||||||
|
const offset = diff + now.getTimezoneOffset() / 60;
|
||||||
|
return -offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// From: https://stackoverflow.com/questions/38399465/how-to-get-list-of-all-timezones-in-javascript
|
||||||
|
const aryIannaTimeZones = [
|
||||||
|
'Europe/Andorra',
|
||||||
|
'Asia/Dubai',
|
||||||
|
'Asia/Kabul',
|
||||||
|
'Europe/Tirane',
|
||||||
|
'Asia/Yerevan',
|
||||||
|
'Antarctica/Casey',
|
||||||
|
'Antarctica/Davis',
|
||||||
|
'Antarctica/DumontDUrville', // https://bugs.chromium.org/p/chromium/issues/detail?id=928068
|
||||||
|
'Antarctica/Mawson',
|
||||||
|
'Antarctica/Palmer',
|
||||||
|
'Antarctica/Rothera',
|
||||||
|
'Antarctica/Syowa',
|
||||||
|
'Antarctica/Troll',
|
||||||
|
'Antarctica/Vostok',
|
||||||
|
'America/Argentina/Buenos_Aires',
|
||||||
|
'America/Argentina/Cordoba',
|
||||||
|
'America/Argentina/Salta',
|
||||||
|
'America/Argentina/Jujuy',
|
||||||
|
'America/Argentina/Tucuman',
|
||||||
|
'America/Argentina/Catamarca',
|
||||||
|
'America/Argentina/La_Rioja',
|
||||||
|
'America/Argentina/San_Juan',
|
||||||
|
'America/Argentina/Mendoza',
|
||||||
|
'America/Argentina/San_Luis',
|
||||||
|
'America/Argentina/Rio_Gallegos',
|
||||||
|
'America/Argentina/Ushuaia',
|
||||||
|
'Pacific/Pago_Pago',
|
||||||
|
'Europe/Vienna',
|
||||||
|
'Australia/Lord_Howe',
|
||||||
|
'Antarctica/Macquarie',
|
||||||
|
'Australia/Hobart',
|
||||||
|
'Australia/Currie',
|
||||||
|
'Australia/Melbourne',
|
||||||
|
'Australia/Sydney',
|
||||||
|
'Australia/Broken_Hill',
|
||||||
|
'Australia/Brisbane',
|
||||||
|
'Australia/Lindeman',
|
||||||
|
'Australia/Adelaide',
|
||||||
|
'Australia/Darwin',
|
||||||
|
'Australia/Perth',
|
||||||
|
'Australia/Eucla',
|
||||||
|
'Asia/Baku',
|
||||||
|
'America/Barbados',
|
||||||
|
'Asia/Dhaka',
|
||||||
|
'Europe/Brussels',
|
||||||
|
'Europe/Sofia',
|
||||||
|
'Atlantic/Bermuda',
|
||||||
|
'Asia/Brunei',
|
||||||
|
'America/La_Paz',
|
||||||
|
'America/Noronha',
|
||||||
|
'America/Belem',
|
||||||
|
'America/Fortaleza',
|
||||||
|
'America/Recife',
|
||||||
|
'America/Araguaina',
|
||||||
|
'America/Maceio',
|
||||||
|
'America/Bahia',
|
||||||
|
'America/Sao_Paulo',
|
||||||
|
'America/Campo_Grande',
|
||||||
|
'America/Cuiaba',
|
||||||
|
'America/Santarem',
|
||||||
|
'America/Porto_Velho',
|
||||||
|
'America/Boa_Vista',
|
||||||
|
'America/Manaus',
|
||||||
|
'America/Eirunepe',
|
||||||
|
'America/Rio_Branco',
|
||||||
|
'America/Nassau',
|
||||||
|
'Asia/Thimphu',
|
||||||
|
'Europe/Minsk',
|
||||||
|
'America/Belize',
|
||||||
|
'America/St_Johns',
|
||||||
|
'America/Halifax',
|
||||||
|
'America/Glace_Bay',
|
||||||
|
'America/Moncton',
|
||||||
|
'America/Goose_Bay',
|
||||||
|
'America/Blanc-Sablon',
|
||||||
|
'America/Toronto',
|
||||||
|
'America/Nipigon',
|
||||||
|
'America/Thunder_Bay',
|
||||||
|
'America/Iqaluit',
|
||||||
|
'America/Pangnirtung',
|
||||||
|
'America/Atikokan',
|
||||||
|
'America/Winnipeg',
|
||||||
|
'America/Rainy_River',
|
||||||
|
'America/Resolute',
|
||||||
|
'America/Rankin_Inlet',
|
||||||
|
'America/Regina',
|
||||||
|
'America/Swift_Current',
|
||||||
|
'America/Edmonton',
|
||||||
|
'America/Cambridge_Bay',
|
||||||
|
'America/Yellowknife',
|
||||||
|
'America/Inuvik',
|
||||||
|
'America/Creston',
|
||||||
|
'America/Dawson_Creek',
|
||||||
|
'America/Fort_Nelson',
|
||||||
|
'America/Vancouver',
|
||||||
|
'America/Whitehorse',
|
||||||
|
'America/Dawson',
|
||||||
|
'Indian/Cocos',
|
||||||
|
'Europe/Zurich',
|
||||||
|
'Africa/Abidjan',
|
||||||
|
'Pacific/Rarotonga',
|
||||||
|
'America/Santiago',
|
||||||
|
'America/Punta_Arenas',
|
||||||
|
'Pacific/Easter',
|
||||||
|
'Asia/Shanghai',
|
||||||
|
'Asia/Urumqi',
|
||||||
|
'America/Bogota',
|
||||||
|
'America/Costa_Rica',
|
||||||
|
'America/Havana',
|
||||||
|
'Atlantic/Cape_Verde',
|
||||||
|
'America/Curacao',
|
||||||
|
'Indian/Christmas',
|
||||||
|
'Asia/Nicosia',
|
||||||
|
'Asia/Famagusta',
|
||||||
|
'Europe/Prague',
|
||||||
|
'Europe/Berlin',
|
||||||
|
'Europe/Copenhagen',
|
||||||
|
'America/Santo_Domingo',
|
||||||
|
'Africa/Algiers',
|
||||||
|
'America/Guayaquil',
|
||||||
|
'Pacific/Galapagos',
|
||||||
|
'Europe/Tallinn',
|
||||||
|
'Africa/Cairo',
|
||||||
|
'Africa/El_Aaiun',
|
||||||
|
'Europe/Madrid',
|
||||||
|
'Africa/Ceuta',
|
||||||
|
'Atlantic/Canary',
|
||||||
|
'Europe/Helsinki',
|
||||||
|
'Pacific/Fiji',
|
||||||
|
'Atlantic/Stanley',
|
||||||
|
'Pacific/Chuuk',
|
||||||
|
'Pacific/Pohnpei',
|
||||||
|
'Pacific/Kosrae',
|
||||||
|
'Atlantic/Faroe',
|
||||||
|
'Europe/Paris',
|
||||||
|
'Europe/London',
|
||||||
|
'Asia/Tbilisi',
|
||||||
|
'America/Cayenne',
|
||||||
|
'Africa/Accra',
|
||||||
|
'Europe/Gibraltar',
|
||||||
|
'America/Godthab',
|
||||||
|
'America/Danmarkshavn',
|
||||||
|
'America/Scoresbysund',
|
||||||
|
'America/Thule',
|
||||||
|
'Europe/Athens',
|
||||||
|
'Atlantic/South_Georgia',
|
||||||
|
'America/Guatemala',
|
||||||
|
'Pacific/Guam',
|
||||||
|
'Africa/Bissau',
|
||||||
|
'America/Guyana',
|
||||||
|
'Asia/Hong_Kong',
|
||||||
|
'America/Tegucigalpa',
|
||||||
|
'America/Port-au-Prince',
|
||||||
|
'Europe/Budapest',
|
||||||
|
'Asia/Jakarta',
|
||||||
|
'Asia/Pontianak',
|
||||||
|
'Asia/Makassar',
|
||||||
|
'Asia/Jayapura',
|
||||||
|
'Europe/Dublin',
|
||||||
|
'Asia/Jerusalem',
|
||||||
|
'Asia/Kolkata',
|
||||||
|
'Indian/Chagos',
|
||||||
|
'Asia/Baghdad',
|
||||||
|
'Asia/Tehran',
|
||||||
|
'Atlantic/Reykjavik',
|
||||||
|
'Europe/Rome',
|
||||||
|
'America/Jamaica',
|
||||||
|
'Asia/Amman',
|
||||||
|
'Asia/Tokyo',
|
||||||
|
'Africa/Nairobi',
|
||||||
|
'Asia/Bishkek',
|
||||||
|
'Pacific/Tarawa',
|
||||||
|
'Pacific/Enderbury',
|
||||||
|
'Pacific/Kiritimati',
|
||||||
|
'Asia/Pyongyang',
|
||||||
|
'Asia/Seoul',
|
||||||
|
'Asia/Almaty',
|
||||||
|
'Asia/Qyzylorda',
|
||||||
|
'Asia/Qostanay', // https://bugs.chromium.org/p/chromium/issues/detail?id=928068
|
||||||
|
'Asia/Aqtobe',
|
||||||
|
'Asia/Aqtau',
|
||||||
|
'Asia/Atyrau',
|
||||||
|
'Asia/Oral',
|
||||||
|
'Asia/Beirut',
|
||||||
|
'Asia/Colombo',
|
||||||
|
'Africa/Monrovia',
|
||||||
|
'Europe/Vilnius',
|
||||||
|
'Europe/Luxembourg',
|
||||||
|
'Europe/Riga',
|
||||||
|
'Africa/Tripoli',
|
||||||
|
'Africa/Casablanca',
|
||||||
|
'Europe/Monaco',
|
||||||
|
'Europe/Chisinau',
|
||||||
|
'Pacific/Majuro',
|
||||||
|
'Pacific/Kwajalein',
|
||||||
|
'Asia/Yangon',
|
||||||
|
'Asia/Ulaanbaatar',
|
||||||
|
'Asia/Hovd',
|
||||||
|
'Asia/Choibalsan',
|
||||||
|
'Asia/Macau',
|
||||||
|
'America/Martinique',
|
||||||
|
'Europe/Malta',
|
||||||
|
'Indian/Mauritius',
|
||||||
|
'Indian/Maldives',
|
||||||
|
'America/Mexico_City',
|
||||||
|
'America/Cancun',
|
||||||
|
'America/Merida',
|
||||||
|
'America/Monterrey',
|
||||||
|
'America/Matamoros',
|
||||||
|
'America/Mazatlan',
|
||||||
|
'America/Chihuahua',
|
||||||
|
'America/Ojinaga',
|
||||||
|
'America/Hermosillo',
|
||||||
|
'America/Tijuana',
|
||||||
|
'America/Bahia_Banderas',
|
||||||
|
'Asia/Kuala_Lumpur',
|
||||||
|
'Asia/Kuching',
|
||||||
|
'Africa/Maputo',
|
||||||
|
'Africa/Windhoek',
|
||||||
|
'Pacific/Noumea',
|
||||||
|
'Pacific/Norfolk',
|
||||||
|
'Africa/Lagos',
|
||||||
|
'America/Managua',
|
||||||
|
'Europe/Amsterdam',
|
||||||
|
'Europe/Oslo',
|
||||||
|
'Asia/Kathmandu',
|
||||||
|
'Pacific/Nauru',
|
||||||
|
'Pacific/Niue',
|
||||||
|
'Pacific/Auckland',
|
||||||
|
'Pacific/Chatham',
|
||||||
|
'America/Panama',
|
||||||
|
'America/Lima',
|
||||||
|
'Pacific/Tahiti',
|
||||||
|
'Pacific/Marquesas',
|
||||||
|
'Pacific/Gambier',
|
||||||
|
'Pacific/Port_Moresby',
|
||||||
|
'Pacific/Bougainville',
|
||||||
|
'Asia/Manila',
|
||||||
|
'Asia/Karachi',
|
||||||
|
'Europe/Warsaw',
|
||||||
|
'America/Miquelon',
|
||||||
|
'Pacific/Pitcairn',
|
||||||
|
'America/Puerto_Rico',
|
||||||
|
'Asia/Gaza',
|
||||||
|
'Asia/Hebron',
|
||||||
|
'Europe/Lisbon',
|
||||||
|
'Atlantic/Madeira',
|
||||||
|
'Atlantic/Azores',
|
||||||
|
'Pacific/Palau',
|
||||||
|
'America/Asuncion',
|
||||||
|
'Asia/Qatar',
|
||||||
|
'Indian/Reunion',
|
||||||
|
'Europe/Bucharest',
|
||||||
|
'Europe/Belgrade',
|
||||||
|
'Europe/Kaliningrad',
|
||||||
|
'Europe/Moscow',
|
||||||
|
'Europe/Simferopol',
|
||||||
|
'Europe/Kirov',
|
||||||
|
'Europe/Astrakhan',
|
||||||
|
'Europe/Volgograd',
|
||||||
|
'Europe/Saratov',
|
||||||
|
'Europe/Ulyanovsk',
|
||||||
|
'Europe/Samara',
|
||||||
|
'Asia/Yekaterinburg',
|
||||||
|
'Asia/Omsk',
|
||||||
|
'Asia/Novosibirsk',
|
||||||
|
'Asia/Barnaul',
|
||||||
|
'Asia/Tomsk',
|
||||||
|
'Asia/Novokuznetsk',
|
||||||
|
'Asia/Krasnoyarsk',
|
||||||
|
'Asia/Irkutsk',
|
||||||
|
'Asia/Chita',
|
||||||
|
'Asia/Yakutsk',
|
||||||
|
'Asia/Khandyga',
|
||||||
|
'Asia/Vladivostok',
|
||||||
|
'Asia/Ust-Nera',
|
||||||
|
'Asia/Magadan',
|
||||||
|
'Asia/Sakhalin',
|
||||||
|
'Asia/Srednekolymsk',
|
||||||
|
'Asia/Kamchatka',
|
||||||
|
'Asia/Anadyr',
|
||||||
|
'Asia/Riyadh',
|
||||||
|
'Pacific/Guadalcanal',
|
||||||
|
'Indian/Mahe',
|
||||||
|
'Africa/Khartoum',
|
||||||
|
'Europe/Stockholm',
|
||||||
|
'Asia/Singapore',
|
||||||
|
'America/Paramaribo',
|
||||||
|
'Africa/Juba',
|
||||||
|
'Africa/Sao_Tome',
|
||||||
|
'America/El_Salvador',
|
||||||
|
'Asia/Damascus',
|
||||||
|
'America/Grand_Turk',
|
||||||
|
'Africa/Ndjamena',
|
||||||
|
'Indian/Kerguelen',
|
||||||
|
'Asia/Bangkok',
|
||||||
|
'Asia/Dushanbe',
|
||||||
|
'Pacific/Fakaofo',
|
||||||
|
'Asia/Dili',
|
||||||
|
'Asia/Ashgabat',
|
||||||
|
'Africa/Tunis',
|
||||||
|
'Pacific/Tongatapu',
|
||||||
|
'Europe/Istanbul',
|
||||||
|
'America/Port_of_Spain',
|
||||||
|
'Pacific/Funafuti',
|
||||||
|
'Asia/Taipei',
|
||||||
|
'Europe/Kiev',
|
||||||
|
'Europe/Uzhgorod',
|
||||||
|
'Europe/Zaporozhye',
|
||||||
|
'Pacific/Wake',
|
||||||
|
'America/New_York',
|
||||||
|
'America/Detroit',
|
||||||
|
'America/Kentucky/Louisville',
|
||||||
|
'America/Kentucky/Monticello',
|
||||||
|
'America/Indiana/Indianapolis',
|
||||||
|
'America/Indiana/Vincennes',
|
||||||
|
'America/Indiana/Winamac',
|
||||||
|
'America/Indiana/Marengo',
|
||||||
|
'America/Indiana/Petersburg',
|
||||||
|
'America/Indiana/Vevay',
|
||||||
|
'America/Chicago',
|
||||||
|
'America/Indiana/Tell_City',
|
||||||
|
'America/Indiana/Knox',
|
||||||
|
'America/Menominee',
|
||||||
|
'America/North_Dakota/Center',
|
||||||
|
'America/North_Dakota/New_Salem',
|
||||||
|
'America/North_Dakota/Beulah',
|
||||||
|
'America/Denver',
|
||||||
|
'America/Boise',
|
||||||
|
'America/Phoenix',
|
||||||
|
'America/Los_Angeles',
|
||||||
|
'America/Anchorage',
|
||||||
|
'America/Juneau',
|
||||||
|
'America/Sitka',
|
||||||
|
'America/Metlakatla',
|
||||||
|
'America/Yakutat',
|
||||||
|
'America/Nome',
|
||||||
|
'America/Adak',
|
||||||
|
'Pacific/Honolulu',
|
||||||
|
'America/Montevideo',
|
||||||
|
'Asia/Samarkand',
|
||||||
|
'Asia/Tashkent',
|
||||||
|
'America/Caracas',
|
||||||
|
'Asia/Ho_Chi_Minh',
|
||||||
|
'Pacific/Efate',
|
||||||
|
'Pacific/Wallis',
|
||||||
|
'Pacific/Apia',
|
||||||
|
'Africa/Johannesburg'
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
export function timezoneList() {
|
||||||
|
let result = [];
|
||||||
|
|
||||||
|
for (let timezone of aryIannaTimeZones) {
|
||||||
|
|
||||||
|
let display = dayjs().tz(timezone).format("Z");
|
||||||
|
|
||||||
|
result.push({
|
||||||
|
name: `(UTC${display}) ${timezone}`,
|
||||||
|
value: timezone,
|
||||||
|
time: getTimezoneOffset(timezone),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
result.sort((a, b) => {
|
||||||
|
if (a.time > b.time) {
|
||||||
|
return 1;
|
||||||
|
} else if (b.time > a.time) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in a new issue