commit
						b710776cac
					
				
					 7 changed files with 673 additions and 50 deletions
				
			
		
							
								
								
									
										94
									
								
								lib/slots.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								lib/slots.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | |||
| const dayjs = require("dayjs"); | ||||
| 
 | ||||
| const isToday = require("dayjs/plugin/isToday"); | ||||
| const utc = require("dayjs/plugin/utc"); | ||||
| const timezone = require("dayjs/plugin/timezone"); | ||||
| 
 | ||||
| dayjs.extend(isToday); | ||||
| dayjs.extend(utc); | ||||
| dayjs.extend(timezone); | ||||
| 
 | ||||
| const getMinutesFromMidnight = (date) => { | ||||
|   return date.hour() * 60 + date.minute(); | ||||
| }; | ||||
| 
 | ||||
| const getSlots = ({ | ||||
|   calendarTimeZone, | ||||
|   eventLength, | ||||
|   selectedTimeZone, | ||||
|   selectedDate, | ||||
|   dayStartTime, | ||||
|   dayEndTime | ||||
| }) => { | ||||
| 
 | ||||
|   if(!selectedDate) return [] | ||||
|    | ||||
|   const lowerBound = selectedDate.startOf("day"); | ||||
| 
 | ||||
|   // Simple case, same timezone
 | ||||
|   if (calendarTimeZone === selectedTimeZone) { | ||||
|     const slots = []; | ||||
|     const now = dayjs(); | ||||
|     for ( | ||||
|       let minutes = dayStartTime; | ||||
|       minutes <= dayEndTime - eventLength; | ||||
|       minutes += parseInt(eventLength, 10) | ||||
|     ) { | ||||
|       const slot = lowerBound.add(minutes, "minutes"); | ||||
|       if (slot > now) { | ||||
|         slots.push(slot); | ||||
|       } | ||||
|     } | ||||
|     return slots; | ||||
|   } | ||||
| 
 | ||||
|   const upperBound = selectedDate.endOf("day"); | ||||
| 
 | ||||
|   // We need to start generating slots from the start of the calendarTimeZone day
 | ||||
|   const startDateTime = lowerBound | ||||
|     .tz(calendarTimeZone) | ||||
|     .startOf("day") | ||||
|     .add(dayStartTime, "minutes"); | ||||
| 
 | ||||
|   let phase = 0; | ||||
|   if (startDateTime < lowerBound) { | ||||
|     // Getting minutes of the first event in the day of the chooser
 | ||||
|     const diff = lowerBound.diff(startDateTime, "minutes"); | ||||
| 
 | ||||
|     // finding first event
 | ||||
|     phase = diff + eventLength - (diff % eventLength); | ||||
|   } | ||||
| 
 | ||||
|   // We can stop as soon as the selectedTimeZone day ends
 | ||||
|   const endDateTime = upperBound | ||||
|     .tz(calendarTimeZone) | ||||
|     .subtract(eventLength, "minutes"); | ||||
| 
 | ||||
|   const maxMinutes = endDateTime.diff(startDateTime, "minutes"); | ||||
| 
 | ||||
|   const slots = []; | ||||
|   const now = dayjs(); | ||||
|   for ( | ||||
|     let minutes = phase; | ||||
|     minutes <= maxMinutes; | ||||
|     minutes += parseInt(eventLength, 10) | ||||
|   ) { | ||||
|     const slot = startDateTime.add(minutes, "minutes"); | ||||
| 
 | ||||
|     const minutesFromMidnight = getMinutesFromMidnight(slot); | ||||
| 
 | ||||
|     if ( | ||||
|       minutesFromMidnight < dayStartTime || | ||||
|       minutesFromMidnight > dayEndTime - eventLength || | ||||
|       slot < now | ||||
|     ) { | ||||
|       continue; | ||||
|     } | ||||
| 
 | ||||
|     slots.push(slot.tz(selectedTimeZone)); | ||||
|   } | ||||
| 
 | ||||
|   return slots; | ||||
| }; | ||||
| 
 | ||||
| export default getSlots | ||||
|  | @ -1,4 +1,4 @@ | |||
| import {useEffect, useState} from 'react'; | ||||
| import {useEffect, useState, useMemo} from 'react'; | ||||
| import Head from 'next/head'; | ||||
| import Link from 'next/link'; | ||||
| import prisma from '../../lib/prisma'; | ||||
|  | @ -6,8 +6,14 @@ import { useRouter } from 'next/router'; | |||
| const dayjs = require('dayjs'); | ||||
| const isSameOrBefore = require('dayjs/plugin/isSameOrBefore'); | ||||
| const isBetween = require('dayjs/plugin/isBetween'); | ||||
| const utc = require('dayjs/plugin/utc'); | ||||
| const timezone = require('dayjs/plugin/timezone'); | ||||
| dayjs.extend(isSameOrBefore); | ||||
| dayjs.extend(isBetween); | ||||
| dayjs.extend(utc); | ||||
| dayjs.extend(timezone); | ||||
| 
 | ||||
| import getSlots from '../../lib/slots' | ||||
| 
 | ||||
