From 357bf9b41c696ac5f9d9b6b8c585c94d87f28baa Mon Sep 17 00:00:00 2001 From: Fabien Masson Date: Sun, 23 Aug 2026 13:33:40 +0200 Subject: [PATCH] choix de la timezone dans un select --- backend/.gitignore | 1 + .../migrations/000001_create_tables.up.sql | 3 +- backend/internal/domain/user.go | 1 + backend/internal/http/handlers/misc.go | 623 ++++++++++++++++++ backend/internal/http/router.go | 1 + backend/internal/service/user/service.go | 1 + backend/lassistanoque.db-wal | Bin 49472 -> 267832 bytes backend/web/package-lock.json | 78 ++- backend/web/package.json | 3 +- backend/web/src/lib/api/endpoints/misc.ts | 5 + backend/web/src/lib/types/api.ts | 1 + .../(authenticated)/profile/+page.svelte | 35 +- backend/web/src/routes/layout.css | 138 +++- 13 files changed, 848 insertions(+), 42 deletions(-) create mode 100644 backend/.gitignore create mode 100644 backend/internal/http/handlers/misc.go create mode 100644 backend/web/src/lib/api/endpoints/misc.ts diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1 @@ +.env diff --git a/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql b/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql index 2980d0b..dcf6abb 100644 --- a/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql +++ b/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql @@ -52,7 +52,8 @@ create table users ( picture text not null default '', enabled numeric default true, theme text default 'auto', - lang text default 'en', + lang text default 'fr', + timezone text default 'Europe/Paris', _date_created numeric not null default current_timestamp, _date_updated numeric, _version text not null diff --git a/backend/internal/domain/user.go b/backend/internal/domain/user.go index 840cf90..9358d53 100644 --- a/backend/internal/domain/user.go +++ b/backend/internal/domain/user.go @@ -14,6 +14,7 @@ type User struct { Enabled bool `db:"enabled" json:"enabled"` Theme string `db:"theme" json:"theme"` Lang string `db:"lang" json:"lang"` + Timezone string `db:"timezone" json:"timezone"` DateCreated time.Time `db:"_date_created" json:"_date_created"` DateUpdated *time.Time `db:"_date_updated" json:"_date_updated"` VersionId string `db:"_version" json:"_version"` diff --git a/backend/internal/http/handlers/misc.go b/backend/internal/http/handlers/misc.go new file mode 100644 index 0000000..ee4f784 --- /dev/null +++ b/backend/internal/http/handlers/misc.go @@ -0,0 +1,623 @@ +package handlers + +import ( + "net/http" + + "github.com/labstack/echo/v5" +) + +type MiscHandler struct { +} + +func NewMiscGroup(prefix string, e *echo.Group, middlewares ...echo.MiddlewareFunc) *echo.Group { + miscHandler := &MiscHandler{} + misc := e.Group(prefix, middlewares...) + misc.GET("/timezones", miscHandler.Timezones) + return misc +} + +func (h MiscHandler) Timezones(c *echo.Context) error { + + tz := []string{ + "Africa/Abidjan", + "Africa/Accra", + "Africa/Addis_Ababa", + "Africa/Algiers", + "Africa/Asmara", + "Africa/Asmera", + "Africa/Bamako", + "Africa/Bangui", + "Africa/Banjul", + "Africa/Bissau", + "Africa/Blantyre", + "Africa/Brazzaville", + "Africa/Bujumbura", + "Africa/Cairo", + "Africa/Casablanca", + "Africa/Ceuta", + "Africa/Conakry", + "Africa/Dakar", + "Africa/Dar_es_Salaam", + "Africa/Djibouti", + "Africa/Douala", + "Africa/El_Aaiun", + "Africa/Freetown", + "Africa/Gaborone", + "Africa/Harare", + "Africa/Johannesburg", + "Africa/Juba", + "Africa/Kampala", + "Africa/Khartoum", + "Africa/Kigali", + "Africa/Kinshasa", + "Africa/Lagos", + "Africa/Libreville", + "Africa/Lome", + "Africa/Luanda", + "Africa/Lubumbashi", + "Africa/Lusaka", + "Africa/Malabo", + "Africa/Maputo", + "Africa/Maseru", + "Africa/Mbabane", + "Africa/Mogadishu", + "Africa/Monrovia", + "Africa/Nairobi", + "Africa/Ndjamena", + "Africa/Niamey", + "Africa/Nouakchott", + "Africa/Ouagadougou", + "Africa/Porto-Novo", + "Africa/Sao_Tome", + "Africa/Timbuktu", + "Africa/Tripoli", + "Africa/Tunis", + "Africa/Windhoek", + "America/Adak", + "America/Anchorage", + "America/Anguilla", + "America/Antigua", + "America/Araguaina", + "America/Argentina/Buenos_Aires", + "America/Argentina/Catamarca", + "America/Argentina/ComodRivadavia", + "America/Argentina/Cordoba", + "America/Argentina/Jujuy", + "America/Argentina/La_Rioja", + "America/Argentina/Mendoza", + "America/Argentina/Rio_Gallegos", + "America/Argentina/Salta", + "America/Argentina/San_Juan", + "America/Argentina/San_Luis", + "America/Argentina/Tucuman", + "America/Argentina/Ushuaia", + "America/Aruba", + "America/Asuncion", + "America/Atikokan", + "America/Atka", + "America/Bahia", + "America/Bahia_Banderas", + "America/Barbados", + "America/Belem", + "America/Belize", + "America/Blanc-Sablon", + "America/Boa_Vista", + "America/Bogota", + "America/Boise", + "America/Buenos_Aires", + "America/Cambridge_Bay", + "America/Campo_Grande", + "America/Cancun", + "America/Caracas", + "America/Catamarca", + "America/Cayenne", + "America/Cayman", + "America/Chicago", + "America/Chihuahua", + "America/Ciudad_Juarez", + "America/Coral_Harbour", + "America/Cordoba", + "America/Costa_Rica", + "America/Coyhaique", + "America/Creston", + "America/Cuiaba", + "America/Curacao", + "America/Danmarkshavn", + "America/Dawson", + "America/Dawson_Creek", + "America/Denver", + "America/Detroit", + "America/Dominica", + "America/Edmonton", + "America/Eirunepe", + "America/El_Salvador", + "America/Ensenada", + "America/Fort_Nelson", + "America/Fort_Wayne", + "America/Fortaleza", + "America/Glace_Bay", + "America/Godthab", + "America/Goose_Bay", + "America/Grand_Turk", + "America/Grenada", + "America/Guadeloupe", + "America/Guatemala", + "America/Guayaquil", + "America/Guyana", + "America/Halifax", + "America/Havana", + "America/Hermosillo", + "America/Indiana/Indianapolis", + "America/Indiana/Knox", + "America/Indiana/Marengo", + "America/Indiana/Petersburg", + "America/Indiana/Tell_City", + "America/Indiana/Vevay", + "America/Indiana/Vincennes", + "America/Indiana/Winamac", + "America/Indianapolis", + "America/Inuvik", + "America/Iqaluit", + "America/Jamaica", + "America/Jujuy", + "America/Juneau", + "America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Knox_IN", + "America/Kralendijk", + "America/La_Paz", + "America/Lima", + "America/Los_Angeles", + "America/Louisville", + "America/Lower_Princes", + "America/Maceio", + "America/Managua", + "America/Manaus", + "America/Marigot", + "America/Martinique", + "America/Matamoros", + "America/Mazatlan", + "America/Mendoza", + "America/Menominee", + "America/Merida", + "America/Metlakatla", + "America/Mexico_City", + "America/Miquelon", + "America/Moncton", + "America/Monterrey", + "America/Montevideo", + "America/Montreal", + "America/Montserrat", + "America/Nassau", + "America/New_York", + "America/Nipigon", + "America/Nome", + "America/Noronha", + "America/North_Dakota/Beulah", + "America/North_Dakota/Center", + "America/North_Dakota/New_Salem", + "America/Nuuk", + "America/Ojinaga", + "America/Panama", + "America/Pangnirtung", + "America/Paramaribo", + "America/Phoenix", + "America/Port-au-Prince", + "America/Port_of_Spain", + "America/Porto_Acre", + "America/Porto_Velho", + "America/Puerto_Rico", + "America/Punta_Arenas", + "America/Rainy_River", + "America/Rankin_Inlet", + "America/Recife", + "America/Regina", + "America/Resolute", + "America/Rio_Branco", + "America/Rosario", + "America/Santa_Isabel", + "America/Santarem", + "America/Santiago", + "America/Santo_Domingo", + "America/Sao_Paulo", + "America/Scoresbysund", + "America/Shiprock", + "America/Sitka", + "America/St_Barthelemy", + "America/St_Johns", + "America/St_Kitts", + "America/St_Lucia", + "America/St_Thomas", + "America/St_Vincent", + "America/Swift_Current", + "America/Tegucigalpa", + "America/Thule", + "America/Thunder_Bay", + "America/Tijuana", + "America/Toronto", + "America/Tortola", + "America/Vancouver", + "America/Virgin", + "America/Whitehorse", + "America/Winnipeg", + "America/Yakutat", + "America/Yellowknife", + "Antarctica/Casey", + "Antarctica/Davis", + "Antarctica/DumontDUrville", + "Antarctica/Macquarie", + "Antarctica/Mawson", + "Antarctica/McMurdo", + "Antarctica/Palmer", + "Antarctica/Rothera", + "Antarctica/South_Pole", + "Antarctica/Syowa", + "Antarctica/Troll", + "Antarctica/Vostok", + "Arctic/Longyearbyen", + "Asia/Aden", + "Asia/Almaty", + "Asia/Amman", + "Asia/Anadyr", + "Asia/Aqtau", + "Asia/Aqtobe", + "Asia/Ashgabat", + "Asia/Ashkhabad", + "Asia/Atyrau", + "Asia/Baghdad", + "Asia/Bahrain", + "Asia/Baku", + "Asia/Bangkok", + "Asia/Barnaul", + "Asia/Beirut", + "Asia/Bishkek", + "Asia/Brunei", + "Asia/Calcutta", + "Asia/Chita", + "Asia/Choibalsan", + "Asia/Chongqing", + "Asia/Chungking", + "Asia/Colombo", + "Asia/Dacca", + "Asia/Damascus", + "Asia/Dhaka", + "Asia/Dili", + "Asia/Dubai", + "Asia/Dushanbe", + "Asia/Famagusta", + "Asia/Gaza", + "Asia/Harbin", + "Asia/Hebron", + "Asia/Ho_Chi_Minh", + "Asia/Hong_Kong", + "Asia/Hovd", + "Asia/Irkutsk", + "Asia/Istanbul", + "Asia/Jakarta", + "Asia/Jayapura", + "Asia/Jerusalem", + "Asia/Kabul", + "Asia/Kamchatka", + "Asia/Karachi", + "Asia/Kashgar", + "Asia/Kathmandu", + "Asia/Katmandu", + "Asia/Khandyga", + "Asia/Kolkata", + "Asia/Krasnoyarsk", + "Asia/Kuala_Lumpur", + "Asia/Kuching", + "Asia/Kuwait", + "Asia/Macao", + "Asia/Macau", + "Asia/Magadan", + "Asia/Makassar", + "Asia/Manila", + "Asia/Muscat", + "Asia/Nicosia", + "Asia/Novokuznetsk", + "Asia/Novosibirsk", + "Asia/Omsk", + "Asia/Oral", + "Asia/Phnom_Penh", + "Asia/Pontianak", + "Asia/Pyongyang", + "Asia/Qatar", + "Asia/Qostanay", + "Asia/Qyzylorda", + "Asia/Rangoon", + "Asia/Riyadh", + "Asia/Saigon", + "Asia/Sakhalin", + "Asia/Samarkand", + "Asia/Seoul", + "Asia/Shanghai", + "Asia/Singapore", + "Asia/Srednekolymsk", + "Asia/Taipei", + "Asia/Tashkent", + "Asia/Tbilisi", + "Asia/Tehran", + "Asia/Tel_Aviv", + "Asia/Thimbu", + "Asia/Thimphu", + "Asia/Tokyo", + "Asia/Tomsk", + "Asia/Ujung_Pandang", + "Asia/Ulaanbaatar", + "Asia/Ulan_Bator", + "Asia/Urumqi", + "Asia/Ust-Nera", + "Asia/Vientiane", + "Asia/Vladivostok", + "Asia/Yakutsk", + "Asia/Yangon", + "Asia/Yekaterinburg", + "Asia/Yerevan", + "Atlantic/Azores", + "Atlantic/Bermuda", + "Atlantic/Canary", + "Atlantic/Cape_Verde", + "Atlantic/Faeroe", + "Atlantic/Faroe", + "Atlantic/Jan_Mayen", + "Atlantic/Madeira", + "Atlantic/Reykjavik", + "Atlantic/South_Georgia", + "Atlantic/St_Helena", + "Atlantic/Stanley", + "Australia/ACT", + "Australia/Adelaide", + "Australia/Brisbane", + "Australia/Broken_Hill", + "Australia/Canberra", + "Australia/Currie", + "Australia/Darwin", + "Australia/Eucla", + "Australia/Hobart", + "Australia/LHI", + "Australia/Lindeman", + "Australia/Lord_Howe", + "Australia/Melbourne", + "Australia/NSW", + "Australia/North", + "Australia/Perth", + "Australia/Queensland", + "Australia/South", + "Australia/Sydney", + "Australia/Tasmania", + "Australia/Victoria", + "Australia/West", + "Australia/Yancowinna", + "Brazil/Acre", + "Brazil/DeNoronha", + "Brazil/East", + "Brazil/West", + "CET", + "CST6CDT", + "Canada/Atlantic", + "Canada/Central", + "Canada/Eastern", + "Canada/Mountain", + "Canada/Newfoundland", + "Canada/Pacific", + "Canada/Saskatchewan", + "Canada/Yukon", + "Chile/Continental", + "Chile/EasterIsland", + "Cuba", + "EET", + "EST", + "EST5EDT", + "Egypt", + "Eire", + "Etc/GMT", + "Etc/GMT+0", + "Etc/GMT+1", + "Etc/GMT+10", + "Etc/GMT+11", + "Etc/GMT+12", + "Etc/GMT+2", + "Etc/GMT+3", + "Etc/GMT+4", + "Etc/GMT+5", + "Etc/GMT+6", + "Etc/GMT+7", + "Etc/GMT+8", + "Etc/GMT+9", + "Etc/GMT-0", + "Etc/GMT-1", + "Etc/GMT-10", + "Etc/GMT-11", + "Etc/GMT-12", + "Etc/GMT-13", + "Etc/GMT-14", + "Etc/GMT-2", + "Etc/GMT-3", + "Etc/GMT-4", + "Etc/GMT-5", + "Etc/GMT-6", + "Etc/GMT-7", + "Etc/GMT-8", + "Etc/GMT-9", + "Etc/GMT0", + "Etc/Greenwich", + "Etc/UCT", + "Etc/UTC", + "Etc/Universal", + "Etc/Zulu", + "Europe/Amsterdam", + "Europe/Andorra", + "Europe/Astrakhan", + "Europe/Athens", + "Europe/Belfast", + "Europe/Belgrade", + "Europe/Berlin", + "Europe/Bratislava", + "Europe/Brussels", + "Europe/Bucharest", + "Europe/Budapest", + "Europe/Busingen", + "Europe/Chisinau", + "Europe/Copenhagen", + "Europe/Dublin", + "Europe/Gibraltar", + "Europe/Guernsey", + "Europe/Helsinki", + "Europe/Isle_of_Man", + "Europe/Istanbul", + "Europe/Jersey", + "Europe/Kaliningrad", + "Europe/Kiev", + "Europe/Kirov", + "Europe/Kyiv", + "Europe/Lisbon", + "Europe/Ljubljana", + "Europe/London", + "Europe/Luxembourg", + "Europe/Madrid", + "Europe/Malta", + "Europe/Mariehamn", + "Europe/Minsk", + "Europe/Monaco", + "Europe/Moscow", + "Europe/Nicosia", + "Europe/Oslo", + "Europe/Paris", + "Europe/Podgorica", + "Europe/Prague", + "Europe/Riga", + "Europe/Rome", + "Europe/Samara", + "Europe/San_Marino", + "Europe/Sarajevo", + "Europe/Saratov", + "Europe/Simferopol", + "Europe/Skopje", + "Europe/Sofia", + "Europe/Stockholm", + "Europe/Tallinn", + "Europe/Tirane", + "Europe/Tiraspol", + "Europe/Ulyanovsk", + "Europe/Uzhgorod", + "Europe/Vaduz", + "Europe/Vatican", + "Europe/Vienna", + "Europe/Vilnius", + "Europe/Volgograd", + "Europe/Warsaw", + "Europe/Zagreb", + "Europe/Zaporozhye", + "Europe/Zurich", + "Factory", + "GB", + "GB-Eire", + "GMT", + "GMT+0", + "GMT-0", + "GMT0", + "Greenwich", + "HST", + "Hongkong", + "Iceland", + "Indian/Antananarivo", + "Indian/Chagos", + "Indian/Christmas", + "Indian/Cocos", + "Indian/Comoro", + "Indian/Kerguelen", + "Indian/Mahe", + "Indian/Maldives", + "Indian/Mauritius", + "Indian/Mayotte", + "Indian/Reunion", + "Iran", + "Israel", + "Jamaica", + "Japan", + "Kwajalein", + "Libya", + "MET", + "MST", + "MST7MDT", + "Mexico/BajaNorte", + "Mexico/BajaSur", + "Mexico/General", + "NZ", + "NZ-CHAT", + "Navajo", + "PRC", + "PST8PDT", + "Pacific/Apia", + "Pacific/Auckland", + "Pacific/Bougainville", + "Pacific/Chatham", + "Pacific/Chuuk", + "Pacific/Easter", + "Pacific/Efate", + "Pacific/Enderbury", + "Pacific/Fakaofo", + "Pacific/Fiji", + "Pacific/Funafuti", + "Pacific/Galapagos", + "Pacific/Gambier", + "Pacific/Guadalcanal", + "Pacific/Guam", + "Pacific/Honolulu", + "Pacific/Johnston", + "Pacific/Kanton", + "Pacific/Kiritimati", + "Pacific/Kosrae", + "Pacific/Kwajalein", + "Pacific/Majuro", + "Pacific/Marquesas", + "Pacific/Midway", + "Pacific/Nauru", + "Pacific/Niue", + "Pacific/Norfolk", + "Pacific/Noumea", + "Pacific/Pago_Pago", + "Pacific/Palau", + "Pacific/Pitcairn", + "Pacific/Pohnpei", + "Pacific/Ponape", + "Pacific/Port_Moresby", + "Pacific/Rarotonga", + "Pacific/Saipan", + "Pacific/Samoa", + "Pacific/Tahiti", + "Pacific/Tarawa", + "Pacific/Tongatapu", + "Pacific/Truk", + "Pacific/Wake", + "Pacific/Wallis", + "Pacific/Yap", + "Poland", + "Portugal", + "ROC", + "ROK", + "Singapore", + "Turkey", + "UCT", + "US/Alaska", + "US/Aleutian", + "US/Arizona", + "US/Central", + "US/East-Indiana", + "US/Eastern", + "US/Hawaii", + "US/Indiana-Starke", + "US/Michigan", + "US/Mountain", + "US/Pacific", + "US/Samoa", + "UTC", + "Universal", + "W-SU", + "WET", + "Zulu", + } + + return c.JSON(http.StatusOK, tz) +} diff --git a/backend/internal/http/router.go b/backend/internal/http/router.go index 5f48e33..d228e8f 100644 --- a/backend/internal/http/router.go +++ b/backend/internal/http/router.go @@ -70,6 +70,7 @@ func NewRouter(deps Dependencies) *Router { api := e.Group("/api") _ = handlers.NewAuthGroup("/auth", api, deps.AuthService) _ = handlers.NewUserGroup("/user", api, deps.UserService, deps.TokenManager.TokenMiddleware) + _ = handlers.NewMiscGroup("/misc", api, deps.TokenManager.TokenMiddleware) return &Router{ echo: e, diff --git a/backend/internal/service/user/service.go b/backend/internal/service/user/service.go index af6d2b5..29f27cb 100644 --- a/backend/internal/service/user/service.go +++ b/backend/internal/service/user/service.go @@ -41,6 +41,7 @@ func (s *Service) UpdateUser(updUser *domain.User, fromAdmin bool) (*domain.User user.Lastname = updUser.Lastname user.Theme = updUser.Theme user.Lang = updUser.Lang + user.Timezone = updUser.Timezone return s.repo.UpdateUser(user) diff --git a/backend/lassistanoque.db-wal b/backend/lassistanoque.db-wal index 8e1e47e793f8dcc2c9e6c788da88c3dfb3883486..5ecb3790474dc011d6cc45b24d2038031519856b 100644 GIT binary patch literal 267832 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 diff --git a/backend/web/package-lock.json b/backend/web/package-lock.json index 4b74380..d3932af 100644 --- a/backend/web/package-lock.json +++ b/backend/web/package-lock.json @@ -8,7 +8,8 @@ "name": "web", "version": "0.0.1", "dependencies": { - "oidc-client-ts": "^3.5.0" + "oidc-client-ts": "^3.5.0", + "svelte-select": "^6.0.0" }, "devDependencies": { "@eslint/js": "^10.0.1", @@ -198,6 +199,31 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -268,7 +294,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -279,7 +304,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -290,7 +314,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -300,14 +323,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -822,7 +843,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.11.tgz", "integrity": "sha512-LFuZUkjJ9iF7JZye/aG5XM0SFcQ5VyL0oVX4WJ9dc0Va3R3s0OauX1BESVCb+YN/ol8TAfqGDDAQsTG627Y5kw==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^8.9.0" @@ -1259,7 +1279,6 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1283,7 +1302,6 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, "license": "MIT" }, "node_modules/@types/ws": { @@ -1446,7 +1464,7 @@ "version": "8.65.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1530,7 +1548,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1570,7 +1587,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -1580,7 +1596,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -1613,7 +1628,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -1706,7 +1720,6 @@ "version": "5.9.0", "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.0.tgz", "integrity": "sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==", - "dev": true, "license": "MIT" }, "node_modules/enhanced-resolve": { @@ -1894,7 +1907,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, "license": "MIT" }, "node_modules/espree": { @@ -1932,7 +1944,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.3.0.tgz", "integrity": "sha512-GQ/7RN8uOtEfNpzZzBMTzW9JBcX42oaSVtPzdF+6cEL8pqIL094iUpr9jzYGn4O4P/1S60dJ6izyT8F4LYARng==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -2164,7 +2175,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" @@ -2595,7 +2605,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, "license": "MIT" }, "node_modules/locate-path": { @@ -2618,7 +2627,6 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -2678,9 +2686,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -3211,7 +3219,6 @@ "version": "5.56.8", "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.56.8.tgz", "integrity": "sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", @@ -3383,6 +3390,28 @@ "node": ">=4" } }, + "node_modules/svelte-floating-ui": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/svelte-floating-ui/-/svelte-floating-ui-1.5.8.tgz", + "integrity": "sha512-dVvJhZ2bT+kQDHlE4Lep8t+sgEc0XD96fXLzAi2DDI2bsaegBbClxXVNMma0C2WsG+n9GJSYx292dTvA8CYRtw==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.5.0", + "@floating-ui/dom": "^1.5.3" + } + }, + "node_modules/svelte-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-6.0.0.tgz", + "integrity": "sha512-WJ1UDw0a1Z3I7oVFgaCS7G9D2rCSmYAPpufNEj/DNuk5Oyb2a5dju6F36o0urBVw9bTE3WkM9cZkI0x+Sfo8Bg==", + "license": "ISC", + "dependencies": { + "svelte-floating-ui": "1.5.8" + }, + "peerDependencies": { + "svelte": ">=5" + } + }, "node_modules/tailwindcss": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", @@ -3973,7 +4002,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "dev": true, "license": "MIT" } } diff --git a/backend/web/package.json b/backend/web/package.json index e29a433..3c46b7a 100644 --- a/backend/web/package.json +++ b/backend/web/package.json @@ -48,6 +48,7 @@ "esbuild": "^0.25.0" }, "dependencies": { - "oidc-client-ts": "^3.5.0" + "oidc-client-ts": "^3.5.0", + "svelte-select": "^6.0.0" } } diff --git a/backend/web/src/lib/api/endpoints/misc.ts b/backend/web/src/lib/api/endpoints/misc.ts new file mode 100644 index 0000000..40ff5cf --- /dev/null +++ b/backend/web/src/lib/api/endpoints/misc.ts @@ -0,0 +1,5 @@ +import { api } from '../client'; + +export const miscApi = { + listTimezones: () => api.get(`/misc/timezones`), +}; diff --git a/backend/web/src/lib/types/api.ts b/backend/web/src/lib/types/api.ts index b6d29bc..185e268 100644 --- a/backend/web/src/lib/types/api.ts +++ b/backend/web/src/lib/types/api.ts @@ -5,6 +5,7 @@ export interface User { email: string theme: string lang: string + timezone: string _version: string } diff --git a/backend/web/src/routes/(authenticated)/profile/+page.svelte b/backend/web/src/routes/(authenticated)/profile/+page.svelte index 462e4f7..321f77f 100644 --- a/backend/web/src/routes/(authenticated)/profile/+page.svelte +++ b/backend/web/src/routes/(authenticated)/profile/+page.svelte @@ -4,20 +4,24 @@ import type { PageProps } from './$types'; import type { User, Address } from '$lib/types/api' import { userApi } from '$lib/api/endpoints/user' + import { miscApi } from '$lib/api/endpoints/misc' import FormError from '$lib/components/FormError.svelte'; import { applyTheme, themeToLocalStorage } from '$lib/ui/themeswitcher'; import { validateEmail } from '$lib/utilities/validators' - import { onMount } from 'svelte'; + import { onMount } from 'svelte'; + import Select from 'svelte-select/no-styles'; let { data }: PageProps = $props(); let form : User = $state(data.me) let addresses : Address[] = $state([] as Address[]) let newAddress : Address = $state({} as Address) + let timezones = $state([] as string[]) let errors = new SvelteMap() onMount(async ()=> { addresses = await userApi.listAddresses(form.id) + timezones = await miscApi.listTimezones() }) $effect(()=>{ @@ -100,17 +104,8 @@
-
- - - -
-
+
+ +
+ + + + + + +
@@ -131,7 +142,7 @@ {#each addresses as address (address.id) }
-
+
{address.type} : {address.address}