ngx-timezones
Version:
An Angular module for timezones (based on moment.js)
832 lines (825 loc) • 29.8 kB
JavaScript
import { EventEmitter, Component, ChangeDetectorRef, Output, Input, NgModule } from '@angular/core';
import { FormControl, ReactiveFormsModule, FormsModule } from '@angular/forms';
import { tz } from 'moment-timezone';
import { startWith, map } from 'rxjs/operators';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgxMatSelectSearchModule } from 'ngx-mat-select-search';
import { MatSelectModule } from '@angular/material/select';
import { MatFormFieldModule } from '@angular/material/form-field';
const countryZones = {
AD: { name: 'Andorra', zones: ['Europe/Andorra'] },
AE: { name: 'United Arab Emirates', zones: ['Asia/Dubai'] },
AF: { name: 'Afghanistan', zones: ['Asia/Kabul'] },
AG: {
name: 'Antigua & Barbuda',
zones: ['America/Antigua'],
},
AI: {
name: 'Anguilla',
zones: ['America/Anguilla'],
},
AL: { name: 'Albania', zones: ['Europe/Tirane'] },
AM: { name: 'Armenia', zones: ['Asia/Yerevan'] },
AO: { name: 'Angola', zones: ['Africa/Lagos', 'Africa/Luanda'] },
AQ: {
name: 'Antarctica',
zones: [
'Antarctica/Casey',
'Antarctica/Davis',
'Antarctica/DumontDUrville',
'Antarctica/Mawson',
'Antarctica/Palmer',
'Antarctica/Rothera',
'Antarctica/Syowa',
'Antarctica/Troll',
'Antarctica/Vostok',
'Pacific/Auckland',
'Antarctica/McMurdo',
],
},
AR: {
name: 'Argentina',
zones: [
'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',
],
},
AS: { name: 'Samoa (American)', zones: ['Pacific/Pago_Pago'] },
AT: { name: 'Austria', zones: ['Europe/Vienna'] },
AU: {
name: 'Australia',
zones: [
'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',
],
},
AW: { name: 'Aruba', zones: ['America/Curacao', 'America/Aruba'] },
AX: {
name: 'Åland Islands',
zones: ['Europe/Helsinki', 'Europe/Mariehamn'],
},
AZ: { name: 'Azerbaijan', zones: ['Asia/Baku'] },
BA: {
name: 'Bosnia & Herzegovina',
zones: ['Europe/Belgrade', 'Europe/Sarajevo'],
},
BB: { name: 'Barbados', zones: ['America/Barbados'] },
BD: { name: 'Bangladesh', zones: ['Asia/Dhaka'] },
BE: { name: 'Belgium', zones: ['Europe/Brussels'] },
BF: {
name: 'Burkina Faso',
zones: ['Africa/Abidjan', 'Africa/Ouagadougou'],
},
BG: { name: 'Bulgaria', zones: ['Europe/Sofia'] },
BH: { name: 'Bahrain', zones: ['Asia/Qatar', 'Asia/Bahrain'] },
BI: { name: 'Burundi', zones: ['Africa/Maputo', 'Africa/Bujumbura'] },
BJ: { name: 'Benin', zones: ['Africa/Lagos', 'Africa/Porto-Novo'] },
BL: {
name: 'St Barthelemy',
zones: ['America/St_Barthelemy'],
},
BM: { name: 'Bermuda', zones: ['Atlantic/Bermuda'] },
BN: { name: 'Brunei', zones: ['Asia/Brunei'] },
BO: { name: 'Bolivia', zones: ['America/La_Paz'] },
BQ: {
name: 'Caribbean NL',
zones: ['America/Curacao', 'America/Kralendijk'],
},
BR: {
name: 'Brazil',
zones: [
'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',
],
},
BS: { name: 'Bahamas', zones: ['America/Nassau'] },
BT: { name: 'Bhutan', zones: ['Asia/Thimphu'] },
BW: { name: 'Botswana', zones: ['Africa/Maputo', 'Africa/Gaborone'] },
BY: { name: 'Belarus', zones: ['Europe/Minsk'] },
BZ: { name: 'Belize', zones: ['America/Belize'] },
CA: {
name: 'Canada',
zones: [
'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',
],
},
CC: { name: 'Cocos (Keeling) Islands', zones: ['Indian/Cocos'] },
CD: {
name: 'Congo (Dem. Rep.)',
zones: [
'Africa/Maputo',
'Africa/Lagos',
'Africa/Kinshasa',
'Africa/Lubumbashi',
],
},
CF: {
name: 'Central African Rep.',
zones: ['Africa/Lagos', 'Africa/Bangui'],
},
CG: {
name: 'Congo (Rep.)',
zones: ['Africa/Lagos', 'Africa/Brazzaville'],
},
CH: { name: 'Switzerland', zones: ['Europe/Zurich'] },
CI: { name: "Côte d'Ivoire", zones: ['Africa/Abidjan'] },
CK: { name: 'Cook Islands', zones: ['Pacific/Rarotonga'] },
CL: {
name: 'Chile',
zones: ['America/Santiago', 'America/Punta_Arenas', 'Pacific/Easter'],
},
CM: { name: 'Cameroon', zones: ['Africa/Lagos', 'Africa/Douala'] },
CN: { name: 'China', zones: ['Asia/Shanghai', 'Asia/Urumqi'] },
CO: { name: 'Colombia', zones: ['America/Bogota'] },
CR: { name: 'Costa Rica', zones: ['America/Costa_Rica'] },
CU: { name: 'Cuba', zones: ['America/Havana'] },
CV: { name: 'Cape Verde', zones: ['Atlantic/Cape_Verde'] },
CW: { name: 'Curaçao', zones: ['America/Curacao'] },
CX: { name: 'Christmas Island', zones: ['Indian/Christmas'] },
CY: { name: 'Cyprus', zones: ['Asia/Nicosia', 'Asia/Famagusta'] },
CZ: { name: 'Czech Republic', zones: ['Europe/Prague'] },
DE: {
name: 'Germany',
zones: ['Europe/Zurich', 'Europe/Berlin', 'Europe/Busingen'],
},
DJ: { name: 'Djibouti', zones: ['Africa/Nairobi', 'Africa/Djibouti'] },
DK: { name: 'Denmark', zones: ['Europe/Copenhagen'] },
DM: {
name: 'Dominica',
zones: ['America/Dominica'],
},
DO: { name: 'Dominican Republic', zones: ['America/Santo_Domingo'] },
DZ: { name: 'Algeria', zones: ['Africa/Algiers'] },
EC: {
name: 'Ecuador',
zones: ['America/Guayaquil', 'Pacific/Galapagos'],
},
EE: { name: 'Estonia', zones: ['Europe/Tallinn'] },
EG: { name: 'Egypt', zones: ['Africa/Cairo'] },
EH: { name: 'Western Sahara', zones: ['Africa/El_Aaiun'] },
ER: { name: 'Eritrea', zones: ['Africa/Nairobi', 'Africa/Asmara'] },
ES: {
name: 'Spain',
zones: ['Europe/Madrid', 'Africa/Ceuta', 'Atlantic/Canary'],
},
ET: {
name: 'Ethiopia',
zones: ['Africa/Nairobi', 'Africa/Addis_Ababa'],
},
FI: { name: 'Finland', zones: ['Europe/Helsinki'] },
FJ: { name: 'Fiji', zones: ['Pacific/Fiji'] },
FK: { name: 'Falkland Islands', zones: ['Atlantic/Stanley'] },
FM: {
name: 'Micronesia',
zones: ['Pacific/Chuuk', 'Pacific/Pohnpei', 'Pacific/Kosrae'],
},
FO: { name: 'Faroe Islands', zones: ['Atlantic/Faroe'] },
FR: { name: 'France', zones: ['Europe/Paris'] },
GA: { name: 'Gabon', zones: ['Africa/Lagos', 'Africa/Libreville'] },
GB: { name: 'Britain (UK)', zones: ['Europe/London'] },
GD: {
name: 'Grenada',
zones: ['America/Grenada'],
},
GE: { name: 'Georgia', zones: ['Asia/Tbilisi'] },
GF: { name: 'French Guiana', zones: ['America/Cayenne'] },
GG: { name: 'Guernsey', zones: ['Europe/London', 'Europe/Guernsey'] },
GH: { name: 'Ghana', zones: ['Africa/Accra'] },
GI: { name: 'Gibraltar', zones: ['Europe/Gibraltar'] },
GL: {
name: 'Greenland',
zones: [
'America/Nuuk',
'America/Danmarkshavn',
'America/Scoresbysund',
'America/Thule',
],
},
GM: { name: 'Gambia', zones: ['Africa/Abidjan', 'Africa/Banjul'] },
GN: { name: 'Guinea', zones: ['Africa/Abidjan', 'Africa/Conakry'] },
GP: {
name: 'Guadeloupe',
zones: ['America/Guadeloupe'],
},
GQ: {
name: 'Equatorial Guinea',
zones: ['Africa/Lagos', 'Africa/Malabo'],
},
GR: { name: 'Greece', zones: ['Europe/Athens'] },
GS: {
name: 'South Georgia & the South Sandwich Islands',
zones: ['Atlantic/South_Georgia'],
},
GT: { name: 'Guatemala', zones: ['America/Guatemala'] },
GU: { name: 'Guam', zones: ['Pacific/Guam'] },
GW: { name: 'Guinea-Bissau', zones: ['Africa/Bissau'] },
GY: { name: 'Guyana', zones: ['America/Guyana'] },
HK: { name: 'Hong Kong', zones: ['Asia/Hong_Kong'] },
HN: { name: 'Honduras', zones: ['America/Tegucigalpa'] },
HR: { name: 'Croatia', zones: ['Europe/Belgrade', 'Europe/Zagreb'] },
HT: { name: 'Haiti', zones: ['America/Port-au-Prince'] },
HU: { name: 'Hungary', zones: ['Europe/Budapest'] },
ID: {
name: 'Indonesia',
zones: ['Asia/Jakarta', 'Asia/Pontianak', 'Asia/Makassar', 'Asia/Jayapura'],
},
IE: { name: 'Ireland', zones: ['Europe/Dublin'] },
IL: { name: 'Israel', zones: ['Asia/Jerusalem'] },
IM: {
name: 'Isle of Man',
zones: ['Europe/London', 'Europe/Isle_of_Man'],
},
IN: { name: 'India', zones: ['Asia/Kolkata'] },
IO: {
name: 'British Indian Ocean Territory',
zones: ['Indian/Chagos'],
},
IQ: { name: 'Iraq', zones: ['Asia/Baghdad'] },
IR: { name: 'Iran', zones: ['Asia/Tehran'] },
IS: { name: 'Iceland', zones: ['Atlantic/Reykjavik'] },
IT: { name: 'Italy', zones: ['Europe/Rome'] },
JE: { name: 'Jersey', zones: ['Europe/London', 'Europe/Jersey'] },
JM: { name: 'Jamaica', zones: ['America/Jamaica'] },
JO: { name: 'Jordan', zones: ['Asia/Amman'] },
JP: { name: 'Japan', zones: ['Asia/Tokyo'] },
KE: { name: 'Kenya', zones: ['Africa/Nairobi'] },
KG: { name: 'Kyrgyzstan', zones: ['Asia/Bishkek'] },
KH: { name: 'Cambodia', zones: ['Asia/Bangkok', 'Asia/Phnom_Penh'] },
KI: {
name: 'Kiribati',
zones: ['Pacific/Tarawa', 'Pacific/Enderbury', 'Pacific/Kiritimati'],
},
KM: { name: 'Comoros', zones: ['Africa/Nairobi', 'Indian/Comoro'] },
KN: {
name: 'St Kitts & Nevis',
zones: ['America/St_Kitts'],
},
KP: { name: 'Korea (North)', zones: ['Asia/Pyongyang'] },
KR: { name: 'Korea (South)', zones: ['Asia/Seoul'] },
KW: { name: 'Kuwait', zones: ['Asia/Riyadh', 'Asia/Kuwait'] },
KY: {
name: 'Cayman Islands',
zones: ['America/Panama', 'America/Cayman'],
},
KZ: {
name: 'Kazakhstan',
zones: [
'Asia/Almaty',
'Asia/Qyzylorda',
'Asia/Qostanay',
'Asia/Aqtobe',
'Asia/Aqtau',
'Asia/Atyrau',
'Asia/Oral',
],
},
LA: { name: 'Laos', zones: ['Asia/Bangkok', 'Asia/Vientiane'] },
LB: { name: 'Lebanon', zones: ['Asia/Beirut'] },
LC: {
name: 'St Lucia',
zones: ['America/St_Lucia'],
},
LI: {
name: 'Liechtenstein',
zones: ['Europe/Zurich', 'Europe/Vaduz'],
},
LK: { name: 'Sri Lanka', zones: ['Asia/Colombo'] },
LR: { name: 'Liberia', zones: ['Africa/Monrovia'] },
LS: {
name: 'Lesotho',
zones: ['Africa/Johannesburg', 'Africa/Maseru'],
},
LT: { name: 'Lithuania', zones: ['Europe/Vilnius'] },
LU: { name: 'Luxembourg', zones: ['Europe/Luxembourg'] },
LV: { name: 'Latvia', zones: ['Europe/Riga'] },
LY: { name: 'Libya', zones: ['Africa/Tripoli'] },
MA: { name: 'Morocco', zones: ['Africa/Casablanca'] },
MC: { name: 'Monaco', zones: ['Europe/Monaco'] },
MD: { name: 'Moldova', zones: ['Europe/Chisinau'] },
ME: {
name: 'Montenegro',
zones: ['Europe/Belgrade', 'Europe/Podgorica'],
},
MF: {
name: 'St Martin (French)',
zones: ['America/Marigot'],
},
MG: {
name: 'Madagascar',
zones: ['Africa/Nairobi', 'Indian/Antananarivo'],
},
MH: {
name: 'Marshall Islands',
zones: ['Pacific/Majuro', 'Pacific/Kwajalein'],
},
MK: {
name: 'North Macedonia',
zones: ['Europe/Belgrade', 'Europe/Skopje'],
},
ML: { name: 'Mali', zones: ['Africa/Abidjan', 'Africa/Bamako'] },
MM: { name: 'Myanmar (Burma)', zones: ['Asia/Yangon'] },
MN: {
name: 'Mongolia',
zones: ['Asia/Ulaanbaatar', 'Asia/Hovd', 'Asia/Choibalsan'],
},
MO: { name: 'Macau', zones: ['Asia/Macau'] },
MP: {
name: 'Northern Mariana Islands',
zones: ['Pacific/Guam', 'Pacific/Saipan'],
},
MQ: { name: 'Martinique', zones: ['America/Martinique'] },
MR: {
name: 'Mauritania',
zones: ['Africa/Abidjan', 'Africa/Nouakchott'],
},
MS: {
name: 'Montserrat',
zones: ['America/Montserrat'],
},
MT: { name: 'Malta', zones: ['Europe/Malta'] },
MU: { name: 'Mauritius', zones: ['Indian/Mauritius'] },
MV: { name: 'Maldives', zones: ['Indian/Maldives'] },
MW: { name: 'Malawi', zones: ['Africa/Maputo', 'Africa/Blantyre'] },
MX: {
name: 'Mexico',
zones: [
'America/Mexico_City',
'America/Cancun',
'America/Merida',
'America/Monterrey',
'America/Matamoros',
'America/Mazatlan',
'America/Chihuahua',
'America/Ojinaga',
'America/Hermosillo',
'America/Tijuana',
'America/Bahia_Banderas',
],
},
MY: { name: 'Malaysia', zones: ['Asia/Kuala_Lumpur', 'Asia/Kuching'] },
MZ: { name: 'Mozambique', zones: ['Africa/Maputo'] },
NA: { name: 'Namibia', zones: ['Africa/Windhoek'] },
NC: { name: 'New Caledonia', zones: ['Pacific/Noumea'] },
NE: { name: 'Niger', zones: ['Africa/Lagos', 'Africa/Niamey'] },
NF: { name: 'Norfolk Island', zones: ['Pacific/Norfolk'] },
NG: { name: 'Nigeria', zones: ['Africa/Lagos'] },
NI: { name: 'Nicaragua', zones: ['America/Managua'] },
NL: { name: 'Netherlands', zones: ['Europe/Amsterdam'] },
NO: { name: 'Norway', zones: ['Europe/Oslo'] },
NP: { name: 'Nepal', zones: ['Asia/Kathmandu'] },
NR: { name: 'Nauru', zones: ['Pacific/Nauru'] },
NU: { name: 'Niue', zones: ['Pacific/Niue'] },
NZ: {
name: 'New Zealand',
zones: ['Pacific/Auckland', 'Pacific/Chatham'],
},
OM: { name: 'Oman', zones: ['Asia/Dubai', 'Asia/Muscat'] },
PA: { name: 'Panama', zones: ['America/Panama'] },
PE: { name: 'Peru', zones: ['America/Lima'] },
PF: {
name: 'French Polynesia',
zones: ['Pacific/Tahiti', 'Pacific/Marquesas', 'Pacific/Gambier'],
},
PG: {
name: 'Papua New Guinea',
zones: ['Pacific/Port_Moresby', 'Pacific/Bougainville'],
},
PH: { name: 'Philippines', zones: ['Asia/Manila'] },
PK: { name: 'Pakistan', zones: ['Asia/Karachi'] },
PL: { name: 'Poland', zones: ['Europe/Warsaw'] },
PM: { name: 'St Pierre & Miquelon', zones: ['America/Miquelon'] },
PN: { name: 'Pitcairn', zones: ['Pacific/Pitcairn'] },
PR: { name: 'Puerto Rico', zones: ['America/Puerto_Rico'] },
PS: { name: 'Palestine', zones: ['Asia/Gaza', 'Asia/Hebron'] },
PT: {
name: 'Portugal',
zones: ['Europe/Lisbon', 'Atlantic/Madeira', 'Atlantic/Azores'],
},
PW: { name: 'Palau', zones: ['Pacific/Palau'] },
PY: { name: 'Paraguay', zones: ['America/Asuncion'] },
QA: { name: 'Qatar', zones: ['Asia/Qatar'] },
RE: { name: 'Réunion', zones: ['Indian/Reunion'] },
RO: { name: 'Romania', zones: ['Europe/Bucharest'] },
RS: { name: 'Serbia', zones: ['Europe/Belgrade'] },
RU: {
name: 'Russia',
zones: [
'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',
],
},
RW: { name: 'Rwanda', zones: ['Africa/Maputo', 'Africa/Kigali'] },
SA: { name: 'Saudi Arabia', zones: ['Asia/Riyadh'] },
SB: { name: 'Solomon Islands', zones: ['Pacific/Guadalcanal'] },
SC: { name: 'Seychelles', zones: ['Indian/Mahe'] },
SD: { name: 'Sudan', zones: ['Africa/Khartoum'] },
SE: { name: 'Sweden', zones: ['Europe/Stockholm'] },
SG: { name: 'Singapore', zones: ['Asia/Singapore'] },
SH: {
name: 'St Helena',
zones: ['Africa/Abidjan', 'Atlantic/St_Helena'],
},
SI: {
name: 'Slovenia',
zones: ['Europe/Belgrade', 'Europe/Ljubljana'],
},
SJ: {
name: 'Svalbard & Jan Mayen',
zones: ['Europe/Oslo', 'Arctic/Longyearbyen'],
},
SK: {
name: 'Slovakia',
zones: ['Europe/Prague', 'Europe/Bratislava'],
},
SL: {
name: 'Sierra Leone',
zones: ['Africa/Abidjan', 'Africa/Freetown'],
},
SM: {
name: 'San Marino',
zones: ['Europe/Rome', 'Europe/San_Marino'],
},
SN: { name: 'Senegal', zones: ['Africa/Abidjan', 'Africa/Dakar'] },
SO: { name: 'Somalia', zones: ['Africa/Nairobi', 'Africa/Mogadishu'] },
SR: { name: 'Suriname', zones: ['America/Paramaribo'] },
SS: { name: 'South Sudan', zones: ['Africa/Juba'] },
ST: { name: 'Sao Tome & Principe', zones: ['Africa/Sao_Tome'] },
SV: { name: 'El Salvador', zones: ['America/El_Salvador'] },
SX: {
name: 'St Maarten (Dutch)',
zones: ['America/Curacao', 'America/Lower_Princes'],
},
SY: { name: 'Syria', zones: ['Asia/Damascus'] },
SZ: {
name: 'Eswatini (Swaziland)',
zones: ['Africa/Johannesburg', 'Africa/Mbabane'],
},
TC: { name: 'Turks & Caicos Is', zones: ['America/Grand_Turk'] },
TD: { name: 'Chad', zones: ['Africa/Ndjamena'] },
TF: {
name: 'French Southern & Antarctic Lands',
zones: ['Indian/Reunion', 'Indian/Kerguelen'],
},
TG: { name: 'Togo', zones: ['Africa/Abidjan', 'Africa/Lome'] },
TH: { name: 'Thailand', zones: ['Asia/Bangkok'] },
TJ: { name: 'Tajikistan', zones: ['Asia/Dushanbe'] },
TK: { name: 'Tokelau', zones: ['Pacific/Fakaofo'] },
TL: { name: 'East Timor', zones: ['Asia/Dili'] },
TM: { name: 'Turkmenistan', zones: ['Asia/Ashgabat'] },
TN: { name: 'Tunisia', zones: ['Africa/Tunis'] },
TO: { name: 'Tonga', zones: ['Pacific/Tongatapu'] },
TR: { name: 'Turkey', zones: ['Europe/Istanbul'] },
TT: { name: 'Trinidad & Tobago', zones: ['America/Port_of_Spain'] },
TV: { name: 'Tuvalu', zones: ['Pacific/Funafuti'] },
TW: { name: 'Taiwan', zones: ['Asia/Taipei'] },
TZ: {
name: 'Tanzania',
zones: ['Africa/Nairobi', 'Africa/Dar_es_Salaam'],
},
UA: {
name: 'Ukraine',
zones: [
'Europe/Simferopol',
'Europe/Kiev',
'Europe/Uzhgorod',
'Europe/Zaporozhye',
],
},
UG: { name: 'Uganda', zones: ['Africa/Nairobi', 'Africa/Kampala'] },
UM: {
name: 'US minor outlying islands',
zones: [
'Pacific/Pago_Pago',
'Pacific/Wake',
'Pacific/Honolulu',
'Pacific/Midway',
],
},
US: {
name: 'United States of America (USA)',
zones: [
'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',
],
},
UY: { name: 'Uruguay', zones: ['America/Montevideo'] },
UZ: { name: 'Uzbekistan', zones: ['Asia/Samarkand', 'Asia/Tashkent'] },
VA: { name: 'Vatican City', zones: ['Europe/Rome', 'Europe/Vatican'] },
VC: {
name: 'St Vincent',
zones: ['America/St_Vincent'],
},
VE: { name: 'Venezuela', zones: ['America/Caracas'] },
VG: {
name: 'Virgin Islands (UK)',
zones: ['America/Tortola'],
},
VI: {
name: 'Virgin Islands (US)',
zones: ['America/St_Thomas'],
},
VN: { name: 'Vietnam', zones: ['Asia/Bangkok', 'Asia/Ho_Chi_Minh'] },
VU: { name: 'Vanuatu', zones: ['Pacific/Efate'] },
WF: { name: 'Wallis & Futuna', zones: ['Pacific/Wallis'] },
WS: { name: 'Samoa (western)', zones: ['Pacific/Apia'] },
YE: { name: 'Yemen', zones: ['Asia/Riyadh', 'Asia/Aden'] },
YT: { name: 'Mayotte', zones: ['Africa/Nairobi', 'Indian/Mayotte'] },
ZA: { name: 'South Africa', zones: ['Africa/Johannesburg'] },
ZM: { name: 'Zambia', zones: ['Africa/Maputo', 'Africa/Lusaka'] },
ZW: { name: 'Zimbabwe', zones: ['Africa/Maputo', 'Africa/Harare'] },
};
class NgxTimezonesComponent {
constructor(cdRef) {
this.cdRef = cdRef;
this.timezoneCtrl = new FormControl();
this.searchControl = new FormControl();
this.timezoneChange = new EventEmitter();
this.guess = false;
this.showOffset = false;
this.placeholder = 'Select timezone';
this.searchPlaceholder = 'Search';
this.noResultsLabel = 'No results';
this.offsetName = 'UTC';
}
set timezone(timezone) {
this.timezoneCtrl.setValue(timezone);
}
set disabled(value) {
if (value) {
this.timezoneCtrl.disable();
}
else {
this.timezoneCtrl.enable();
}
}
ngOnInit() {
this.initData();
this.timezoneGroupsOptions = this.searchControl.valueChanges.pipe(startWith(''), map((query) => (query ? this.filter(query) : this.timezoneGroups.slice())));
this.timezoneCtrl.valueChanges.subscribe((value) => {
this.emitTimezone(value);
});
if (!this.timezoneCtrl.value && this.guess) {
this.guessedTimezone();
this.cdRef.detectChanges();
}
}
guessedTimezone() {
const zone = tz.guess();
this.timezone = zone;
this.emitTimezone(zone);
}
emitTimezone(zone) {
this.timezoneChange.emit(zone);
}
initData() {
this.timezoneGroups = Object.keys(countryZones).map((iso) => {
const val = countryZones[iso];
const hasMultiple = val.zones.length > 1;
const zones = val.zones.map((x) => {
return hasMultiple
? {
zone: x,
name: `${this.formatTimezoneString(x)}`,
offset: this.offsetOfTimezone(x),
}
: {
zone: x,
name: val.name,
offset: this.offsetOfTimezone(x),
};
});
return { iso, country: val.name, zones };
});
}
filter(query) {
const result = [];
for (const z of this.timezoneGroups) {
if (z.country && z.country.toLowerCase().includes(query.toLowerCase())) {
result.push(z);
}
else {
const results = z.zones.filter((x) => x.name.toLowerCase().includes(query.toLowerCase()));
if (results.length > 0) {
z.zones = results;
z.showGroup = z.zones.length > 1;
result.push(z);
}
}
}
return result;
}
formatTimezoneString(zone) {
const arr = zone.split('/');
return arr[arr.length - 1].split('_').join(' ');
}
offsetOfTimezone(zone) {
let offset = tz(zone).utcOffset();
const neg = offset < 0;
if (neg) {
offset = -1 * offset;
}
const hours = Math.floor(offset / 60);
const minutes = (offset / 60 - hours) * 60;
return `${neg ? '-' : '+'}${this.rjust(hours.toString(), 2)}:${this.rjust(minutes.toString(), 2)}`;
}
formatOffset(offset) {
return `(${this.offsetName}${offset})`;
}
rjust(value, width, padding = '0') {
padding = padding || ' ';
padding = padding.substr(0, 1);
if (value.length < width) {
return padding.repeat(width - value.length) + value;
}
else {
return value;
}
}
}
NgxTimezonesComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-timezones',
template: ` <mat-form-field style="width: 100%"
><mat-select [formControl]="timezoneCtrl" [placeholder]="placeholder">
<mat-option>
<ngx-mat-select-search
[formControl]="searchControl"
[placeholderLabel]="searchPlaceholder"
[noEntriesFoundLabel]="noResultsLabel"
></ngx-mat-select-search>
</mat-option>
<ng-template let-option ngFor [ngForOf]="timezoneGroupsOptions | async">
<mat-optgroup
*ngIf="option.showGroup || option.zones.length > 1; else singleOption"
[label]="option.country + ' (' + option.zones.length + ')'"
>
<mat-option *ngFor="let zone of option.zones" [value]="zone.zone">
{{ zone.name }}
<span>{{ showOffset ? formatOffset(zone.offset) : '' }}</span>
</mat-option>
</mat-optgroup>
<ng-template #singleOption>
<mat-option [value]="option.zones[0].zone">
{{ option.zones[0].name }}
<span>{{
showOffset ? formatOffset(option.zones[0].offset) : ''
}}</span>
</mat-option>
</ng-template>
</ng-template>
</mat-select>
</mat-form-field>`
},] }
];
NgxTimezonesComponent.ctorParameters = () => [
{ type: ChangeDetectorRef }
];
NgxTimezonesComponent.propDecorators = {
timezoneChange: [{ type: Output }],
timezone: [{ type: Input }],
disabled: [{ type: Input }],
guess: [{ type: Input }],
showOffset: [{ type: Input }],
placeholder: [{ type: Input }],
searchPlaceholder: [{ type: Input }],
noResultsLabel: [{ type: Input }],
offsetName: [{ type: Input }]
};
class NgxTimezonesModule {
}
NgxTimezonesModule.decorators = [
{ type: NgModule, args: [{
declarations: [NgxTimezonesComponent],
imports: [
ReactiveFormsModule,
BrowserAnimationsModule,
MatSelectModule,
FormsModule,
MatFormFieldModule,
NgxMatSelectSearchModule,
],
exports: [NgxTimezonesComponent],
},] }
];
/*
* Public API Surface of ngx-timezones
*/
/**
* Generated bundle index. Do not edit.
*/
export { NgxTimezonesComponent, NgxTimezonesModule };
//# sourceMappingURL=ngx-timezones.js.map