| export default function Type(props) { | ||||
|     // Initialise state
 | ||||
|  | @ -29,6 +35,21 @@ export default function Type(props) { | |||
|         setSelectedMonth(selectedMonth - 1); | ||||
|     } | ||||
| 
 | ||||
|       // Need to define the bounds of the 24-hour window
 | ||||
|       const lowerBound = useMemo(() => { | ||||
|         if(!selectedDate) { | ||||
|           return  | ||||
|         } | ||||
|    | ||||
|         return selectedDate.startOf('day') | ||||
|       }, [selectedDate]) | ||||
|    | ||||
|       const upperBound = useMemo(() => { | ||||
|         if(!selectedDate) return  | ||||
|          | ||||
|         return selectedDate.endOf('day') | ||||
|       }, [selectedDate]) | ||||
| 
 | ||||
|     // Set up calendar
 | ||||
|     var daysInMonth = dayjs().month(selectedMonth).daysInMonth(); | ||||
|     var days = []; | ||||
|  | @ -37,63 +58,57 @@ export default function Type(props) { | |||
|     } | ||||
| 
 | ||||
|     const calendar = days.map((day) => | ||||
|         <button key={day} onClick={(e) => setSelectedDate(dayjs().month(selectedMonth).date(day).format("YYYY-MM-DD"))} disabled={selectedMonth < dayjs().format('MM') && dayjs().month(selectedMonth).format("D") > day} className={"text-center w-10 h-10 rounded-full mx-auto " + (dayjs().isSameOrBefore(dayjs().date(day).month(selectedMonth)) ? 'bg-blue-50 text-blue-600 font-medium' : 'text-gray-400 font-light') + (dayjs(selectedDate).month(selectedMonth).format("D") == day ? ' bg-blue-600 text-white-important' : '')}> | ||||
|         <button key={day} onClick={(e) => setSelectedDate(dayjs().tz(dayjs.tz.guess()).month(selectedMonth).date(day))} disabled={selectedMonth < dayjs().format('MM') && dayjs().month(selectedMonth).format("D") > day} className={"text-center w-10 h-10 rounded-full mx-auto " + (dayjs().isSameOrBefore(dayjs().date(day).month(selectedMonth)) ? 'bg-blue-50 text-blue-600 font-medium' : 'text-gray-400 font-light') + (dayjs(selectedDate).month(selectedMonth).format("D") == day ? ' bg-blue-600 text-white-important' : '')}> | ||||
|             {day} | ||||
|         </button> | ||||
|     ); | ||||
| 
 | ||||
|     // Handle date change
 | ||||
|     useEffect(async () => { | ||||
|         if(!selectedDate) { | ||||
|           return | ||||
|         } | ||||
| 
 | ||||
|         setLoading(true); | ||||
|         const res = await fetch('/api/availability/' + user + '?date=' + dayjs(selectedDate).format("YYYY-MM-DD")); | ||||
|         const res = await fetch(`/api/availability/${user}?dateFrom=${lowerBound.utc().format()}&dateTo=${upperBound.utc().format()}`); | ||||
|         const data = await res.json(); | ||||
|         setBusy(data.primary.busy); | ||||
|         setLoading(false); | ||||
|     }, [selectedDate]); | ||||
| 
 | ||||
|     // Set up timeslots
 | ||||
|     let times = []; | ||||
| 
 | ||||
|     // If we're looking at availability throughout the current date, work out the current number of minutes elapsed throughout the day
 | ||||
|     if (selectedDate == dayjs().format("YYYY-MM-DD")) { | ||||
|         var i = (parseInt(dayjs().startOf('hour').format('H') * 60) + parseInt(dayjs().startOf('hour').format('m'))); | ||||
|     } else { | ||||
|         var i = props.user.startTime; | ||||
|     } | ||||
|      | ||||
|     // Until day end, push new times every x minutes
 | ||||
|     for (;i < props.user.endTime; i += parseInt(props.eventType.length)) { | ||||
|         times.push(dayjs(selectedDate).hour(Math.floor(i / 60)).minute(i % 60).startOf(props.eventType.length, 'minute').add(props.eventType.length, 'minute').format("YYYY-MM-DD HH:mm:ss")); | ||||
|     } | ||||
|     const times = getSlots({ | ||||
|       calendarTimeZone: props.user.timeZone, | ||||
|       selectedTimeZone: dayjs.tz.guess(), | ||||
|       eventLength: props.eventType.length, | ||||
|       selectedDate: selectedDate, | ||||
|       dayStartTime: props.user.startTime, | ||||
|       dayEndTime: props.user.endTime, | ||||
|     }) | ||||
| 
 | ||||
|     // Check for conflicts
 | ||||
|     for(i = times.length - 1; i >= 0; i -= 1) { | ||||
|         busy.forEach(busyTime => { | ||||
|             let startTime = dayjs(busyTime.start); | ||||
|             let endTime = dayjs(busyTime.end); | ||||
|     for(let i = times.length - 1; i >= 0; i -= 1) { | ||||
|       busy.forEach(busyTime => { | ||||
|           let startTime = dayjs(busyTime.start); | ||||
|           let endTime = dayjs(busyTime.end); | ||||
| 
 | ||||
|             // Check if time has passed
 | ||||
|             if (dayjs(times[i]).isBefore(dayjs())) { | ||||
|                 times.splice(i, 1); | ||||
|             } | ||||
|           // Check if start times are the same
 | ||||
|           if (dayjs(times[i]).format('HH:mm') == startTime.format('HH:mm')) { | ||||
|               times.splice(i, 1); | ||||
|           } | ||||
| 
 | ||||
|             // Check if start times are the same
 | ||||
|             if (dayjs(times[i]).format('HH:mm') == startTime.format('HH:mm')) { | ||||
|                 times.splice(i, 1); | ||||
|             } | ||||
| 
 | ||||
|             // Check if time is between start and end times
 | ||||
|             if (dayjs(times[i]).isBetween(startTime, endTime)) { | ||||
|                 times.splice(i, 1); | ||||
|             } | ||||
|         }); | ||||
|           // Check if time is between start and end times
 | ||||
|           if (dayjs(times[i]).isBetween(startTime, endTime)) { | ||||
|               times.splice(i, 1); | ||||
|           } | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
|     // Display available times
 | ||||
|     const availableTimes = times.map((time) => | ||||
|         <div key={time}> | ||||
|             <Link href={"/" + props.user.username + "/book?date=" + selectedDate + "T" + dayjs(time).format("HH:mm:ss") + "&type=" + props.eventType.id}> | ||||
|                 <a key={time} className="block font-medium mb-4 text-blue-600 border border-blue-600 rounded hover:text-white hover:bg-blue-600 py-4">{dayjs(time).format("hh:mma")}</a> | ||||
|         <div key={dayjs(time).utc().format()}> | ||||
|             <Link href={`/${props.user.username}/book?date=${dayjs(time).utc().format()}&type=${props.eventType.id}`}> | ||||
|                 <a key={dayjs(time).format("hh:mma")} className="block font-medium mb-4 text-blue-600 border border-blue-600 rounded hover:text-white hover:bg-blue-600 py-4">{dayjs(time).tz(dayjs.tz.guess()).format("hh:mma")}</a> | ||||
|             </Link> | ||||
|         </div> | ||||
|     ); | ||||
|  | @ -165,6 +180,7 @@ export async function getServerSideProps(context) { | |||
|             avatar: true, | ||||
|             eventTypes: true, | ||||
|             startTime: true, | ||||
|             timeZone: true, | ||||
|             endTime: true | ||||
|         } | ||||
|     }); | ||||
|  | @ -187,4 +203,4 @@ export async function getServerSideProps(context) { | |||
|             eventType | ||||
|         }, | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -12,7 +12,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
|           username: user, | ||||
|         }, | ||||
|         select: { | ||||
|             credentials: true | ||||
|             credentials: true, | ||||
|             timeZone: true | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|  | @ -32,8 +33,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
|         const calendar = google.calendar({version: 'v3', auth}); | ||||
|         calendar.freebusy.query({ | ||||
|             requestBody: { | ||||
|                 timeMin: req.query.date + "T00:00:00.00Z", | ||||
|                 timeMax: req.query.date + "T23:59:59.59Z", | ||||
|                 timeMin: req.query.dateFrom, | ||||
|                 timeMax: req.query.dateTo, | ||||
|                 items: [{ | ||||
|                     "id": "primary" | ||||
|                 }] | ||||
|  | @ -44,4 +45,4 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
|             res.status(200).json(availability); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -12,7 +12,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
|           username: user, | ||||
|         }, | ||||
|         select: { | ||||
|             credentials: true | ||||
|             credentials: true, | ||||
|             timeZone: true, | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|  | @ -32,11 +33,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
|             'description': req.body.notes, | ||||
|             'start': { | ||||
|               'dateTime': req.body.start, | ||||
|               'timeZone': 'Europe/London', | ||||
|               'timeZone': currentUser.timeZone, | ||||
|             }, | ||||
|             'end': { | ||||
|               'dateTime': req.body.end, | ||||
|               'timeZone': 'Europe/London', | ||||
|               'timeZone': currentUser.timeZone, | ||||
|             }, | ||||
|             'attendees': [ | ||||
|               {'email': req.body.email}, | ||||
|  | @ -62,4 +63,4 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
|             res.status(200).json({message: 'Event created'}); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -25,7 +25,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
| 
 | ||||
|     const username = req.body.username; | ||||
|     const name = req.body.name; | ||||
|     const bio = req.body.description; | ||||
|     const description = req.body.description; | ||||
|     const timeZone = req.body.timeZone; | ||||
| 
 | ||||
|     const updateUser = await prisma.user.update({ | ||||
|         where: { | ||||
|  | @ -34,7 +35,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) | |||
|         data: { | ||||
|           username, | ||||
|           name, | ||||
|           bio | ||||
|           bio: description, | ||||
|           timeZone: timeZone, | ||||
|         }, | ||||
|     }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ export default function Settings(props) { | |||
|     const usernameRef = useRef(); | ||||
|     const nameRef = useRef(); | ||||
|     const descriptionRef = useRef(); | ||||
|     const timezoneRef = useRef(); | ||||
| 
 | ||||
|     if (loading) { | ||||
|         return <p className="text-gray-400">Loading...</p>; | ||||
|  | @ -26,12 +27,13 @@ export default function Settings(props) { | |||
|         const enteredUsername = usernameRef.current.value; | ||||
|         const enteredName = nameRef.current.value; | ||||
|         const enteredDescription = descriptionRef.current.value; | ||||
|         const enteredTimezone = timezoneRef.current.value; | ||||
| 
 | ||||
|         // TODO: Add validation
 | ||||
| 
 | ||||
|         const response = await fetch('/api/user/profile', { | ||||
|             method: 'PATCH', | ||||
|             body: JSON.stringify({username: enteredUsername, name: enteredName, description: enteredDescription}), | ||||
|             body: JSON.stringify({username: enteredUsername, name: enteredName, description: enteredDescription, timeZone: enteredTimezone}), | ||||
|             headers: { | ||||
|                 'Content-Type': 'application/json' | ||||
|             } | ||||
|  | @ -84,6 +86,511 @@ export default function Settings(props) { | |||
|                                         <textarea ref={descriptionRef} id="about" name="about" placeholder="A little something about yourself." rows={3} className="shadow-sm focus:ring-blue-500 focus:border-blue-500 mt-1 block w-full sm:text-sm border-gray-300 rounded-md">{props.user.bio}</textarea> | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                                 <div> | ||||
|                                     <label htmlFor="timeZone" className="block text-sm font-medium text-gray-700"> | ||||
|                                         Timezone | ||||
|                                     </label> | ||||
|                                     <div className="mt-1"> | ||||
|                                         <select name="timezone" id="timeZone" defaultValue={props.user.timeZone} ref={timezoneRef} className="shadow-sm focus:ring-blue-500 focus:border-blue-500 mt-1 block w-full sm:text-sm border-gray-300 rounded-md"> | ||||
|                                           <option disabled style={{display: "none"}}>Time Zone...</option> | ||||
|                                           <optgroup label="US (Common)">	 | ||||
|                                             <option value="America/Puerto_Rico">Puerto Rico (Atlantic)</option> | ||||
|                                             <option value="America/New_York">New York (Eastern)</option> | ||||
|                                             <option value="America/Chicago">Chicago (Central)</option> | ||||
|                                             <option value="America/Denver">Denver (Mountain)</option> | ||||
|                                             <option value="America/Phoenix">Phoenix (MST)</option> | ||||
|                                             <option value="America/Los_Angeles">Los Angeles (Pacific)</option> | ||||
|                                             <option value="America/Anchorage">Anchorage (Alaska)</option> | ||||
|                                             <option value="Pacific/Honolulu">Honolulu (Hawaii)</option> | ||||
|                                           </optgroup> | ||||
| 
 | ||||
|                                           <optgroup label="America"> | ||||
|                                             <option value="America/Adak">Adak</option> | ||||
|                                             <option value="America/Anchorage">Anchorage</option> | ||||
|                                             <option value="America/Anguilla">Anguilla</option> | ||||
|                                             <option value="America/Antigua">Antigua</option> | ||||
|                                             <option value="America/Araguaina">Araguaina</option> | ||||
|                                             <option value="America/Argentina/Buenos_Aires">Argentina - Buenos Aires</option> | ||||
|                                             <option value="America/Argentina/Catamarca">Argentina - Catamarca</option> | ||||
|                                             <option value="America/Argentina/ComodRivadavia">Argentina - ComodRivadavia</option> | ||||
|                                             <option value="America/Argentina/Cordoba">Argentina - Cordoba</option> | ||||
|                                             <option value="America/Argentina/Jujuy">Argentina - Jujuy</option> | ||||
|                                             <option value="America/Argentina/La_Rioja">Argentina - La Rioja</option> | ||||
|                                             <option value="America/Argentina/Mendoza">Argentina - Mendoza</option> | ||||
|                                             <option value="America/Argentina/Rio_Gallegos">Argentina - Rio Gallegos</option> | ||||
|                                             <option value="America/Argentina/Salta">Argentina - Salta</option> | ||||
|                                             <option value="America/Argentina/San_Juan">Argentina - San Juan</option> | ||||
|                                             <option value="America/Argentina/San_Luis">Argentina - San Luis</option> | ||||
|                                             <option value="America/Argentina/Tucuman">Argentina - Tucuman</option> | ||||
|                                             <option value="America/Argentina/Ushuaia">Argentina - Ushuaia</option> | ||||
|                                             <option value="America/Aruba">Aruba</option> | ||||
|                                             <option value="America/Asuncion">Asuncion</option> | ||||
|                                             <option value="America/Atikokan">Atikokan</option> | ||||
|                                             <option value="America/Atka">Atka</option> | ||||
|                                             <option value="America/Bahia">Bahia</option> | ||||
|                                             <option value="America/Barbados">Barbados</option> | ||||
|                                             <option value="America/Belem">Belem</option> | ||||
|                                             <option value="America/Belize">Belize</option> | ||||
|                                             <option value="America/Blanc-Sablon">Blanc-Sablon</option> | ||||
|                                             <option value="America/Boa_Vista">Boa Vista</option> | ||||
|                                             <option value="America/Bogota">Bogota</option> | ||||
|                                             <option value="America/Boise">Boise</option> | ||||
|                                             <option value="America/Buenos_Aires">Buenos Aires</option> | ||||
|                                             <option value="America/Cambridge_Bay">Cambridge Bay</option> | ||||
|                                             <option value="America/Campo_Grande">Campo Grande</option> | ||||
|                                             <option value="America/Cancun">Cancun</option> | ||||
|                                             <option value="America/Caracas">Caracas</option> | ||||
|                                             <option value="America/Catamarca">Catamarca</option> | ||||
|                                             <option value="America/Cayenne">Cayenne</option> | ||||
|                                             <option value="America/Cayman">Cayman</option> | ||||
|                                             <option value="America/Chicago">Chicago</option> | ||||
|                                             <option value="America/Chihuahua">Chihuahua</option> | ||||
|                                             <option value="America/Coral_Harbour">Coral Harbour</option> | ||||
|                                             <option value="America/Cordoba">Cordoba</option> | ||||
|                                             <option value="America/Costa_Rica">Costa Rica</option> | ||||
|                                             <option value="America/Cuiaba">Cuiaba</option> | ||||
|                                             <option value="America/Curacao">Curacao</option> | ||||
|                                             <option value="America/Danmarkshavn">Danmarkshavn</option> | ||||
|                                             <option value="America/Dawson">Dawson</option> | ||||
|                                             <option value="America/Dawson_Creek">Dawson Creek</option> | ||||
|                                             <option value="America/Denver">Denver</option> | ||||
|                                             <option value="America/Detroit">Detroit</option> | ||||
|                                             <option value="America/Dominica">Dominica</option> | ||||
|                                             <option value="America/Edmonton">Edmonton</option> | ||||
|                                             <option value="America/Eirunepe">Eirunepe</option> | ||||
|                                             <option value="America/El_Salvador">El Salvador</option> | ||||
|                                             <option value="America/Ensenada">Ensenada</option> | ||||
|                                             <option value="America/Fortaleza">Fortaleza</option> | ||||
|                                             <option value="America/Fort_Wayne">Fort Wayne</option> | ||||
|                                             <option value="America/Glace_Bay">Glace Bay</option> | ||||
|                                             <option value="America/Godthab">Godthab</option> | ||||
|                                             <option value="America/Goose_Bay">Goose Bay</option> | ||||
|                                             <option value="America/Grand_Turk">Grand Turk</option> | ||||
|                                             <option value="America/Grenada">Grenada</option> | ||||
|                                             <option value="America/Guadeloupe">Guadeloupe</option> | ||||
|                                             <option value="America/Guatemala">Guatemala</option> | ||||
|                                             <option value="America/Guayaquil">Guayaquil</option> | ||||
|                                             <option value="America/Guyana">Guyana</option> | ||||
|                                             <option value="America/Halifax">Halifax</option> | ||||
|                                             <option value="America/Havana">Havana</option> | ||||
|                                             <option value="America/Hermosillo">Hermosillo</option> | ||||
|                                             <option value="America/Indiana/Indianapolis">Indiana - Indianapolis</option> | ||||
|                                             <option value="America/Indiana/Knox">Indiana - Knox</option> | ||||
|                                             <option value="America/Indiana/Marengo">Indiana - Marengo</option> | ||||
|                                             <option value="America/Indiana/Petersburg">Indiana - Petersburg</option> | ||||
|                                             <option value="America/Indiana/Tell_City">Indiana - Tell City</option> | ||||
|                                             <option value="America/Indiana/Vevay">Indiana - Vevay</option> | ||||
|                                             <option value="America/Indiana/Vincennes">Indiana - Vincennes</option> | ||||
|                                             <option value="America/Indiana/Winamac">Indiana - Winamac</option> | ||||
|                                             <option value="America/Indianapolis">Indianapolis</option> | ||||
|                                             <option value="America/Inuvik">Inuvik</option> | ||||
|                                             <option value="America/Iqaluit">Iqaluit</option> | ||||
|                                             <option value="America/Jamaica">Jamaica</option> | ||||
|                                             <option value="America/Jujuy">Jujuy</option> | ||||
|                                             <option value="America/Juneau">Juneau</option> | ||||
|                                             <option value="America/Kentucky/Louisville">Kentucky - Louisville</option> | ||||
|                                             <option value="America/Kentucky/Monticello">Kentucky - Monticello</option> | ||||
|                                             <option value="America/Knox_IN">Knox IN</option> | ||||
|                                             <option value="America/La_Paz">La Paz</option> | ||||
|                                             <option value="America/Lima">Lima</option> | ||||
|                                             <option value="America/Los_Angeles">Los Angeles</option> | ||||
|                                             <option value="America/Louisville">Louisville</option> | ||||
|                                             <option value="America/Maceio">Maceio</option> | ||||
|                                             <option value="America/Managua">Managua</option> | ||||
|                                             <option value="America/Manaus">Manaus</option> | ||||
|                                             <option value="America/Marigot">Marigot</option> | ||||
|                                             <option value="America/Martinique">Martinique</option> | ||||
|                                             <option value="America/Matamoros">Matamoros</option> | ||||
|                                             <option value="America/Mazatlan">Mazatlan</option> | ||||
|                                             <option value="America/Mendoza">Mendoza</option> | ||||
|                                             <option value="America/Menominee">Menominee</option> | ||||
|                                             <option value="America/Merida">Merida</option> | ||||
|                                             <option value="America/Mexico_City">Mexico City</option> | ||||
|                                             <option value="America/Miquelon">Miquelon</option> | ||||
|                                             <option value="America/Moncton">Moncton</option> | ||||
|                                             <option value="America/Monterrey">Monterrey</option> | ||||
|                                             <option value="America/Montevideo">Montevideo</option> | ||||
|                                             <option value="America/Montreal">Montreal</option> | ||||
|                                             <option value="America/Montserrat">Montserrat</option> | ||||
|                                             <option value="America/Nassau">Nassau</option> | ||||
|                                             <option value="America/New_York">New York</option> | ||||
|                                             <option value="America/Nipigon">Nipigon</option> | ||||
|                                             <option value="America/Nome">Nome</option> | ||||
|                                             <option value="America/Noronha">Noronha</option> | ||||
|                                             <option value="America/North_Dakota/Center">North Dakota - Center</option> | ||||
|                                             <option value="America/North_Dakota/New_Salem">North Dakota - New Salem</option> | ||||
|                                             <option value="America/Ojinaga">Ojinaga</option> | ||||
|                                             <option value="America/Panama">Panama</option> | ||||
|                                             <option value="America/Pangnirtung">Pangnirtung</option> | ||||
|                                             <option value="America/Paramaribo">Paramaribo</option> | ||||
|                                             <option value="America/Phoenix">Phoenix</option> | ||||
|                                             <option value="America/Port-au-Prince">Port-au-Prince</option> | ||||
|                                             <option value="America/Porto_Acre">Porto Acre</option> | ||||
|                                             <option value="America/Port_of_Spain">Port of Spain</option> | ||||
|                                             <option value="America/Porto_Velho">Porto Velho</option> | ||||
|                                             <option value="America/Puerto_Rico">Puerto Rico</option> | ||||
|                                             <option value="America/Rainy_River">Rainy River</option> | ||||
|                                             <option value="America/Rankin_Inlet">Rankin Inlet</option> | ||||
|                                             <option value="America/Recife">Recife</option> | ||||
|                                             <option value="America/Regina">Regina</option> | ||||
|                                             <option value="America/Resolute">Resolute</option> | ||||
|                                             <option value="America/Rio_Branco">Rio Branco</option> | ||||
|                                             <option value="America/Rosario">Rosario</option> | ||||
|                                             <option value="America/Santa_Isabel">Santa Isabel</option> | ||||
|                                             <option value="America/Santarem">Santarem</option> | ||||
|                                             <option value="America/Santiago">Santiago</option> | ||||
|                                             <option value="America/Santo_Domingo">Santo Domingo</option> | ||||
|                                             <option value="America/Sao_Paulo">Sao Paulo</option> | ||||
|                                             <option value="America/Scoresbysund">Scoresbysund</option> | ||||
|                                             <option value="America/Shiprock">Shiprock</option> | ||||
|                                             <option value="America/St_Barthelemy">St Barthelemy</option> | ||||
|                                             <option value="America/St_Johns">St Johns</option> | ||||
|                                             <option value="America/St_Kitts">St Kitts</option> | ||||
|                                             <option value="America/St_Lucia">St Lucia</option> | ||||
|                                             <option value="America/St_Thomas">St Thomas</option> | ||||
|                                             <option value="America/St_Vincent">St Vincent</option> | ||||
|                                             <option value="America/Swift_Current">Swift Current</option> | ||||
|                                             <option value="America/Tegucigalpa">Tegucigalpa</option> | ||||
|                                             <option value="America/Thule">Thule</option> | ||||
|                                             <option value="America/Thunder_Bay">Thunder Bay</option> | ||||
|                                             <option value="America/Tijuana">Tijuana</option> | ||||
|                                             <option value="America/Toronto">Toronto</option> | ||||
|                                             <option value="America/Tortola">Tortola</option> | ||||
|                                             <option value="America/Vancouver">Vancouver</option> | ||||
|                                             <option value="America/Virgin">Virgin</option> | ||||
|                                             <option value="America/Whitehorse">Whitehorse</option> | ||||
|                                             <option value="America/Winnipeg">Winnipeg</option> | ||||
|                                             <option value="America/Yakutat">Yakutat</option> | ||||
|                                             <option value="America/Yellowknife">Yellowknife</option> | ||||
|                                           </optgroup> | ||||
| 
 | ||||
|                                           <optgroup label="Europe"> | ||||
|                                             <option value="Europe/Amsterdam">Amsterdam</option> | ||||
|                                             <option value="Europe/Andorra">Andorra</option> | ||||
|                                             <option value="Europe/Athens">Athens</option> | ||||
|                                             <option value="Europe/Belfast">Belfast</option> | ||||
|                                             <option value="Europe/Belgrade">Belgrade</option> | ||||
|                                             <option value="Europe/Berlin">Berlin</option> | ||||
|                                             <option value="Europe/Bratislava">Bratislava</option> | ||||
|                                             <option value="Europe/Brussels">Brussels</option> | ||||
|                                             <option value="Europe/Bucharest">Bucharest</option> | ||||
|                                             <option value="Europe/Budapest">Budapest</option> | ||||
|                                             <option value="Europe/Chisinau">Chisinau</option> | ||||
|                                             <option value="Europe/Copenhagen">Copenhagen</option> | ||||
|                                             <option value="Europe/Dublin">Dublin</option> | ||||
|                                             <option value="Europe/Gibraltar">Gibraltar</option> | ||||
|                                             <option value="Europe/Guernsey">Guernsey</option> | ||||
|                                             <option value="Europe/Helsinki">Helsinki</option> | ||||
|                                             <option value="Europe/Isle_of_Man">Isle of Man</option> | ||||
|                                             <option value="Europe/Istanbul">Istanbul</option> | ||||
|                                             <option value="Europe/Jersey">Jersey</option> | ||||
|                                             <option value="Europe/Kaliningrad">Kaliningrad</option> | ||||
|                                             <option value="Europe/Kiev">Kiev</option> | ||||
|                                             <option value="Europe/Lisbon">Lisbon</option> | ||||
|                                             <option value="Europe/Ljubljana">Ljubljana</option> | ||||
|                                             <option value="Europe/London">London</option> | ||||
|                                             <option value="Europe/Luxembourg">Luxembourg</option> | ||||
|                                             <option value="Europe/Madrid">Madrid</option> | ||||
|                                             <option value="Europe/Malta">Malta</option> | ||||
|                                             <option value="Europe/Mariehamn">Mariehamn</option> | ||||
|                                             <option value="Europe/Minsk">Minsk</option> | ||||
|                                             <option value="Europe/Monaco">Monaco</option> | ||||
|                                             <option value="Europe/Moscow">Moscow</option> | ||||
|                                             <option value="Europe/Nicosia">Nicosia</option> | ||||
|                                             <option value="Europe/Oslo">Oslo</option> | ||||
|                                             <option value="Europe/Paris">Paris</option> | ||||
|                                             <option value="Europe/Podgorica">Podgorica</option> | ||||
|                                             <option value="Europe/Prague">Prague</option> | ||||
|                                             <option value="Europe/Riga">Riga</option> | ||||
|                                             <option value="Europe/Rome">Rome</option> | ||||
|                                             <option value="Europe/Samara">Samara</option> | ||||
|                                             <option value="Europe/San_Marino">San Marino</option> | ||||
|                                             <option value="Europe/Sarajevo">Sarajevo</option> | ||||
|                                             <option value="Europe/Simferopol">Simferopol</option> | ||||
|                                             <option value="Europe/Skopje">Skopje</option> | ||||
|                                             <option value="Europe/Sofia">Sofia</option> | ||||
|                                             <option value="Europe/Stockholm">Stockholm</option> | ||||
|                                             <option value="Europe/Tallinn">Tallinn</option> | ||||
|                                             <option value="Europe/Tirane">Tirane</option> | ||||
|                                             <option value="Europe/Tiraspol">Tiraspol</option> | ||||
|                                             <option value="Europe/Uzhgorod">Uzhgorod</option> | ||||
|                                             <option value="Europe/Vaduz">Vaduz</option> | ||||
|                                             <option value="Europe/Vatican">Vatican</option> | ||||
|                                             <option value="Europe/Vienna">Vienna</option> | ||||
|                                             <option value="Europe/Vilnius">Vilnius</option> | ||||
|                                             <option value="Europe/Volgograd">Volgograd</option> | ||||
|                                             <option value="Europe/Warsaw">Warsaw</option> | ||||
|                                             <option value="Europe/Zagreb">Zagreb</option> | ||||
|                                             <option value="Europe/Zaporozhye">Zaporozhye</option> | ||||
|                                             <option value="Europe/Zurich">Zurich</option> | ||||
|                                           </optgroup> | ||||
|                                            | ||||
|                                           <optgroup label="Asia"> | ||||
|                                             <option value="Asia/Aden">Aden</option> | ||||
|                                             <option value="Asia/Almaty">Almaty</option> | ||||
|                                             <option value="Asia/Amman">Amman</option> | ||||
|                                             <option value="Asia/Anadyr">Anadyr</option> | ||||
|                                             <option value="Asia/Aqtau">Aqtau</option> | ||||
|                                             <option value="Asia/Aqtobe">Aqtobe</option> | ||||
|                                             <option value="Asia/Ashgabat">Ashgabat</option> | ||||
|                                             <option value="Asia/Ashkhabad">Ashkhabad</option> | ||||
|                                             <option value="Asia/Baghdad">Baghdad</option> | ||||
|                                             <option value="Asia/Bahrain">Bahrain</option> | ||||
|                                             <option value="Asia/Baku">Baku</option> | ||||
|                                             <option value="Asia/Bangkok">Bangkok</option> | ||||
|                                             <option value="Asia/Beirut">Beirut</option> | ||||
|                                             <option value="Asia/Bishkek">Bishkek</option> | ||||
|                                             <option value="Asia/Brunei">Brunei</option> | ||||
|                                             <option value="Asia/Calcutta">Calcutta</option> | ||||
|                                             <option value="Asia/Choibalsan">Choibalsan</option> | ||||
|                                             <option value="Asia/Chongqing">Chongqing</option> | ||||
|                                             <option value="Asia/Chungking">Chungking</option> | ||||
|                                             <option value="Asia/Colombo">Colombo</option> | ||||
|                                             <option value="Asia/Dacca">Dacca</option> | ||||
|                                             <option value="Asia/Damascus">Damascus</option> | ||||
|                                             <option value="Asia/Dhaka">Dhaka</option> | ||||
|                                             <option value="Asia/Dili">Dili</option> | ||||
|                                             <option value="Asia/Dubai">Dubai</option> | ||||
|                                             <option value="Asia/Dushanbe">Dushanbe</option> | ||||
|                                             <option value="Asia/Gaza">Gaza</option> | ||||
|                                             <option value="Asia/Harbin">Harbin</option> | ||||
|                                             <option value="Asia/Ho_Chi_Minh">Ho Chi Minh</option> | ||||
|                                             <option value="Asia/Hong_Kong">Hong Kong</option> | ||||
|                                             <option value="Asia/Hovd">Hovd</option> | ||||
|                                             <option value="Asia/Irkutsk">Irkutsk</option> | ||||
|                                             <option value="Asia/Istanbul">Istanbul</option> | ||||
|                                             <option value="Asia/Jakarta">Jakarta</option> | ||||
|                                             <option value="Asia/Jayapura">Jayapura</option> | ||||
|                                             <option value="Asia/Jerusalem">Jerusalem</option> | ||||
|                                             <option value="Asia/Kabul">Kabul</option> | ||||
|                                             <option value="Asia/Kamchatka">Kamchatka</option> | ||||
|                                             <option value="Asia/Karachi">Karachi</option> | ||||
|                                             <option value="Asia/Kashgar">Kashgar</option> | ||||
|                                             <option value="Asia/Kathmandu">Kathmandu</option> | ||||
|                                             <option value="Asia/Katmandu">Katmandu</option> | ||||
|                                             <option value="Asia/Kolkata">Kolkata</option> | ||||
|                                             <option value="Asia/Krasnoyarsk">Krasnoyarsk</option> | ||||
|                                             <option value="Asia/Kuala_Lumpur">Kuala Lumpur</option> | ||||
|                                             <option value="Asia/Kuching">Kuching</option> | ||||
|                                             <option value="Asia/Kuwait">Kuwait</option> | ||||
|                                             <option value="Asia/Macao">Macao</option> | ||||
|                                             <option value="Asia/Macau">Macau</option> | ||||
|                                             <option value="Asia/Magadan">Magadan</option> | ||||
|                                             <option value="Asia/Makassar">Makassar</option> | ||||
|                                             <option value="Asia/Manila">Manila</option> | ||||
|                                             <option value="Asia/Muscat">Muscat</option> | ||||
|                                             <option value="Asia/Nicosia">Nicosia</option> | ||||
|                                             <option value="Asia/Novokuznetsk">Novokuznetsk</option> | ||||
|                                             <option value="Asia/Novosibirsk">Novosibirsk</option> | ||||
|                                             <option value="Asia/Omsk">Omsk</option> | ||||
|                                             <option value="Asia/Oral">Oral</option> | ||||
|                                             <option value="Asia/Phnom_Penh">Phnom Penh</option> | ||||
|                                             <option value="Asia/Pontianak">Pontianak</option> | ||||
|                                             <option value="Asia/Pyongyang">Pyongyang</option> | ||||
|                                             <option value="Asia/Qatar">Qatar</option> | ||||
|                                             <option value="Asia/Qyzylorda">Qyzylorda</option> | ||||
|                                             <option value="Asia/Rangoon">Rangoon</option> | ||||
|                                             <option value="Asia/Riyadh">Riyadh</option> | ||||
|                                             <option value="Asia/Saigon">Saigon</option> | ||||
|                                             <option value="Asia/Sakhalin">Sakhalin</option> | ||||
|                                             <option value="Asia/Samarkand">Samarkand</option> | ||||
|                                             <option value="Asia/Seoul">Seoul</option> | ||||
|                                             <option value="Asia/Shanghai">Shanghai</option> | ||||
|                                             <option value="Asia/Singapore">Singapore</option> | ||||
|                                             <option value="Asia/Taipei">Taipei</option> | ||||
|                                             <option value="Asia/Tashkent">Tashkent</option> | ||||
|                                             <option value="Asia/Tbilisi">Tbilisi</option> | ||||
|                                             <option value="Asia/Tehran">Tehran</option> | ||||
|                                             <option value="Asia/Tel_Aviv">Tel Aviv</option> | ||||
|                                             <option value="Asia/Thimbu">Thimbu</option> | ||||
|                                             <option value="Asia/Thimphu">Thimphu</option> | ||||
|                                             <option value="Asia/Tokyo">Tokyo</option> | ||||
|                                             <option value="Asia/Ujung_Pandang">Ujung Pandang</option> | ||||
|                                             <option value="Asia/Ulaanbaatar">Ulaanbaatar</option> | ||||
|                                             <option value="Asia/Ulan_Bator">Ulan Bator</option> | ||||
|                                             <option value="Asia/Urumqi">Urumqi</option> | ||||
|                                             <option value="Asia/Vientiane">Vientiane</option> | ||||
|                                             <option value="Asia/Vladivostok">Vladivostok</option> | ||||
|                                             <option value="Asia/Yakutsk">Yakutsk</option> | ||||
|                                             <option value="Asia/Yekaterinburg">Yekaterinburg</option> | ||||
|                                             <option value="Asia/Yerevan">Yerevan</option> | ||||
|                                           </optgroup> | ||||
| 
 | ||||
|                                           <optgroup label="Africa"> | ||||
|                                             <option value="Africa/Abidjan">Abidjan</option> | ||||
|                                             <option value="Africa/Accra">Accra</option> | ||||
|                                             <option value="Africa/Addis_Ababa">Addis Ababa</option> | ||||
|                                             <option value="Africa/Algiers">Algiers</option> | ||||
|                                             <option value="Africa/Asmara">Asmara</option> | ||||
|                                             <option value="Africa/Asmera">Asmera</option> | ||||
|                                             <option value="Africa/Bamako">Bamako</option> | ||||
|                                             <option value="Africa/Bangui">Bangui</option> | ||||
|                                             <option value="Africa/Banjul">Banjul</option> | ||||
|                                             <option value="Africa/Bissau">Bissau</option> | ||||
|                                             <option value="Africa/Blantyre">Blantyre</option> | ||||
|                                             <option value="Africa/Brazzaville">Brazzaville</option> | ||||
|                                             <option value="Africa/Bujumbura">Bujumbura</option> | ||||
|                                             <option value="Africa/Cairo">Cairo</option> | ||||
|                                             <option value="Africa/Casablanca">Casablanca</option> | ||||
|                                             <option value="Africa/Ceuta">Ceuta</option> | ||||
|                                             <option value="Africa/Conakry">Conakry</option> | ||||
|                                             <option value="Africa/Dakar">Dakar</option> | ||||
|                                             <option value="Africa/Dar_es_Salaam">Dar es Salaam</option> | ||||
|                                             <option value="Africa/Djibouti">Djibouti</option> | ||||
|                                             <option value="Africa/Douala">Douala</option> | ||||
|                                             <option value="Africa/El_Aaiun">El Aaiun</option> | ||||
|                                             <option value="Africa/Freetown">Freetown</option> | ||||
|                                             <option value="Africa/Gaborone">Gaborone</option> | ||||
|                                             <option value="Africa/Harare">Harare</option> | ||||
|                                             <option value="Africa/Johannesburg">Johannesburg</option> | ||||
|                                             <option value="Africa/Kampala">Kampala</option> | ||||
|                                             <option value="Africa/Khartoum">Khartoum</option> | ||||
|                                             <option value="Africa/Kigali">Kigali</option> | ||||
|                                             <option value="Africa/Kinshasa">Kinshasa</option> | ||||
|                                             <option value="Africa/Lagos">Lagos</option> | ||||
|                                             <option value="Africa/Libreville">Libreville</option> | ||||
|                                             <option value="Africa/Lome">Lome</option> | ||||
|                                             <option value="Africa/Luanda">Luanda</option> | ||||
|                                             <option value="Africa/Lubumbashi">Lubumbashi</option> | ||||
|                                             <option value="Africa/Lusaka">Lusaka</option> | ||||
|                                             <option value="Africa/Malabo">Malabo</option> | ||||
|                                             <option value="Africa/Maputo">Maputo</option> | ||||
|                                             <option value="Africa/Maseru">Maseru</option> | ||||
|                                             <option value="Africa/Mbabane">Mbabane</option> | ||||
|                                             <option value="Africa/Mogadishu">Mogadishu</option> | ||||
|                                             <option value="Africa/Monrovia">Monrovia</option> | ||||
|                                             <option value="Africa/Nairobi">Nairobi</option> | ||||
|                                             <option value="Africa/Ndjamena">Ndjamena</option> | ||||
|                                             <option value="Africa/Niamey">Niamey</option> | ||||
|                                             <option value="Africa/Nouakchott">Nouakchott</option> | ||||
|                                             <option value="Africa/Ouagadougou">Ouagadougou</option> | ||||
|                                             <option value="Africa/Porto-Novo">Porto-Novo</option> | ||||
|                                             <option value="Africa/Sao_Tome">Sao Tome</option> | ||||
|                                             <option value="Africa/Timbuktu">Timbuktu</option> | ||||
|                                             <option value="Africa/Tripoli">Tripoli</option> | ||||
|                                             <option value="Africa/Tunis">Tunis</option> | ||||
|                                             <option value="Africa/Windhoek">Windhoek</option> | ||||
|                                           </optgroup> | ||||
|                                            | ||||
|                                           <optgroup label="Australia"> | ||||
|                                             <option value="Australia/ACT">ACT</option> | ||||
|                                             <option value="Australia/Adelaide">Adelaide</option> | ||||
|                                             <option value="Australia/Brisbane">Brisbane</option> | ||||
|                                             <option value="Australia/Broken_Hill">Broken Hill</option> | ||||
|                                             <option value="Australia/Canberra">Canberra</option> | ||||
|                                             <option value="Australia/Currie">Currie</option> | ||||
|                                             <option value="Australia/Darwin">Darwin</option> | ||||
|                                             <option value="Australia/Eucla">Eucla</option> | ||||
|                                             <option value="Australia/Hobart">Hobart</option> | ||||
|                                             <option value="Australia/LHI">LHI</option> | ||||
|                                             <option value="Australia/Lindeman">Lindeman</option> | ||||
|                                             <option value="Australia/Lord_Howe">Lord Howe</option> | ||||
|                                             <option value="Australia/Melbourne">Melbourne</option> | ||||
|                                             <option value="Australia/North">North</option> | ||||
|                                             <option value="Australia/NSW">NSW</option> | ||||
|                                             <option value="Australia/Perth">Perth</option> | ||||
|                                             <option value="Australia/Queensland">Queensland</option> | ||||
|                                             <option value="Australia/South">South</option> | ||||
|                                             <option value="Australia/Sydney">Sydney</option> | ||||
|                                             <option value="Australia/Tasmania">Tasmania</option> | ||||
|                                             <option value="Australia/Victoria">Victoria</option> | ||||
|                                             <option value="Australia/West">West</option> | ||||
|                                             <option value="Australia/Yancowinna">Yancowinna</option> | ||||
|                                           </optgroup> | ||||
| 
 | ||||
|                                           <optgroup label="Indian"> | ||||
|                                             <option value="Indian/Antananarivo">Antananarivo</option> | ||||
|                                             <option value="Indian/Chagos">Chagos</option> | ||||
|                                             <option value="Indian/Christmas">Christmas</option> | ||||
|                                             <option value="Indian/Cocos">Cocos</option> | ||||
|                                             <option value="Indian/Comoro">Comoro</option> | ||||
|                                             <option value="Indian/Kerguelen">Kerguelen</option> | ||||
|                                             <option value="Indian/Mahe">Mahe</option> | ||||
|                                             <option value="Indian/Maldives">Maldives</option> | ||||
|                                             <option value="Indian/Mauritius">Mauritius</option> | ||||
|                                             <option value="Indian/Mayotte">Mayotte</option> | ||||
|                                             <option value="Indian/Reunion">Reunion</option> | ||||
|                                           </optgroup> | ||||
|                                            | ||||
|                                           <optgroup label="Atlantic"> | ||||
|                                             <option value="Atlantic/Azores">Azores</option> | ||||
|                                             <option value="Atlantic/Bermuda">Bermuda</option> | ||||
|                                             <option value="Atlantic/Canary">Canary</option> | ||||
|                                             <option value="Atlantic/Cape_Verde">Cape Verde</option> | ||||
|                                             <option value="Atlantic/Faeroe">Faeroe</option> | ||||
|                                             <option value="Atlantic/Faroe">Faroe</option> | ||||
|                                             <option value="Atlantic/Jan_Mayen">Jan Mayen</option> | ||||
|                                             <option value="Atlantic/Madeira">Madeira</option> | ||||
|                                             <option value="Atlantic/Reykjavik">Reykjavik</option> | ||||
|                                             <option value="Atlantic/South_Georgia">South Georgia</option> | ||||
|                                             <option value="Atlantic/Stanley">Stanley</option> | ||||
|                                             <option value="Atlantic/St_Helena">St Helena</option> | ||||
|                                           </optgroup> | ||||
| 
 | ||||
|                                           <optgroup label="Pacific"> | ||||
|                                             <option value="Pacific/Apia">Apia</option> | ||||
|                                             <option value="Pacific/Auckland">Auckland</option> | ||||
|                                             <option value="Pacific/Chatham">Chatham</option> | ||||
|                                             <option value="Pacific/Easter">Easter</option> | ||||
|                                             <option value="Pacific/Efate">Efate</option> | ||||
|                                             <option value="Pacific/Enderbury">Enderbury</option> | ||||
|                                             <option value="Pacific/Fakaofo">Fakaofo</option> | ||||
|                                             <option value="Pacific/Fiji">Fiji</option> | ||||
|                                             <option value="Pacific/Funafuti">Funafuti</option> | ||||
|                                             <option value="Pacific/Galapagos">Galapagos</option> | ||||
|                                             <option value="Pacific/Gambier">Gambier</option> | ||||
|                                             <option value="Pacific/Guadalcanal">Guadalcanal</option> | ||||
|                                             <option value="Pacific/Guam">Guam</option> | ||||
|                                             <option value="Pacific/Honolulu">Honolulu</option> | ||||
|                                             <option value="Pacific/Johnston">Johnston</option> | ||||
|                                             <option value="Pacific/Kiritimati">Kiritimati</option> | ||||
|                                             <option value="Pacific/Kosrae">Kosrae</option> | ||||
|                                             <option value="Pacific/Kwajalein">Kwajalein</option> | ||||
|                                             <option value="Pacific/Majuro">Majuro</option> | ||||
|                                             <option value="Pacific/Marquesas">Marquesas</option> | ||||
|                                             <option value="Pacific/Midway">Midway</option> | ||||
|                                             <option value="Pacific/Nauru">Nauru</option> | ||||
|                                             <option value="Pacific/Niue">Niue</option> | ||||
|                                             <option value="Pacific/Norfolk">Norfolk</option> | ||||
|                                             <option value="Pacific/Noumea">Noumea</option> | ||||
|                                             <option value="Pacific/Pago_Pago">Pago Pago</option> | ||||
|                                             <option value="Pacific/Palau">Palau</option> | ||||
|                                             <option value="Pacific/Pitcairn">Pitcairn</option> | ||||
|                                             <option value="Pacific/Ponape">Ponape</option> | ||||
|                                             <option value="Pacific/Port_Moresby">Port Moresby</option> | ||||
|                                             <option value="Pacific/Rarotonga">Rarotonga</option> | ||||
|                                             <option value="Pacific/Saipan">Saipan</option> | ||||
|                                             <option value="Pacific/Samoa">Samoa</option> | ||||
|                                             <option value="Pacific/Tahiti">Tahiti</option> | ||||
|                                             <option value="Pacific/Tarawa">Tarawa</option> | ||||
|                                             <option value="Pacific/Tongatapu">Tongatapu</option> | ||||
|                                             <option value="Pacific/Truk">Truk</option> | ||||
|                                             <option value="Pacific/Wake">Wake</option> | ||||
|                                             <option value="Pacific/Wallis">Wallis</option> | ||||
|                                             <option value="Pacific/Yap">Yap</option> | ||||
|                                           </optgroup> | ||||
|                                            | ||||
|                                           <optgroup label="Antarctica"> | ||||
|                                             <option value="Antarctica/Casey">Casey</option> | ||||
|                                             <option value="Antarctica/Davis">Davis</option> | ||||
|                                             <option value="Antarctica/DumontDUrville">DumontDUrville</option> | ||||
|                                             <option value="Antarctica/Macquarie">Macquarie</option> | ||||
|                                             <option value="Antarctica/Mawson">Mawson</option> | ||||
|                                             <option value="Antarctica/McMurdo">McMurdo</option> | ||||
|                                             <option value="Antarctica/Palmer">Palmer</option> | ||||
|                                             <option value="Antarctica/Rothera">Rothera</option> | ||||
|                                             <option value="Antarctica/South_Pole">South Pole</option> | ||||
|                                             <option value="Antarctica/Syowa">Syowa</option> | ||||
|                                             <option value="Antarctica/Vostok">Vostok</option> | ||||
|                                           </optgroup> | ||||
| 
 | ||||
|                                           <optgroup label="Arctic"> | ||||
|                                             <option value="Arctic/Longyearbyen">Longyearbyen</option> | ||||
|                                           </optgroup> | ||||
|                                            | ||||
|                                         </select> | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                                 </div> | ||||
| 
 | ||||
|                                 <div className="mt-6 flex-grow lg:mt-0 lg:ml-6 lg:flex-grow-0 lg:flex-shrink-0"> | ||||
|  | @ -147,7 +654,8 @@ export async function getServerSideProps(context) { | |||
|             name: true, | ||||
|             email: true, | ||||
|             bio: true, | ||||
|             avatar: true | ||||
|             avatar: true, | ||||
|             timeZone: true, | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ model User { | |||
|   password      String? | ||||
|   bio           String? | ||||
|   avatar        String? | ||||
|   timeZone      String @default("Europe/London") | ||||
|   startTime     Int @default(0) | ||||
|   endTime       Int @default(1440) | ||||
|   createdDate   DateTime  @default(now()) @map(name: "created") | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Bailey Pumfleet
						Bailey Pumfleet