diff --git a/assets/data/nollning_26/calendar/alcfree_icon.png b/assets/data/nollning_26/calendar/alcfree_icon.png new file mode 100644 index 00000000..1855cdea Binary files /dev/null and b/assets/data/nollning_26/calendar/alcfree_icon.png differ diff --git a/assets/data/nollning_26/calendar/alcfull_icon.png b/assets/data/nollning_26/calendar/alcfull_icon.png new file mode 100644 index 00000000..50831466 Binary files /dev/null and b/assets/data/nollning_26/calendar/alcfull_icon.png differ diff --git a/assets/data/nollning_26/calendar/byob_icon.png b/assets/data/nollning_26/calendar/byob_icon.png new file mode 100644 index 00000000..febad7d3 Binary files /dev/null and b/assets/data/nollning_26/calendar/byob_icon.png differ diff --git a/assets/data/nollning_26/calendar/event_background.png b/assets/data/nollning_26/calendar/event_background.png new file mode 100644 index 00000000..0145a400 Binary files /dev/null and b/assets/data/nollning_26/calendar/event_background.png differ diff --git a/assets/data/nollning_26/calendar/event_banner.png b/assets/data/nollning_26/calendar/event_banner.png new file mode 100644 index 00000000..d8f29fc1 Binary files /dev/null and b/assets/data/nollning_26/calendar/event_banner.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/background.png b/assets/data/nollning_26/homescreen/lvl_0/background.png new file mode 100644 index 00000000..a1a7549f Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/background.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_contact_en.png b/assets/data/nollning_26/homescreen/lvl_0/button_contact_en.png new file mode 100644 index 00000000..22e365ff Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_contact_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_contact_sv.png b/assets/data/nollning_26/homescreen/lvl_0/button_contact_sv.png new file mode 100644 index 00000000..c975b092 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_contact_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_guide_en.png b/assets/data/nollning_26/homescreen/lvl_0/button_guide_en.png new file mode 100644 index 00000000..016bcd54 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_guide_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_guide_sv.png b/assets/data/nollning_26/homescreen/lvl_0/button_guide_sv.png new file mode 100644 index 00000000..d16c7292 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_guide_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_map_en.png b/assets/data/nollning_26/homescreen/lvl_0/button_map_en.png new file mode 100644 index 00000000..3f9bfae8 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_map_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_map_sv.png b/assets/data/nollning_26/homescreen/lvl_0/button_map_sv.png new file mode 100644 index 00000000..95e1187f Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_map_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_quest.png b/assets/data/nollning_26/homescreen/lvl_0/button_quest.png new file mode 100644 index 00000000..b90e7d08 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_quest.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_schedule_en.png b/assets/data/nollning_26/homescreen/lvl_0/button_schedule_en.png new file mode 100644 index 00000000..d3ba5dcf Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_schedule_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_schedule_sv.png b/assets/data/nollning_26/homescreen/lvl_0/button_schedule_sv.png new file mode 100644 index 00000000..bf9eba13 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_schedule_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_song_en.png b/assets/data/nollning_26/homescreen/lvl_0/button_song_en.png new file mode 100644 index 00000000..c916a2a1 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_song_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_0/button_song_sv.png b/assets/data/nollning_26/homescreen/lvl_0/button_song_sv.png new file mode 100644 index 00000000..58fcbb18 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_0/button_song_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/background.png b/assets/data/nollning_26/homescreen/lvl_1/background.png new file mode 100644 index 00000000..4d51c812 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/background.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_contact_en.png b/assets/data/nollning_26/homescreen/lvl_1/button_contact_en.png new file mode 100644 index 00000000..7e2bd837 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_contact_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_contact_sv.png b/assets/data/nollning_26/homescreen/lvl_1/button_contact_sv.png new file mode 100644 index 00000000..73b249a3 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_contact_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_guide_en.png b/assets/data/nollning_26/homescreen/lvl_1/button_guide_en.png new file mode 100644 index 00000000..40c7ae49 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_guide_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_guide_sv.png b/assets/data/nollning_26/homescreen/lvl_1/button_guide_sv.png new file mode 100644 index 00000000..a1409ae5 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_guide_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_map_en.png b/assets/data/nollning_26/homescreen/lvl_1/button_map_en.png new file mode 100644 index 00000000..7cdf62b1 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_map_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_map_sv.png b/assets/data/nollning_26/homescreen/lvl_1/button_map_sv.png new file mode 100644 index 00000000..59b49e21 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_map_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_quest.png b/assets/data/nollning_26/homescreen/lvl_1/button_quest.png new file mode 100644 index 00000000..7b20bc6c Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_quest.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_schedule_en.png b/assets/data/nollning_26/homescreen/lvl_1/button_schedule_en.png new file mode 100644 index 00000000..9ee9d32c Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_schedule_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_schedule_sv.png b/assets/data/nollning_26/homescreen/lvl_1/button_schedule_sv.png new file mode 100644 index 00000000..1d66d313 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_schedule_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_song_en.png b/assets/data/nollning_26/homescreen/lvl_1/button_song_en.png new file mode 100644 index 00000000..946b9009 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_song_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_1/button_song_sv.png b/assets/data/nollning_26/homescreen/lvl_1/button_song_sv.png new file mode 100644 index 00000000..aec123d8 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_1/button_song_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/background.png b/assets/data/nollning_26/homescreen/lvl_2/background.png new file mode 100644 index 00000000..9f6c69c2 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/background.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_contact_en.png b/assets/data/nollning_26/homescreen/lvl_2/button_contact_en.png new file mode 100644 index 00000000..4d578b2a Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_contact_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_contact_sv.png b/assets/data/nollning_26/homescreen/lvl_2/button_contact_sv.png new file mode 100644 index 00000000..5047c095 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_contact_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_guide_en.png b/assets/data/nollning_26/homescreen/lvl_2/button_guide_en.png new file mode 100644 index 00000000..2a17b5a1 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_guide_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_guide_sv.png b/assets/data/nollning_26/homescreen/lvl_2/button_guide_sv.png new file mode 100644 index 00000000..43975ac9 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_guide_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_map_en.png b/assets/data/nollning_26/homescreen/lvl_2/button_map_en.png new file mode 100644 index 00000000..aedda283 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_map_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_map_sv.png b/assets/data/nollning_26/homescreen/lvl_2/button_map_sv.png new file mode 100644 index 00000000..30a557ac Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_map_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_quest.png b/assets/data/nollning_26/homescreen/lvl_2/button_quest.png new file mode 100644 index 00000000..a6b0ddde Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_quest.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_schedule_en.png b/assets/data/nollning_26/homescreen/lvl_2/button_schedule_en.png new file mode 100644 index 00000000..62fc80ad Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_schedule_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_schedule_sv.png b/assets/data/nollning_26/homescreen/lvl_2/button_schedule_sv.png new file mode 100644 index 00000000..a19cdbcb Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_schedule_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_song_en.png b/assets/data/nollning_26/homescreen/lvl_2/button_song_en.png new file mode 100644 index 00000000..b172133a Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_song_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_2/button_song_sv.png b/assets/data/nollning_26/homescreen/lvl_2/button_song_sv.png new file mode 100644 index 00000000..1191f028 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_2/button_song_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/background.png b/assets/data/nollning_26/homescreen/lvl_3/background.png new file mode 100644 index 00000000..c9c087e0 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/background.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_contact_en.png b/assets/data/nollning_26/homescreen/lvl_3/button_contact_en.png new file mode 100644 index 00000000..b1805932 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_contact_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_contact_sv.png b/assets/data/nollning_26/homescreen/lvl_3/button_contact_sv.png new file mode 100644 index 00000000..bbda0fd3 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_contact_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_guide_en.png b/assets/data/nollning_26/homescreen/lvl_3/button_guide_en.png new file mode 100644 index 00000000..ee482802 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_guide_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_guide_sv.png b/assets/data/nollning_26/homescreen/lvl_3/button_guide_sv.png new file mode 100644 index 00000000..4ec54d33 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_guide_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_map_en.png b/assets/data/nollning_26/homescreen/lvl_3/button_map_en.png new file mode 100644 index 00000000..803a5014 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_map_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_map_sv.png b/assets/data/nollning_26/homescreen/lvl_3/button_map_sv.png new file mode 100644 index 00000000..c197fd5b Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_map_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_quest.png b/assets/data/nollning_26/homescreen/lvl_3/button_quest.png new file mode 100644 index 00000000..81c811d1 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_quest.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_schedule_en.png b/assets/data/nollning_26/homescreen/lvl_3/button_schedule_en.png new file mode 100644 index 00000000..08f8f100 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_schedule_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_schedule_sv.png b/assets/data/nollning_26/homescreen/lvl_3/button_schedule_sv.png new file mode 100644 index 00000000..1e49c4f1 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_schedule_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_song_en.png b/assets/data/nollning_26/homescreen/lvl_3/button_song_en.png new file mode 100644 index 00000000..ec5379e8 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_song_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_3/button_song_sv.png b/assets/data/nollning_26/homescreen/lvl_3/button_song_sv.png new file mode 100644 index 00000000..c5751360 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_3/button_song_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/background.png b/assets/data/nollning_26/homescreen/lvl_4/background.png new file mode 100644 index 00000000..2c1e25c8 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/background.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_contact_en.png b/assets/data/nollning_26/homescreen/lvl_4/button_contact_en.png new file mode 100644 index 00000000..92f90931 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_contact_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_contact_sv.png b/assets/data/nollning_26/homescreen/lvl_4/button_contact_sv.png new file mode 100644 index 00000000..1b03ad30 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_contact_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_guide_en.png b/assets/data/nollning_26/homescreen/lvl_4/button_guide_en.png new file mode 100644 index 00000000..8873e23c Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_guide_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_guide_sv.png b/assets/data/nollning_26/homescreen/lvl_4/button_guide_sv.png new file mode 100644 index 00000000..252a8c91 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_guide_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_map_en.png b/assets/data/nollning_26/homescreen/lvl_4/button_map_en.png new file mode 100644 index 00000000..91f69d66 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_map_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_map_sv.png b/assets/data/nollning_26/homescreen/lvl_4/button_map_sv.png new file mode 100644 index 00000000..9630d020 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_map_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_quest.png b/assets/data/nollning_26/homescreen/lvl_4/button_quest.png new file mode 100644 index 00000000..df242eae Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_quest.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_schedule_en.png b/assets/data/nollning_26/homescreen/lvl_4/button_schedule_en.png new file mode 100644 index 00000000..8ced2523 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_schedule_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_schedule_sv.png b/assets/data/nollning_26/homescreen/lvl_4/button_schedule_sv.png new file mode 100644 index 00000000..d12f7b85 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_schedule_sv.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_song_en.png b/assets/data/nollning_26/homescreen/lvl_4/button_song_en.png new file mode 100644 index 00000000..05e65711 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_song_en.png differ diff --git a/assets/data/nollning_26/homescreen/lvl_4/button_song_sv.png b/assets/data/nollning_26/homescreen/lvl_4/button_song_sv.png new file mode 100644 index 00000000..d07d01d7 Binary files /dev/null and b/assets/data/nollning_26/homescreen/lvl_4/button_song_sv.png differ diff --git a/assets/data/nollning_26/map/map.png b/assets/data/nollning_26/map/map.png new file mode 100644 index 00000000..7940ca49 Binary files /dev/null and b/assets/data/nollning_26/map/map.png differ diff --git a/assets/data/nollning_26/map/map_info.json b/assets/data/nollning_26/map/map_info.json new file mode 100644 index 00000000..074fdd01 --- /dev/null +++ b/assets/data/nollning_26/map/map_info.json @@ -0,0 +1,197 @@ +[ + { + "title": { + "sv": "Kemicentrum", + "en": "The Chemistry Centre" + }, + "description": { + "sv": "Längst bort från trygga hemvisten hittar vi Kemicentrum! I dess korridorer rör sig K-pHøs och W-Phøs. Packa matsäck och kaffe för vägen hit tar hela 9 minuter av vandring.", + "en": "Furthest away from our familiar home base, we find the Chemistry Centre! K-pHøs and W-Phøs roam its corridors. Pack a packed lunch and some coffee, because the walk here takes a whole 9 minutes." + }, + "descriptionAssets": [], + "boxes": [ + { + "left": 1489.0, + "top": 1081.0, + "width": 730.0, + "height": 277.0 + } + ] + }, + { + "title": { + "sv": "A-huset", + "en": "The A-building" + }, + "description": { + "sv": "Bland glitter och glamour träder A-Phøs fram. Man finner dem här, i A-huset. Resan hit tar 8 minuter från Mattehuset.", + "en": "Amidst the glitz and glamour, A-Phøs steps into the spotlight. You can find them here, in the A-building. The journey here takes 8 minutes from the Math Building." + }, + "descriptionAssets": [ + "assets/data/nollning_26/map/pin_media/Aphos.jpg" + ], + "boxes": [ + { + "left": 2095.0, + "top": 1534.0, + "width": 278.0, + "height": 424.0 + } + ] + }, + { + "title": { + "sv": "V-huset", + "en": "The V-building" + }, + "description": { + "sv": "Slå upp dörrarna in till V-huset och V-Phøs du skall finna! Expeditionen hit tar hela 6 minuter och ska man ta sig så långt från Mattehuset bör riskerna beaktas.", + "en": "Throw open the doors to the V-building, and you shall find V-Phøs! The trek here takes a full six minutes, and venturing that far from the Math Building means the risks should be considered." + }, + "descriptionAssets": [], + "boxes": [ + { + "left": 1926.0, + "top": 1964.0, + "width": 274.0, + "height": 437.0 + } + ] + }, + { + "title": { + "sv": "E-huset", + "en": "The E-building" + }, + "description": { + "sv": "Välkommen in i värmen av E-huset. I denna byggnad finner vi E-Phøs och D-stab. Färden hit tar er 3 minuter från Mattehuset.", + "en": "Welcome into the warmth of the E-building. This building houses E-Phøs and D-stab. The journey here takes three minutes from the Math Building." + }, + "descriptionAssets": [], + "boxes": [ + { + "left": 1834.0, + "top": 2419.0, + "width": 257.0, + "height": 400.0 + } + ] + }, + { + "title": { + "sv": "M-huset", + "en": "The M-building" + }, + "description": { + "sv": "Hej och välkomna till M-huset! I denna byggnaden hittar ni M-Phøs och I-Phøs. Ska ni bege er hit från Mattehuset tar det er ungefär 4 minuter att gå.", + "en": "Hello and welcome to the M-building! In this building, you will find M-Phøs and I-Phøs. If you are coming here from the Math Building, it takes about four minutes to walk." + }, + "descriptionAssets": [ + "assets/data/nollning_26/map/pin_media/Mphos.jpg" + ], + "boxes": [ + { + "left": 1781.0, + "top": 2879.0, + "width": 240.0, + "height": 434.0 + } + ] + }, + { + "title": { + "sv": "Mattehuset", + "en": "The Math Building" + }, + "description": { + "sv": "Så du har hittat hem, det glädjer mig! I denna byggnaden hänger F-fös och du kan känna dig som hemma dina kommande år på LTH. Käka en macka från Hilbert Café, stämpla en kopp nybryggt guld från ditt kaffekort och njut, du är precis där du ska vara! <3", + "en": "So you’ve found your way home—I’m so glad! This is the building where the F-fös hang out, and you can truly feel at home here during your coming years at LTH. Grab a sandwich from Hilbert Café, stamp your coffee card for a cup of freshly brewed liquid gold, and just enjoy—you’re exactly where you’re meant to be! <3" + }, + "descriptionAssets": [ + "assets/data/nollning_26/map/pin_media/Foset.jpg" + ], + "boxes": [ + { + "left": 1067.0, + "top": 2558.0, + "width": 317.0, + "height": 461.0 + } + ] + }, + { + "title": { + "sv": "ING", + "en": "ING" + }, + "description": { + "sv": "Nu har vi rest långt, hela vägen till HelsINGborg!!! Här hittar vi ING-phøs. Det tar allt från 31 till 52 minuter att beresa sig till dem.", + "en": "We’ve traveled a long way now—all the way to Helsingborg! That’s where we find the ING-phøs. It takes anywhere from 31 to 52 minutes to travel to them." + }, + "descriptionAssets": [ + "assets/data/nollning_26/map/pin_media/INGphos.jpg" + ], + "boxes": [ + { + "left": 0.0, + "top": 3482.0, + "width": 2559.0, + "height": 580.0 + }, + { + "left": 2558.0, + "top": 485.0, + "width": 491.0, + "height": 3577.0 + }, + { + "left": 0.0, + "top": 0.0, + "width": 938.0, + "height": 2160.0 + }, + { + "left": 938.0, + "top": 0.0, + "width": 2112.0, + "height": 485.0 + }, + { + "left": 0.0, + "top": 2160.0, + "width": 388.0, + "height": 1322.0 + }, + { + "left": 938.0, + "top": 485.0, + "width": 610.0, + "height": 355.0 + }, + { + "left": 938.0, + "top": 840.0, + "width": 301.0, + "height": 594.0 + }, + { + "left": 388.0, + "top": 3081.0, + "width": 282.0, + "height": 401.0 + }, + { + "left": 670.0, + "top": 3287.0, + "width": 400.0, + "height": 195.0 + }, + { + "left": 2318.0, + "top": 2461.0, + "width": 243.0, + "height": 1021.0 + } + ] + } +] \ No newline at end of file diff --git a/assets/data/nollning_26/map/pin_media/Aphos.jpg b/assets/data/nollning_26/map/pin_media/Aphos.jpg new file mode 100644 index 00000000..b50472f6 Binary files /dev/null and b/assets/data/nollning_26/map/pin_media/Aphos.jpg differ diff --git a/assets/data/nollning_26/map/pin_media/Foset.jpg b/assets/data/nollning_26/map/pin_media/Foset.jpg new file mode 100644 index 00000000..6f1de7f2 Binary files /dev/null and b/assets/data/nollning_26/map/pin_media/Foset.jpg differ diff --git a/assets/data/nollning_26/map/pin_media/INGphos.jpg b/assets/data/nollning_26/map/pin_media/INGphos.jpg new file mode 100644 index 00000000..b578a046 Binary files /dev/null and b/assets/data/nollning_26/map/pin_media/INGphos.jpg differ diff --git a/assets/data/nollning_26/map/pin_media/Mphos.jpg b/assets/data/nollning_26/map/pin_media/Mphos.jpg new file mode 100644 index 00000000..e599f4e2 Binary files /dev/null and b/assets/data/nollning_26/map/pin_media/Mphos.jpg differ diff --git a/assets/data/nollning_26/nolleguide/background.png b/assets/data/nollning_26/nolleguide/background.png new file mode 100644 index 00000000..ce831297 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/background.png differ diff --git a/assets/data/nollning_26/nolleguide/data_etiquette.json b/assets/data/nollning_26/nolleguide/data_etiquette.json new file mode 100644 index 00000000..fb4c7f1b --- /dev/null +++ b/assets/data/nollning_26/nolleguide/data_etiquette.json @@ -0,0 +1,114 @@ +[ + { + "title": { + "sv": "Allt du behöver veta om den akademiska kvarten", + "en": "How to read time" + }, + "content": { + "sv": [ + { + "heading": "Vad är Akademisk Kvart?", + "paragraph": "Detta fenomen som till en början kan tyckas ställa till det för dig, men som du snart kommer lära dig att älska, kallas akademisk kvart. Denna uråldriga företeelse härstammar från tiden då klockor var ovanliga hos studenterna. Man förlitade sig på domkyrkans ringningar, och studenterna började gå till föreläsningar då klockorna slog vid hel timme. Efter femton minuter var alla på plats och föreläsningen kunde börja." + }, + { + "heading": "Enkel- och dubbelkvart", + "paragraph": "Akademisk kvart finns i två utföranden: enkelkvart och dubbelkvart. Enkelkvart tillämpas alla vardagar från kl 07 till och med kl 17. Dubbelkvart tillämpas alla vardagar från kl 18 till kl 06, samt dygnet runt på helger. Enkelkvart innebär att tidsangivelsen 13 en vardag betyder att tillställningen börjar 13.15. Dubbelkvart innebär att tidsangivelsen 19 betyder att tillställningen börjar 19.30." + }, + { + "heading": "Pricksystemet", + "paragraph": "Vid vissa tillfällen kan man önska att tillställningen börjar vid hel timma. Detta kallas i folkmun “prick”. Pricken fungerar sådant att den subtraherar femton minuter från den angivna tiden. Dock kan man inte använda dubbelprick för att upphäva enkelkvart." + }, + { + "heading": "Exempel", + "paragraph": "Notera följande exempel:\n- En vardag kl 8 innebär 8:15.\n- En vardag kl 15(.) innebär 15:00.\n- En helgdag kl 15 innebär 15.30.\n- En helgdag kl 15(.) innebär 15:15.\n- En helgdag kl 15(..) innebär 15:00." + }, + { + "heading": "Undantag", + "paragraph": "Vill man, den akademiska andan till trots, inte använda prickar för att upphäva eventuella kvartar kan man även välja att ange minuter. Tentor, duggor och laborationer börjar nästan alltid på utsatt tid." + } + ], + "en": [ + { + "heading": "What is the Academic 15?", + "paragraph": "This system may seem confusing at first but soon you will learn to love it. It is called the academic 15. This ancient tradition comes from times when watches were rare. Students trusted church bells and started walking to lectures when the bells chimed the hour. After 15 minutes, everyone had arrived and the lecture could begin." + }, + { + "heading": "Simple and Double 15", + "paragraph": "The academic 15 comes in two versions: simple 15 and double 15. Simple 15 is applied on weekdays from 7 AM to 5 PM. Double 15 is applied on weekdays from 6 PM to 6 AM and during all hours on weekends. Simple 15 means the event starts 15 minutes past the stated time. Double 15 means it starts 30 minutes after the stated time." + }, + { + "heading": "The Prick System", + "paragraph": "Sometimes, you may want an event to start on the exact hour. This is called the 'prick' system. The prick subtracts 15 minutes from the given time. However, you cannot override simple 15 with two pricks." + }, + { + "heading": "Examples", + "paragraph": "Take note of the following examples:\n- Weekdays, 8 means 8:15.\n- Weekdays, 15(.) means 15:00.\n- Weekends, 15 means 15:30.\n- Weekends, 15(.) means 15:15.\n- Weekends, 15(..) means 15:00." + }, + { + "heading": "Exceptions", + "paragraph": "If you don't want to use pricks, you can specify minutes exactly, like 13:00 or 19:00. Exams and tests almost always start on the given time without the academic 15." + } + ] + } + }, + { + "title": { + "sv": "Sittningsformalia", + "en": "Sittning" + }, + "content": { + "sv": [ + { + "heading": "", + "paragraph": "När får man brista ut i sång? Vad ska du göra när din bordsgranne hytter vinglaset mot dig med mord i blicken? På vilka sittningar är det acceptabelt att plundra någons tallrik? Här följer lite formalia som råder vid sittningar!" + }, + { + "heading": "Olika sittningar och sittningsrelaterade saker", + "paragraph": "Ordet sittning kan betyda flera olika saker men man brukar för enkelhetens skull dela in de olika sittningarna i två områden, fin- och fulsittningar. Finsittningar innebär oftast klädkod kavaj men vid vissa tillfällen även högtidsdräkt. Ett ord för finsittning som ofta används är gasque. Fulsittningar brukar ofta innebära klädkod overall eller enligt sittningens tema och kallas ofta för slasque. Sångboken är ett måste på sittningar, oavsett sort. F-sektionen har en egen sångbok, och andra sektioner kan ha egna eller använda Teknologkårens sångbok. Det är vanligt att fästa en penna vid sångboken. På fulsittningar är det inte ovanligt att gäster ropar ut 'tempo' för mer sång, men detta sker aldrig på finsittningar." + }, + { + "heading": "Att föra sig på sittning", + "paragraph": "Vid sittningar där overall råder som klädkod gäller andra regler än vid finsittningar. På slasquesittningar bestäms gränserna av sexmästeriets toleransnivå. På finsittningar förväntas god hyfs och fason. Viktigt att komma ihåg är att 'tempo' inte är tillåtet på finsittningar. Bordsetikett gäller också: bordsdamen sitter till höger om bordsherren." + }, + { + "heading": "Skål", + "paragraph": "Skåla bör man göra ofta! Under sittningar kan man skåla med en person, hela bordet (på fulsittningar) eller delta i en gemensam skål som sångförmannen utlyser. Den gemensamma skålen följer ett särskilt mönster. Damer börjar med att skåla till vänster, sedan höger, rakt fram och sedan dricka, följt av samma ordning baklänges. Herrar börjar skåla åt höger." + }, + { + "heading": "Gyckel", + "paragraph": "Gyckel är ett kortare (eller ibland längre) uppträdande i två akter. Det är vanligt förekommande och anmäls till sångförmannen. Respekt visas genom att enbart dricka vatten och vara tyst under gycklet. Vissa sektioner kallar det för spex, men det är inte samma sak." + }, + { + "heading": "Sittningens förfarande", + "paragraph": "En sittning börjar med fördrink och Måltidssången. Därefter följer förrätt, huvudrätt och efterrätt. Sittningen avslutas med sången 'O Gamla Klang och Jubeltid' där man bankar i bordet. Den sista versen sjungs stående och efteråt är det inte tillåtet att sätta sig igen. Efter sittningen följer oftast mellanfest, eftersläpp och ibland efterfest i annan lokal." + } + ], + "en": [ + { + "heading": "", + "paragraph": "When can you burst into a song? What do you do when your neighbour at the table raises his glass with an expectant look? At what sittning is it acceptable to plunder someone else's plate? Here’s what you need to know!" + }, + { + "heading": "Types of sittnings", + "paragraph": "The word sittning can refer to many things but is usually divided into two types: tidy and wild sittnings. Tidy sittnings often require dress code Kavaj or Högtidsdräkt and are sometimes called gasques. Wild sittnings usually require overalls or themed outfits and are called slasque. A songbook is always essential. F-guild has its own, others use Teknologkåren’s songbook. A pen attached to the book is recommended. At wild sittnings, guests may shout 'Tempo!' to request more songs, but this never happens at tidy sittnings." + }, + { + "heading": "Behaviour at sittnings", + "paragraph": "Different sittnings have different behavioural expectations. At slasque sittnings, rules are more relaxed, set by the Head of Festivities. At gasques, proper manners are expected. Remember that 'Tempo' is not allowed at gasques. Table seating etiquette also applies: the lady sits to the right of the gentleman." + }, + { + "heading": "Cheers", + "paragraph": "Cheering is encouraged! You may cheer with an individual, your whole table (at slasque sittnings) or join in a collective cheer led by the Master of Ceremonies. The formal cheer follows a specific pattern: ladies start to the left, then right, then across, then drink, and repeat in reverse. Gentlemen start to the right." + }, + { + "heading": "Gyckel", + "paragraph": "A gyckel is a short (or sometimes too long) performance in two acts. Anyone can perform, but you must register with the Master of Ceremonies. Respect must be shown during gyckel by only drinking water and remaining silent. Some call it 'spex', but it’s not the same thing." + }, + { + "heading": "Sittning procedure", + "paragraph": "A sittning begins with a pre-drink and the song 'Måltidssången'. Guests then enjoy appetizers, main course and dessert. The sittning ends with the song 'O Gamla Klang och Jubeltid', where you bang the table at key moments. The last verse is sung standing, and no sitting is allowed afterwards. The evening usually continues with an in-between party, an after-party and sometimes an after-after-party at another venue." + } + ] + } + } +] \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/data_stod.json b/assets/data/nollning_26/nolleguide/data_stod.json new file mode 100644 index 00000000..e9f94398 --- /dev/null +++ b/assets/data/nollning_26/nolleguide/data_stod.json @@ -0,0 +1,329 @@ +[ + { + "type": "title", + "title":{ + "sv": "Stödfunktioner", + "en": "Support functions" + }, + "text":{ + "sv": "Hejsan nollan!\nSom ny student på LTH är det lätt att känna sig förvirrad eller bara frågvis. Som tur är finns det gott om folk som har stenkoll på precis det du behöver veta, eller som är där för dig om du behöver prata. På F-sektionen är vi dedikerade till att främja en inkluderande och stödjande miljö för alla studenter.\n\nVi prioriterar våra medlemmars psykosociala välbefinnande och har en nolltoleranspolicy mot alla former av diskriminering eller trakasserier. Om du någonsin känner dig hotad, illa till mods eller illa behandlad, kom ihåg att du har tillgång till olika resurser både inom och utanför vår organisation.", + "en": "Hello, new student!\nAs a new student at LTH, it is easy to feel confused or simply inquisitive. Fortunately, there are plenty of people who are well-informed about exactly what you need to know, or who are there for you if you need to talk. At the F-guild, we are dedicated to promoting an inclusive and supportive environment for all students.\n\nWe prioritize the psychosocial well-being of our members and have a zero-tolerance policy towards all forms of discrimination or harassment. If you ever feel threatened, uncomfortable, or mistreated, remember that you have access to various resources both within and outside our organization." + } + }, + { + "type": "subheading", + "title":{ + "sv": "Nollningskontraktet", + "en": "Introduction contract" + }, + "text":{ + "sv": "Inför nollningen ingår alla volontärer i ett kontrakt gentemot sin överordnade som anger principer som är viktiga för nollningen och regler som ska följas. Sammanfattat anger den följande.\n\nNollningen ska präglas av glädje, gemenskap och öppenhet, och allt deltagande är helt frivilligt. Teknologkåren har nolltolerans mot narkotika, diskriminering, trakasserier och kränkande särbehandling. Det råder ingen alkoholpress – alkoholfritt är alltid ett naturligt alternativ, och ett ”nej” eller ”kanske” ska alltid respekteras. Volontärer får inte utnyttja sin maktposition, särbehandla eller ha intimt umgänge med nya studenter, och det är alltid du själv som avgör var din gräns går och om en händelse känts kränkande. Om du känner dig illa behandlad eller har frågor kan du kontakta Föset, Jämlikhetsombudet, Nollegeneralen eller Kårordförande. Att bryta mot reglerna angivna i kontraktet kommer innebära konsekvenser för volontären som anpassas efter fall.", + "en": "Prior to the introduction period, all volunteers enter into a contract with their supervisors outlining essential principles and mandatory rules. In summary, it states the following:\n\nThe introduction period should be characterized by joy, community, and openness, and all participation is completely voluntary. Teknologkåren has a zero-tolerance policy regarding drugs, discrimination, harassment, and degrading treatment. There is no peer pressure to drink alcohol—non-alcoholic options are always a natural alternative, and a “no” or “maybe” must always be respected. Volunteers must not abuse their position of power, engage in preferential treatment, or have intimate relations with new students. You alone decide where your boundaries are and whether an incident felt offensive. If you feel mistreated or have any questions, you can contact Föset, the Equality Officer, the Introduction General, or the Union President. Breaches of the contract rules will result in consequences for the volunteer, handled on a case-by-case basis." + } + }, + { + "type": "subheading", + "title":{ + "sv": "Hjälp och viktiga kontakter", + "en": "Help and important contacts" + }, + "text":{ + "sv": "Via telefon-ikonen i appen hittar du en lista på viktiga nödnummer för akuta situationer; bland annat till sjukvård, polis, brandkår, universitetet, psykiatrisk akutmottagning, självmordslinjen, och nummer till Föset. Vid livsfara, våld eller hot om våld, ring alltid 112!", + "en": "Via the phone icon in the app, you will find a list of important emergency numbers for urgent situations, including healthcare, police, fire department, university, psychiatric emergency room, suicide hotline, and Föset. In case of life-threatening situations, violence, or threats of violence, always call 112!" + } + }, + { + "type": "stud", + "title":{ + "sv": "Studie och karriärvägledning", + "en": "Study and career guidance" + }, + "texts":{ + "sv": [ + "Här kommer en hälsning från studie- och karriärvägledarna:\n\nVi är din professionella samtalspartner och har ett samlat ansvar för all studie-och karriärvägledning på Teknisk fysik (F), Teknisk matematik (Pi) och Teknisk nanovetenskap (N).\n\nVi har tystnadsplikt och är ditt bollplank och ditt stöd som du kan prata med när du har frågor och funderingar kring dina studier.\n\nDu hittar oss på våning 5 i E-huset.\n\nDrop in läsvecka 1–6:\nF och Pi: Hilbert café, torsdagar 9–11.\nN: KC, ingång C måndagar 11–12\n\nTa tillfället i akt att komma förbi, säga hej eller ställa frågor!\n\nTeknisk Fysik\nPetra Parmvi\npetra.parmvi@lth.lu.se", + "Teknisk Nanovetenskap\nFreja Heu\nFreja.heu@lth.lu.se", + "Teknisk Matematik\nKarin Cherfils-Karlsson\nKarin.cherfils-karlsson@lth.lu.se" + ], + "en":[ + "Here’s a message from the academic and career advisors:\n\nWe are your professional advisors and are collectively responsible for all study and career counseling in Engineering Physics (F), Engineering Mathematics (Pi), and Engineering Nanoscience (N).\n\nWe are bound by confidentiality and serve as your sounding board and support—we’re here to talk to whenever you have questions or concerns about your studies.\n\nYou can find us on the 5th floor of the E Building.\n\nDrop-in hours, weeks 1–6:\nF and Pi: Hilbert Café, Thursdays 9–11 a.m.\nN: KC, Entrance C, Mondays 11 a.m.–12 p.m.\n\nTake the opportunity to stop by, say hello, or ask questions!\n\nEngineering Physics\nPetra Parmvi\npetra.parmvi@lth.lu.se", + "Engineering Nanoscience\nFreja Heu\nFreja.heu@lth.lu.se", + "Engineering Mathematics\nKarin Cherfils-Karlsson\nKarin.cherfils-karlsson@lth.lu.se" + ] + } + }, + { + "type": "subheading", + "title":{ + "sv": "Internationell koordinator (för internationella studenter)", + "en": "International Coordinator (for international students)" + }, + "text":{ + "sv": "Kontakter för internationella studenter kan hittas på Studentwebben LTH: https://www.student.lth.se/english/contact/international-coordinators/", + "en": "Contact details for international students can be found on the LTH Student Web: https://www.student.lth.se/english/contact/international-coordinators/" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Kurator", + "en": "Counselor" + }, + "text":{ + "sv": "Om man har personliga bekymmer, har hamnat i någon form av kris eller bara vill prata med någon kan man vända sig till studiekuratorn för F, n och π. Du bokar ett möte via mail, och du hittar hennes kontor mitt i E-huset högst upp på våning 5. Hon är utbildad socionom, och har naturligtvis tystnadsplikt.\n\nStudiekurator F, N, och π\nIsa Andersson\nisa.andersson@lth.lu.se", + "en": "If you have personal concerns, are experiencing some kind of crisis, or just want to talk to someone, you can contact the study counselor for F, n, and π. You can book an appointment by email, and her office is located in the middle of the E building on the top floor (5). She is a trained social worker and is, of course, bound by professional confidentiality.\n\nStudiekurator F, N, och π\nIsa Andersson\nisa.andersson@lth.lu.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Studenthälsan", + "en": "Student Health" + }, + "text":{ + "sv": "Här arbetar bland annat kuratorer, sjuksköterskor, psykologer och psykiatriker. Hit kan alla studenter vid Lunds Universitet vända sig. Alla besök ska tidsbokas och besöken är gratis. Studenthälsan fungerar som ett komplement till vårdcentralen, och personalen har naturligtvis tystnadsplikt.\n\nTel: 046 222 43 77\nSandgatan 3\nwww.lu.se/student/studenthaelsan", + "en": "Here you will find counselors, nurses, psychologists, and psychiatrists, among others. All students at Lund University can turn to them for help. All visits must be booked in advance and are free of charge. Student Health serves as a complement to the health center, and the staff is, of course, bound by confidentiality.\n\nTel: 046 222 43 77\nSandgatan 3\nwww.lu.se/student/studenthaelsan" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Hjälp finns att få!", + "en": "Help is available!" + }, + "text":{ + "sv": "Om du någon gång upplever att du känner dig orättvist behandlad i dina studier eller på andra arrangemang som du besöker under din studietid så har Teknologkåren ett anonymt formulär för att ge feedback och kritik genom. Formuläret nås på www.tlth.se/klaga", + "en": "If you ever feel that you have been treated unfairly in your studies or at other events you attend during your studies, the TLTH has an anonymous form for providing feedback and criticism. The form can be accessed at www.tlth.se/klaga" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Likabehandlingsutskottet", + "en": "Committee for Student Equality" + }, + "text":{ + "sv": "Känner du dig otrygg i sektionens sociala miljö? Har du märkt av exkluderande normer, taskig jargong, eller upprepade situationer som gör att du eller andra inte känner er välkomna? Då kan du vända dig till sektionens likabehandlingsutskott, LiBU.\n\nLiBU arbetar med långsiktiga frågor för att göra sektionen trygg, inkluderande och trivsam för alla medlemmar.\n\nDet är likabehandlingsordförande Viggo och samvetsmästare Linnea som leder LiBU. Kontakta någon av dem om du vill prata eller lyfta något som behöver förändras!\n\nLikabehandlingsordförande Viggo Broman\nTel: 073 268 93 94 \nlibo@fsektionen.se\n\nSamvetsmästare Linnea Lundevall\nTel: 072 548 03 22\nsamvetsmastare@fsektionen.se\n\nLikabehandlingsutskottet\nlikabehandlingsutskottet@fsektionen.se", + "en": "Do you feel unsafe in the guild's social environment? Have you noticed exclusionary norms, offensive jargon, or repeated situations that make you or others feel unwelcome? If so, you can contact the guild's committee for Student Equality, LiBU.\n\nLiBU works with long-term issues to make the guild safe, inclusive, and pleasant for all members.\n\nLiBU is led by the President of the Committee for Student Equality Viggo and Master of Conscience Linnea. Contact either of them if you want to talk or raise something that needs to be changed!\n\nPresident of the Committee for Student Equality Viggo Broman\nTel: 073 268 93 94\nlibo@fsektionen.se\n\nMaster of Conscience Linnea Lundevall\nTel: 072 548 03 22\nsamvetsmastare@fsektionen.se\n\nCommittee for Student Equality\nlikabehandlingsutskottet@fsektionen.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Sektionens anonyma kontaktformulär", + "en": "The guild's anonymous contact form" + }, + "text":{ + "sv": "Via sektionens anonyma kontaktformulär kan du nå samvetsmästare och likabehandlingsordförande på ett anonymt sätt\n\nhttps://docs.google.com/forms/d/e/1FAIpQLSdZdPl14DkdlZCKS3jzO59-FvVi2ug9nYer1jhYgERanbwHoQ/viewform", + "en": "You can contact the conscience master and equal treatment chair anonymously via the guild's anonymous contact form.\n\nhttps://docs.google.com/forms/d/e/1FAIpQLSdZdPl14DkdlZCKS3jzO59-FvVi2ug9nYer1jhYgERanbwHoQ/viewform" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Samvetsmästare", + "en": "Master of Conscience" + }, + "text":{ + "sv": "Om du har varit med om något obehagligt eller allvarligt, till exempel under ett event, i samband med sektionsverksamhet, eller i kontakt med andra medlemmar så kan du prata med vår samvetsmästare Linnea. Hon är likabehandlingsombud och lyssnar och agerar alltid konfidentiellt. Det innebär att det du berättar inte förs vidare utan ditt godkännande.\n\nSamvetsmästare Linnea Lundevall\nTel: 072 548 03 22\nsamvetsmastare@fsektionen.se", + "en": "If you have experienced something unpleasant or serious, for example during an event, in connection with guild activities, or in contact with other members, you can talk to our Master of Conscience Linnea. She is an equal opportunities commissioner and always listens and acts confidentially. This means that what you say will not be passed on without your approval.\n\nMaster of Conscience Linnea Lundevall\nTel: 072 548 03 22\nsamvetsmastare@fsektionen.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Studierådet", + "en": "The Students’ Educational Council" + }, + "text":{ + "sv": "Har du synpunkter på din utbildning, finns det problem med kursupplägg, en lärare som inte lyssnar, eller en deadline som känns orimlig? Då är Studierådet rätt instans.\n\nStudierådet samlar studenternas röster och driver frågor som rör utbildningskvalitet, schema, kursutvärderingar med mera.\n\nstudieradet@fsektionen.se", + "en": "Do you have any comments about your education, problems with course structure, a teacher who does not listen, or a deadline that seems unreasonable? Then the Students’ Educational Council is the right place for you.\n\nThe Students’ Educational Council gathers students' opinions and addresses issues related to educational quality, schedules, course evaluations, and more.\n\nstudieradet@fsektionen.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Utbildningsminister", + "en": "Minister for Education" + }, + "text":{ + "sv": "Om du råkat ut för något allvarligt kopplat till din studiemiljö, till exempel blivit illa behandlad av en lärare eller annan student, så kan du kontakta sektionens utbildningsminister Mattis Mattsson. Mattis är en av sektionens studerandeskyddsombud, vilket innebär att han har lagstadgad tystnadsplikt gällande studierelaterade ärenden. Även samvetsmästare Linnea och ordförande Algot är studernadeskyddsombud.\n\nUtbildningsminister Mattis Mattsson\num@fsektionen.se\nTel: 073 517 16 31", + "en": "If you have experienced something serious related to your study environment, such as being mistreated by a teacher or another student, you can contact the guilds's Minister for Education, Mattis Mattsson. Mattis is one of the guild's student welfare officers, which means that he has a legal duty of confidentiality regarding study-related matters. Master of Conscience Linnea and President of the guild Algot are also student welfare officers.\n\nMinister of Education Mattis Mattsson\num@fsektionen.se\nTel: 073 517 16 31" + } + }, + { + "type": "title", + "title": { + "sv": "Ett urval stödfunktioner för Lundastudenter", + "en": "A selection of support functions for Lund students" + }, + "text": { + "sv": "", + "en": "" + } + }, + { + "type": "subheading", + "title":{ + "sv": "UMO", + "en": "UMO" + }, + "text":{ + "sv": "UMO finns där för dig som är upp till 23 år. De jobbar med frågor som bland annat sex och relationer samt ångesthantering och samtalsstöd. Bokning via telefon eller via deras onlinemottagning.\n\nTel: 077 025 25 00", + "en": "UMO is available for individuals up to 23 years of age. They address issues such as sex and relationships, anxiety management, and counseling support. Appointments can be made by phone or via their online reception.\n\nTel: 077 025 25 00" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Vårdcentral", + "en": "Health center" + }, + "text":{ + "sv": "Din vårdcentral kan också erbjuda samtalsstöd, hjälp vid ångest och oro eller depression. Ring din vårdcentral och förklara din situation så guidar de dig vidare. Vet du inte vilken din vårdcentral är? Du kan alltid ringa till någon som är nära dig och lista dig där, då blir det din vårdcentral.", + "en": "Your health center can also offer counseling, help with anxiety and worry, or depression. Call your health center and explain your situation, and they will guide you further. Not sure which health center you belong to? You can always call one near you and register there, and it will become your health center." + } + }, + { + "type": "subheading", + "title":{ + "sv": "Unga vuxna Lund", + "en": "Young adults Lund" + }, + "text":{ + "sv": "Erbjuder stöd och hjälp till dig mellan 16 och 29 år. Det kan handla om personliga problem, relationer eller frågor kring fysisk och psykisk hälsa. Nås på telefon eller kan kontaktas via 1177.\n\nTel: 046 359 80 93", + "en": "Offers support and help to people between the ages of 16 and 29. This can be for personal problems, relationships, or questions about physical and mental health. Can be reached by phone or contacted via 1177.\n\nTel: 046 359 80 93" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Studentprästerna", + "en": "Student priests" + }, + "text":{ + "sv": "Studentprästerna erbjuder samtal om stort och smått, oavsett tro eller livsåskådning. De har även tystnadsplikt.\n\nTel: 046 718735\nstudentpresterna.lund@svenskakyrkan.se", + "en": "The student priests offer conversations about big and small issues, regardless of faith or worldview. They are also bound by confidentiality.\n\nTel: 046 718735\nstudentpresterna.lund@svenskakyrkan.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Tjej- och transjouren i Lund", + "en": "The Women's and Transgender Hotline in Lund" + }, + "text":{ + "sv": "Stöttar dig via chatt, telefon eller mail. Du kan vända dig hit om du har varit utsatt för våld eller har frågor kring sex, relationer, psykisk ohälsa, kropp och mycket mer.\n\nwww.tjejochtransjourenilund.se", + "en": "Provides support via chat, telephone, or email. You can contact them if you have been subjected to violence or have questions about sex, relationships, mental health, body image, and much more.\n\nwww.tjejochtransjourenilund.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Kvinnojouren i Lund", + "en": "Women's Shelter in Lund" + }, + "text":{ + "sv": "Kvinnojouren Lund erbjuder stöd till män, kvinnor och transpersoner som är eller har blivit utsatta för våld i en nära relation. Alla samtal är anonyma.\n\nTel: 020 21 29 60\nstod@kvinnojourenlund.se\nwww.kvinnojourenlund.se", + "en": "The Women's Shelter in Lund offers support to men, women, and transgender people who are or have been subjected to violence in a close relationship. All calls are anonymous.\n\nTel: 020 21 29 60\nstod@kvinnojourenlund.se\nwww.kvinnojourenlund.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Mansjouren", + "en": "Men's Shelter" + }, + "text":{ + "sv": "Erbjuder samtalsstöd via telefon, genom enskilda möten eller i grupp, till män som behöver prata med någon.\n\nTel: 08 30 30 20\nwww.mansjouren.se", + "en": "Offers counseling support by phone, through individual meetings, or in groups, to men who need to talk to someone.\n\nTel: 08 30 30 20\nwww.mansjouren.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Akutmottagning vuxenpsykiatri", + "en": "Adult Psychiatry Emergency Room" + }, + "text":{ + "sv": "Kontakta vid akuta psykiatriska besvär.\n\nTel: 046 17 41 00", + "en": "For acute psychiatric problems.\n\nTel: 046 17 41 00" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Mind självmordslinjen", + "en": "Mind Suicide Hotline" + }, + "text":{ + "sv": "Självmordslinjen är till för dig som har tankar på att ta ditt liv eller har en närstående med sådana tankar. De har öppet dygnet runt, varje dag. Vid akut självmordsrisk bör du ringa 112.\n\nTel: 901 01", + "en": "The Suicide Hotline is for those who are thinking about taking their own life or have a loved one with such thoughts. They are open 24 hours a day, every day. In case of acute suicide risk, you should call 112.\n\nTel: 901 01" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Jourhavande medmänniska", + "en": "On-call fellow human being" + }, + "text":{ + "sv": "Anonyma samtal om stort och smått. Telefontid kvälls- och nattetid på följande nummer.\n\nTel: 08 702 16 80", + "en": "Anonymous conversations about big and small issues. Telephone hours in the evening and at night on the following number.\n\nTel: 08 702 16 80" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Jourhavande präst", + "en": "On-call priest" + }, + "text":{ + "sv": "Samtals- och krisstöd. Du når dem på telefon via 112 samt kvällsöppen chatt. De har tystnadsplikt.", + "en": "Conversation and crisis support. You can reach them by telephone via 112 and via evening chat. They are bound by confidentiality." + } + }, + { + "type": "subheading", + "title":{ + "sv": "Mottagning Maria", + "en": "Maria Reception" + }, + "text":{ + "sv": "För dig under 24 år som har problem med alkohol och andra droger.\n\nTel: 046 17 40 99\nwww.vard.skane.se", + "en": "For those under 24 who have problems with alcohol and other drugs.\n\nTel: 046 17 40 99\nwww.vard.skane.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Triangeln beroendemottagning", + "en": "Triangeln Addiction Reception" + }, + "text":{ + "sv": "Specialiserade på behov av kortare stödinsatser för alkoholproblem och för dig som inte tidigare sökt specialistvård.\n\nTel: 040 33 15 86\nwww.vard.skane.se", + "en": "Specializes in shorter support interventions for alcohol problems and for those who have not previously sought specialist care.\n\nTel: 040 33 15 86\nwww.vard.skane.se" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Polisen", + "en": "The police" + }, + "text":{ + "sv": "Arbetar förebyggande genom projektet Trygg krog i syfte att förekomma brottslighet som exempelvis sexuella trakasserier i krogmiljö. Ger information och hjälp om hur det går till när man anmäler att någon utsatt en för sexuella trakasserier. Kontaktas på 114 14 vid akut hjälp.", + "en": "Work preventively through the Trygg krog (Safe Pub) project with the aim of preventing crimes such as sexual harassment in pubs. Provide information and assistance on how to report someone who has subjected you to sexual harassment. Contact 114 14 for emergency assistance.\n" + } + }, + { + "type": "subheading", + "title":{ + "sv": "Vi finns här för dig!", + "en": "We are here for you!" + }, + "text":{ + "sv": "Förutom de personer vi har presenterat för dig ovan kan du naturligtvis vända dig till oss i Föset eller dina faddrar.\n\nOm du eller någon annan har blivit illa behandlad eller känt sig obekväm under en nollningsaktivitet, säg då till. Berätta för en fadder eller någon i Föset. Vi tar din upplevelse på största allvar och ska se till att du kan känna dig trygg i alla nollningssituationer. Nollningen ska vara en säker och trygg plats för alla.\n\nVåra nummer hittar du om du klickar på telefon-ikonen som finns i appen. Du kan även nå oss via mail.\n\nTa hand om dig! <3\n\noverfos@fsektionen.se\nfoset@fsektionen.se", + "en": "In addition to the people we have introduced to you above, you can of course turn to us in Föset or your mentors.\n\nIf you or someone else has been mistreated or felt uncomfortable during an initiation activity, please let us know. Tell a mentor or someone in Föset. We take your experience very seriously and will make sure that you can feel safe in all initiation situations. The introduction should be a safe and secure place for everyone.\n\nYou can find our numbers by clicking on the phone icon in the app. You can also reach us by email.\n\nTake care! <3\noverfos@fsektionen.se\nfoset@fsektionen.se" + } + } +] \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/data_wordlist.json b/assets/data/nollning_26/nolleguide/data_wordlist.json new file mode 100644 index 00000000..a4ff8c7b --- /dev/null +++ b/assets/data/nollning_26/nolleguide/data_wordlist.json @@ -0,0 +1,592 @@ +[ + { + "key": { + "sv": "0,999...", + "en": "0,999..." + }, + "value": { + "sv": "=1.", + "en": "=1." + } + }, + { + "key": { + "sv": "6122 Å", + "en": "6122 Å" + }, + "value": { + "sv": "Våglängd för den perfekta orangea färgen.", + "en": "Wavelength for the perfect orange color." + } + }, + { + "key": { + "sv": "Adjök", + "en": "Adjök" + }, + "value": { + "sv": "Avskedsdryck.", + "en": "A goodbye drink." + } + }, + { + "key": { + "sv": "AF Bostäder", + "en": "AF Bostäder" + }, + "value": { + "sv": "Lunds största bostadsförmedlare för studenter, skriv in dig här direkt för att inte hamna efter i kön!", + "en": "Lund's largest student housing, register immediately to avoid falling behind in the housing queue!" + } + }, + { + "key": { + "sv": "Analfabetstrålning", + "en": "Analfabetstrålning" + }, + "value": { + "sv": "Dålig belysning för fysikstudier.", + "en": "Poor lighting for physics studies." + } + }, + { + "key": { + "sv": "Ansvarsfull", + "en": "Responsible" + }, + "value": { + "sv": "Kontrollerat berusad.", + "en": "Controlled intoxication." + } + }, + { + "key": { + "sv": "Barsebäck", + "en": "Barsebäck" + }, + "value": { + "sv": "Vackra byggnader strax norr om Lund vars hjärta ej längre slår.", + "en": "Beautiful buildings just north of Lund whose heart no longer beats." + } + }, + { + "key": { + "sv": "Bättre", + "en": "Better" + }, + "value": { + "sv": "Se Förr.", + "en": "See The past." + } + }, + { + "key": { + "sv": "Delfi", + "en": "Delfi" + }, + "value": { + "sv": "Den korrekta stavningen av studentghettot i norra Lund som av AFB benäms Delphi. Se även AF Bostäder.", + "en": "The correct spelling of the student ghetto in northern Lund, referred to by AFB as Delphi. See also AF Bostäder." + } + }, + { + "key": { + "sv": "Enhörning", + "en": "Enhörning" + }, + "value": { + "sv": "Ovanlig geometrisk figur.", + "en": "Unusual geometric figure. Also unicorn in swedish." + } + }, + { + "key": { + "sv": "Eslöv", + "en": "Eslöv" + }, + "value": { + "sv": "Världens ände, hem åt Oljeborrarsektionen, även kallad O-sektionen.", + "en": "The end of the world, home to the oil drilling guild, also called the O-guild." + } + }, + { + "key": { + "sv": "ET-Slasque", + "en": "ET-Slasque" + }, + "value": { + "sv": "Efter-Tenta-Slasque, festlighet efter tentaperiod.", + "en": "Efter-Tenta-Slasque (After-exam-slasque), celebration after an exam period." + } + }, + { + "key": { + "sv": "F", + "en": "F" + }, + "value": { + "sv": "Den korrekta stavningen av pH/Ph/ph.", + "en": "The right way of spelling pH/Ph/ph." + } + }, + { + "key": { + "sv": "F", + "en": "F" + }, + "value": { + "sv": "Symbolen för den äldsta sektionen på LTH. F-sektionen omfattar Teknisk Fysik, Teknisk Matematik och Teknisk Nanovetenskap. Grundades 1961.", + "en": "The symbol for the oldest section at LTH. The F-section includes Engineering Physics, Engineering Mathematics and Engineering Nanoscience. Founded in 1961." + } + }, + { + "key": { + "sv": "Fantom", + "en": "Phantom" + }, + "value": { + "sv": "Mystisk och maskerad elementarpartikel.", + "en": "Mysterious and masked elementary particle." + } + }, + { + "key": { + "sv": "FETSM", + "en": "FETSM" + }, + "value": { + "sv": "Före-Efter-Tenta-Slasque-Mat, mat som förtärs före en ET-Slasque.", + "en": "Före-Efter-Tenta-Slasque-Mat (Before-After-Exam-Slasque-Food), food consumed before an ET-Slasque." + } + }, + { + "key": { + "sv": "Fjulsittning", + "en": "F(x)-mas/Fjul sitting" + }, + "value": { + "sv": "Traditionsenligt firande av Fjulafton", + "en": "The traditional celebration of F(x)-mas (Fjul)" + } + }, + { + "key": { + "sv": "Flucia", + "en": "Flucia" + }, + "value": { + "sv": "Gemytligt uppträdande med sång och pepparkakor.", + "en": "Pleasant performance with singing and gingerbread." + } + }, + { + "key": { + "sv": "Förr", + "en": "The past" + }, + "value": { + "sv": "Se Bättre.", + "en": "See Better." + } + }, + { + "key": { + "sv": "Fös", + "en": "Fös" + }, + "value": { + "sv": "Grupp som arrangerar Nollningen. Springer runt och fixar under dina första veckor för att se till att du får en fantastisk start på dina studier.", + "en": "Group that organizes The Introduction. Running around and fixing things during your first weeks to make sure you have a great start to your studies." + } + }, + { + "key": { + "sv": "Gasque", + "en": "Gasque" + }, + "value": { + "sv": "Uppklädd sittning, vanligt förekommande under nollningen", + "en": "Sophisticated sitting, much common during the introduction." + } + }, + { + "key": { + "sv": "Gasquesalen", + "en": "Gasquesalen" + }, + "value": { + "sv": "Sal som involverar studentlivets höjd- och lågpunkter, slasque/gasque och tentamen.", + "en": "Hall involving all the highs and lows of student life, slasque/gasque and exams." + } + }, + { + "key": { + "sv": "Gyckel", + "en": "Gyckel" + }, + "value": { + "sv": "Mindre uppträdande i form av sång eller annan underhållande förteelse under sittning eller dylikt spektakel.", + "en": "Performance in the form of singing or other entertainment during a sitting or similar spectacle." + } + }, + { + "key": { + "sv": "Gymnasiet", + "en": "High school" + }, + "value": { + "sv": "Något som de flesta F:are tog sig igenom för att få börja på LTH. I efterhand kan väldigt få nämna något som de faktiskt lärde sig under gymnasiet trots de alldeles för många schemalagda timmarna.", + "en": "Something that most people at the F-guild went through to start at LTH. In retrospect, very few can mention anything they actually learned during high school despite the far too many scheduled hours." + } + }, + { + "key": { + "sv": "Hilbert Älg", + "en": "Hilbert Moose" + }, + "value": { + "sv": "F-sektionens skyddshelgon, numera levande igenom Hörmander Älg, som lever och frodas i de svenska skogarna. Hyllas årligen av F-sektionen, se Älgresa.", + "en": "The patron saint of the F-guild, now living through Hörmander Moose, who lives and thrives in the the Swedish forrests. Celebrated annually by the F-section, see Älgresa." + } + }, + { + "key": { + "sv": "Hilbert Café", + "en": "Hilbert Café" + }, + "value": { + "sv": "F-sektionens café som förser dig med fantastiska mackor, sallader, frukt och kaffe varje dag. Cafét drivs av sektionen, och alla är välkomna att jobba i några timmar för att få äta gratis resten av dagen. Fråga din fadder hur du anmäler dig för att jobba. Har du jobbat tre gånger är du inbjuden till den årliga och mycket mycket trevliga Caféfesten.", + "en": "The F-guild's café provides you with fantastic sandwiches, salads, fruit and coffee every day. The café is run by the section, and everyone is welcome to work for a few hours and eat for free for the rest of the day. Ask your sponsor how to sign up to work. If you have worked three times, you are invited to the annual and very, very nice Caféfest." + } + }, + { + "key": { + "sv": "Hilbertrum", + "en": "Hilbert space" + }, + "value": { + "sv": "En generaliserad form av vektorrum med oändligt många dimensioner. Här kan du hänga, äta chips, leka, festa och mycket mer!", + "en": "A generalized form of vector space with infinite dimensions. Here, you can hang out, eat chips, play, party and much more!" + } + }, + { + "key": { + "sv": "LKG", + "en": "LKG" + }, + "value": { + "sv": "Lära-Känna-Gasque.", + "en": "Get-To-Know-Gasque" + } + }, + { + "key": { + "sv": "Lov", + "en": "Break" + }, + "value": { + "sv": "Den tid under året man inte får CSN.", + "en": "The time during the year when you do not receive CSN." + } + }, + { + "key": { + "sv": "Lund", + "en": "Lund" + }, + "value": { + "sv": "Medelstor sluttning belägen i södra Sverige, också kallat Skåne, med en eminent teknisk högskola.", + "en": "Medium-sized hillside located in southern Sweden, also called Skåne, with an eminent faculty of engineering." + } + }, + { + "key": { + "sv": "Lundagård", + "en": "Lundagård" + }, + "value": { + "sv": "Stor yta utanför AF-borgen där Nollelördagen äger rum. Även den äldsta studenttidningen i Sverige.", + "en": "Large area outside AF-borgen where the Nolle Saturday takes place. Also the oldest student newspaper in Sweden." + } + }, + { + "key": { + "sv": "Mångla", + "en": "Mångla" + }, + "value": { + "sv": "Kyssa flertalet personer samtidigt.", + "en": "Kiss several people at the same time." + } + }, + { + "key": { + "sv": "n", + "en": "n" + }, + "value": { + "sv": "10-9, Teknisk Nanovetenskap, tillhör F-sektionen.", + "en": "10-9, Engineering Nanoscience, belongs to the F-guild." + } + }, + { + "key": { + "sv": "Nolla", + "en": "Nolla" + }, + "value": { + "sv": "Person som önskar inträde vid teknisk utbildning och som ännu ej fullföljt sin nollningsperiod och därmed inte officiellt påbörjat sitt första år på LTH.", + "en": "A person who wishes to enter an education of engineering and who has not yet completed their introduction period and thus has not officially started their first year at LTH." + } + }, + { + "key": { + "sv": "Nollebussresa", + "en": "Nolle bus ride" + }, + "value": { + "sv": "Resa med buss då U-båtar är ganska sällsynta i Lund. Här lär sig nollan att åka buss!", + "en": "Ride by bus as submarines are quite rare in Lund. Here the nolla learns to ride the bus!" + } + }, + { + "key": { + "sv": "Nollegeneral", + "en": "Nolle general" + }, + "value": { + "sv": "Person utvald av Teknologkåren att ansvara för nollningen på LTH.", + "en": "Person chosen by the student union to be responsible for the introduction at LTH." + } + }, + { + "key": { + "sv": "Nollning", + "en": "Introduction" + }, + "value": { + "sv": "Den roligaste månaden i ditt liv!", + "en": "The most fun month of your life!" + } + }, + { + "key": { + "sv": "Norrland", + "en": "Norrland" + }, + "value": { + "sv": "Allt norr om Hallandsåsen (se Norrlandsåsen). Termen omfattar enligt vissa definitioner allt norr om Eslöv, eller enligt mer patriotiska tolkningar, allt norr om Norra Fäladen. Riktigt radikala geografer använder termen för allt norr om Kårhuset.", + "en": "Everything north of Hallandsåsen (see Norrlandsåsen). According to some definitions the term includes everything north of Eslöv, or according to more patriotic interpretations everything north of Norra Fäladen. Really radical geographers use the term for everything north of Kårhuset." + } + }, + { + "key": { + "sv": "Norrlandsåsen", + "en": "Norrlandsåsen" + }, + "value": { + "sv": "Ås där tunnling utövas, belägen mellan Helsingborg och Båstad. Kallas ibland för Hallandsåsen", + "en": "Ridge where tunnelling is practiced, located between Helsingborg and Båstad. Sometimes called Hallandsåsen" + } + }, + { + "key": { + "sv": "One-Night-Stand", + "en": "One-Night-Stand" + }, + "value": { + "sv": "Vanligt förekommande i Lund. Studiemetod som bygger på att man står upp hela natten för att inte somna.", + "en": "Common occurrence in Lund. Study method where you stay up all night to avoid falling asleep." + } + }, + { + "key": { + "sv": "Orange", + "en": "Orenge" + }, + "value": { + "sv": "Den vackraste av alla färger, se 6122 Å.", + "en": "The most beautiful of all colours, see 6122 Å." + } + }, + { + "key": { + "sv": "π", + "en": "π" + }, + "value": { + "sv": "≈ 3,141592653589... Programmet för Teknisk Matematik som tillhör F-sektionen. Hyllas traditionsenligt den 14 mars.", + "en": "≈ 3,141592653589... Engineering Mathematics program belonging to the F-guild. Traditionally celebrated on March 14th." + } + }, + { + "key": { + "sv": "pH/Ph/ph", + "en": "pH/Ph/ph" + }, + "value": { + "sv": "Se F.", + "en": "See F." + } + }, + { + "key": { + "sv": "Posttentamiskt stressyndrom", + "en": "Post-exam stress syndrome" + }, + "value": { + "sv": "Traumatiskt tillstånd hos teknolog efter en skriven tenta. Kan inefatta symptom som, uppställning av differentialekvationer i sömnen eller endast kunna kommunicera skriftligt i programmeringskod.", + "en": "Traumatic state of a student after a written exam. May include symptoms such as, setting up differential equations in their sleep or only being able to communicate in writing in programming code." + } + }, + { + "key": { + "sv": "Rekursion", + "en": "Recursion" + }, + "value": { + "sv": "Se Rekursion.", + "en": "See Recursion." + } + }, + { + "key": { + "sv": "Reiseleiter", + "en": "Reiseleiter" + }, + "value": { + "sv": "F-sektionens egna reseledare. Känns igen på fracken, pilotbrillorna, den blå teknologmössan och den något överväldigande förkärleken till att leka.", + "en": "The F-guild's own tour guides. Recognisable by the tail coat, the pilot glasses, the blue technology hat and the somewhat overwhelming fondness of playing games." + } + }, + { + "key": { + "sv": "Sexmästeri", + "en": "Sexmästeri (The Festivities Committee)" + }, + "value": { + "sv": "Ett underbart gäng som fixar alla sittningar. Sexmästeri har egentligen ingenting med sex att göra, utan härstammar från ett gammalt svenskt ord för fest, jmf Svensexa.", + "en": "A fantastic group that organises all the sittings. Sexmästeri really has nothing to do with sex, but comes from an old Swedish word for party, cf. Svensexa." + } + }, + { + "key": { + "sv": "Sittning", + "en": "Sitting" + }, + "value": { + "sv": "Måltid vid bord under festligare former.", + "en": "Meal at a table in a more festive setting." + } + }, + { + "key": { + "sv": "sjön Sjön", + "en": "sjön Sjön" + }, + "value": { + "sv": "Vacker sjö utanför Mattehuset, i vilken ön Ön ligger. Också kallad Lunds skärgård.", + "en": "Beautiful lake outside MH, in which the ön Ön is located. Also called the archipelago of Lund." + } + }, + { + "key": { + "sv": "Slasque", + "en": "Slasque" + }, + "value": { + "sv": "Sittning med klädkod overall. Jmf Gasque.", + "en": "Sitting with dress code overalls. cf. Gasque." + } + }, + { + "key": { + "sv": "Sparta", + "en": "Sparta" + }, + "value": { + "sv": "Studentghetto nära LTH. Inspirerat av efterkrigsarkitektur från forna Sovjetunionen. Har undvikts att renoveras för att möjliggöra större vinst för AFB.", + "en": "Student ghetto near LTH, inspired by post-war architecture from the former Soviet Union. Has been avoided to be renovated to enable greater profit for AFB." + } + }, + { + "key": { + "sv": "Spex", + "en": "Spex" + }, + "value": { + "sv": "Som en musikal fast studentikos och rolig.", + "en": "Like a musical, but student-centred and fun." + } + }, + { + "key": { + "sv": "telefonkiosken Telefonkiosken", + "en": "telefonkiosken Telefonkiosken" + }, + "value": { + "sv": "Orange telefonkiosk på ön Ön som alltid ska vara orange.", + "en": "Orange phone booth on sjön Sjön that should always be orange." + } + }, + { + "key": { + "sv": "Tenta", + "en": "Exam" + }, + "value": { + "sv": "Chockbehandling av tentaångest.", + "en": "Shock treatment for exam anxiety." + } + }, + { + "key": { + "sv": "Tentavrål", + "en": "Tent howl" + }, + "value": { + "sv": "23:00 varje kväll i tentaveckan lindras tentaångesten i ett kollektivt vrål. Kan ofta höras på Delphi.", + "en": "At 23:00 every night during exam week, exam anxiety is relieved in a collective howl. Can often be heard at Delphi." + } + }, + { + "key": { + "sv": "Tentaångest", + "en": "Exam anxiety" + }, + "value": { + "sv": "Vag känsla av oro som ökar exponentiellt då läsperioden lider mot sitt slut.", + "en": "A vague sense of anxiety that increases exponentially as the semester comes to an end." + } + }, + { + "key": { + "sv": "Vildanden", + "en": "Vildanden" + }, + "value": { + "sv": "Studentghetto inte alls nära LTH.", + "en": "Student ghetto not at all close to LTH." + } + }, + { + "key": { + "sv": "Älgebra", + "en": "Älgebra" + }, + "value": { + "sv": "Matematisk metod främst nyttjad vid räkning av storvilt.", + "en": "Mathematical method mainly used for counting of The big game." + } + }, + { + "key": { + "sv": "ön Ön", + "en": "ön Ön" + }, + "value": { + "sv": "Ö i sjön Sjön med telefonkiosken Telefonkiosken på. Ockuperas traditionsenligt av F-sektionen innan sjöslaget på Regattadagen.", + "en": "Island in sjön Sjön with telefonkiosken Telefonkiosken on it. Traditionally occupied by the F-guild before the sea battle on Regatta Day." + } + } +] \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/dresscode/data_klad.json b/assets/data/nollning_26/nolleguide/dresscode/data_klad.json new file mode 100644 index 00000000..e6e99c7b --- /dev/null +++ b/assets/data/nollning_26/nolleguide/dresscode/data_klad.json @@ -0,0 +1,154 @@ +{ + "title": { + "sv": "En guide till klädkoder inom studentlivet", + "en": "The Student’s Guide to Dress Codes" + }, + "content": { + "sv": "I samarbete med medaljkommitteen\n\nI studentlivet kan du komma att stöta på olika klädkoder. Det är frivilligt att följa dem, men för den nyfikne är här en guide med tips från medaljkommittén om hur de olika koderna kan tolkas.", + "en": "Featuring the Procession\n\nIn student life, you may come across different dress codes. Following them is voluntary, but for the curious, here is a guide with tips from the Procession on how to interpret the different codes." + }, + "sections": [ + { + "title": { + "sv": "Högtidsdräkt", + "en": "White tie/Full dress" + }, + "subsections": [ + { + "title": { + "sv": "Frack", + "en": "Tailcoat" + }, + "content": { + "sv": "Fracken är en traditionell festklädsel med följande delar:\n• Byxor: Svarta med sidenrevärer, i samma tyg som fracken. De ska bäras med hängslen för att sitta korrekt.\n• Frackskjorta: En vit skjorta speciellt utformad för frack, med plats för manschettknappar och löstagbara bröstknappar, som köps separat.\n• Frackväst: Vit och designad specifikt för frack.\n• Fluga: Vit.\n• Skor: Svarta lackskor.\nMånga nya studenter i Lund väljer att köpa sin frack från Anderssons Herr där man med deras frack paket får en hel uppsättning med allt man behöver. Det är väldigt enkelt för dig som ny student och till ett rimligt pris. Man hittar dem på Lilla Fiskaregatan 16 och på deras hemsida https://www.anderssonsherr.se", + "en": "The tailcoat is a traditional festive outfit with the following elements:\n• Trousers: Black with silk stripes, in the same fabric as the coat. They should be worn with suspenders to fit correctly.\n• Tailcoat shirt: A white shirt specially designed for tails, with space for cufflinks and detachable breast buttons, purchased separately.\n• Waistcoat: White and designed specifically for tails.\n• Bow tie: White.\n• Shoes: Black patent leather shoes.\n Many new students in Lund choose to buy their tailcoat from Anderssons Herr, where their tuxedo package includes everything you need. It’s very convenient for new students and reasonably priced. You can find them at Lilla Fiskaregatan 16 and on their website, https://www.anderssonsherr.se" + }, + "image": "hogtid" + }, + { + "title": { + "sv": "Långklänning", + "en": "Full dress" + }, + "content": { + "sv": "Långklänningen/balklänningen är en elegant klädsel för festliga tillfällen.\n• Längd: Klänningen ska nå ner till golvet.\n• Material och Stil: Bör vara av ett fint tyg och ha en festlig modell.\n• Ärmar: Kan vara ärmlös. Om handskar bärs, ska de helst vara långa nog att täcka armbågarna.", + "en": "The full dress is an elegant outfit for festive occasions.\n• Length: The dress should reach down to the floor.\n• Material and Style: Should be of a fine fabric and have a festive style.\n• Sleeves: May be sleeveless. If gloves are worn, they should ideally be long enough to cover the elbows." + } + }, + { + "title": { + "sv": "Accessoarer", + "en": "Accessories" + }, + "content": { + "sv": "Det är kutym att bära medaljer och ordensband vid dessa tillfällen. Till högtidsdräkt bärs studentmössans vita modell.", + "en": "It is customary to wear medals and ribbons on these occasions. The white model of the student cap is worn for formal dress." + } + } + ] + }, + { + "title": { + "sv": "Mörk kostym", + "en": "Formal" + }, + "subsections": [ + { + "title": { + "sv": "Klänning/Kjol", + "en": "Dress/Skirt" + }, + "content": { + "sv": "För den som bär klänning eller kjol, bör plagget vara av ett finare tyg, såsom siden eller sammet, och nå ner till eller täcka knäna. Mörka toner rekommenderas för att matcha den formella stilen.", + "en": "For those wearing a dress or skirt, the garment should be of a finer fabric, such as silk or velvet, and reach down to or cover the knees. Dark tones are recommended to match the formal style." + } + }, + { + "title": { + "sv": "Kostym", + "en": "Suit" + }, + "content": { + "sv": "En mörk kostym är formell och ska bestå av kavaj, byxor och eventuell väst i samma tyg och färg. Svart är ett utmärkt val.\n• Skjorta: En ljus skjorta, gärna vit, är att föredra.\n• Skor och Skärp: Skorna ska vara svarta. Om du använder skärp, ska det också vara svart.\n• Accessoarer: Slips eller fluga är obligatoriskt till kavajen.", + "en": "The dress code formal consist of a jacket, trousers and possibly a vest in the same fabric and color. Black is an excellent choice.\n• Shirt: A light-colored shirt, preferably white.\n• Shoes and belt: Shoes should be black. If you wear a belt, it should also be black.\n• Accessories: A tie or bow tie is mandatory with the jacket." + } + } + ], + "image": "kostym" + }, + { + "title": { + "sv": "Udda Kavaj", + "en": "Smart casual" + }, + "content": { + "sv": "Klädkoden \"udda kavaj\" innebär främst att kavajen inte ska matcha med underdelen.\n• Stil: Håll klädseln uppklädd men inte lika formell som mörk kostym. Välj finare plagg än vardagskläder, exempelvis en snyggare byxa/kjol och en valfri överdel, eller varför inte en enklare klänning. Undvik jeans.\n• Kavaj: Kavajen kan vara en blazer eller en kavaj från en kostym, men den ska inte matcha byxorna eller kjolen.\n• Överdel: Skjorta eller topp kan vara i valfri färg och stil.\n• Underdelen: Bör vara i ett annat tyg och färg än en eventuell kavaj.\n• Accessoarer: Slips eller fluga är valfritt.", + "en": "The dress code smart casual mainly implies that the suit should not match with the bottom.\n• Style: Keep the outfit dressed up but not as formal as the dress code “Formal”. Choose nicer pieces than casual wear, such as a dressier trouser/skirt and a top of your choice, or a simpler dress. Avoid jeans.\n• Jacket: The jacket can be a blazer or a suit jacket, but it should not match the pants or skirt.\n• Bodice: Shirt or top can be in any color and style.\n• Pants or skirt: Should be in a different fabric and color than the jacket.\n• Accessories: Tie or bow tie is optional." + }, + "image":"uddakavaj" + }, + { + "title": { + "sv": "Ovve", + "en": "Ovve" + }, + "content": { + "sv": "En klädkod man inte finner utanför Teknologvärlden! På F-sektionen är det högst vanligt förekommande med teknologmössan i rätt färg till Ovve.", + "en": "A dress code you won't find outside the Technologist world! In the F-section it is very common to wear the technologist cap in the right color for Ovve." + }, + "image": "ovve" + }, + { + "title": { + "sv": "Ovve+Temaenligt", + "en": "Ovve+Thematically" + }, + "content": { + "sv": "Ytterligare en klädkod inom teknologvärlden. Denna är vanligt förekommande på slasquer/fulsittningar och urskiljer sig från Ovve genom att bjuda in till tema! Här kan man gå på från allt mellan 0 till 10000% på en temaenlig outfit.", + "en": "Another dress code within the technologist world. This is commonly used at Slasque sittings and differs from Ovve by inviting to theme! Here you can go from anywhere between 0 to 10000% on a themed outfit." + } + }, + { + "title": { + "sv": "Teknologmössan", + "en": "Technologist cap" + }, + "content": { + "sv": "Teknologmössan finns i två varianter, den vita sommarmodellen samt den blåa vintermodellen. Vinterskyddet bärs från 4 oktober till och med mösspåtagningen den 30 april. Ett undantag till detta är att vintermodellen aldrig bärs till högtidsdräkt, då bärs istället den vita sommarmodellen oavsett tid på året.", + "en": "The technologist's cap has in two options, the white summer cap and the blue winter cap. The winter protection is worn from October 4th up to and including the “Cap fitting” on April 30th. An exception to this is that the winter model is never worn with “white tie/full dress”. Then the white summer model is worn instead, regardless of the time of year." + }, + "image": "mossa" + }, + { + "title": { + "sv": "Tofsen", + "en": "The tassel" + }, + "content": { + "sv": "I tofsen kan det hänga olika saker som samlats på under ens år som teknolog, men de mest betydelsefulla är spegaten. Spegaten matchar de år inom ett program man läst eller läser. Spegaten för teknisk fysik är orange, för teknisk matematik orange/silver och för teknisk nanovetenskap orange/grön.", + "en": "The tassel can hold a collection of things accumulated during your years as a technologist, but the most significant is the spegat. Which matches the years within a program you have studied or are studying. The spegat for Engineering Physics is orange, orange/silver for Engineering Mathematics and orange/green for Engineering Nanoscience." + } + }, + { + "title": { + "sv": "Medaljer och ordenstecken", + "en": "Medals and badges" + }, + "content": { + "sv": "Vid bal eller särskilda tillställningar där medaljer delas ut, kan den aktuella medaljen bäras på frackslaget alternativt på klänningens vänstra sida. Ordensband bärs över höger axel, och för frackbärare skall bandet bäras UNDER frackvästen. Medaljer bärs olika på frack/kostym respektive klänning. På frack eller kostym kan medaljerna placeras under bröstfickan, gärna i prydliga rader. Bär man klänning fäster man oftast sina medaljer på ordensbandet.", + "en": "At balls or special events where medals are awarded, the medal in question may be worn on the lapel or on the left side of the dress. The ribbon is worn over the right shoulder, and for tailcoat wearers the ribbon should be worn UNDER the tailcoat vest. Medals are worn differently on a coat/suit and a dress. On a coat or suit, the medals can be placed under the breast pocket, preferably in neat rows. If you wear a dress, you usually attach your medals to the ribbon." + }, + "image": "medalj" + }, + { + "title": { + "sv": "The end", + "en": "The end" + }, + "content": { + "sv": "Medverkande: Christopher Doggett, Agnes Göransson, Tova Franvin, Emilia Nilsson. Fotograf: Blendona Ibrahimi", + "en": "Models: Christopher Doggett, Agnes Göransson, Tova Franvin, Emilia Nilsson. Photographer: Blendona Ibrahimi" + } + } + ] +} \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/dresscode/hogtid.png b/assets/data/nollning_26/nolleguide/dresscode/hogtid.png new file mode 100644 index 00000000..48d95669 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/dresscode/hogtid.png differ diff --git a/assets/data/nollning_26/nolleguide/dresscode/kostym.png b/assets/data/nollning_26/nolleguide/dresscode/kostym.png new file mode 100644 index 00000000..4d87ccb7 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/dresscode/kostym.png differ diff --git a/assets/data/nollning_26/nolleguide/dresscode/medalj.png b/assets/data/nollning_26/nolleguide/dresscode/medalj.png new file mode 100644 index 00000000..66ca4d2b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/dresscode/medalj.png differ diff --git a/assets/data/nollning_26/nolleguide/dresscode/mossa.png b/assets/data/nollning_26/nolleguide/dresscode/mossa.png new file mode 100644 index 00000000..0e18749c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/dresscode/mossa.png differ diff --git a/assets/data/nollning_26/nolleguide/dresscode/ovve.png b/assets/data/nollning_26/nolleguide/dresscode/ovve.png new file mode 100644 index 00000000..7a08a8be Binary files /dev/null and b/assets/data/nollning_26/nolleguide/dresscode/ovve.png differ diff --git a/assets/data/nollning_26/nolleguide/dresscode/uddakavaj.png b/assets/data/nollning_26/nolleguide/dresscode/uddakavaj.png new file mode 100644 index 00000000..e3d541b4 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/dresscode/uddakavaj.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/etiquette_en.png b/assets/data/nollning_26/nolleguide/homescreen/etiquette_en.png new file mode 100644 index 00000000..fd68e7b2 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/etiquette_en.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/etiquette_sv.png b/assets/data/nollning_26/nolleguide/homescreen/etiquette_sv.png new file mode 100644 index 00000000..5e837a16 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/etiquette_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/kladkod_en.png b/assets/data/nollning_26/nolleguide/homescreen/kladkod_en.png new file mode 100644 index 00000000..f0295b5e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/kladkod_en.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/kladkod_sv.png b/assets/data/nollning_26/nolleguide/homescreen/kladkod_sv.png new file mode 100644 index 00000000..225bbb29 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/kladkod_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/ordlista_en.png b/assets/data/nollning_26/nolleguide/homescreen/ordlista_en.png new file mode 100644 index 00000000..619e21da Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/ordlista_en.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/ordlista_sv.png b/assets/data/nollning_26/nolleguide/homescreen/ordlista_sv.png new file mode 100644 index 00000000..9bfd1039 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/ordlista_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/powered_by.png b/assets/data/nollning_26/nolleguide/homescreen/powered_by.png new file mode 100644 index 00000000..f7c0176e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/powered_by.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/sandwich_en.png b/assets/data/nollning_26/nolleguide/homescreen/sandwich_en.png new file mode 100644 index 00000000..cd54d026 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/sandwich_en.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/sandwich_sv.png b/assets/data/nollning_26/nolleguide/homescreen/sandwich_sv.png new file mode 100644 index 00000000..d9556eb8 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/sandwich_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/stod_en.png b/assets/data/nollning_26/nolleguide/homescreen/stod_en.png new file mode 100644 index 00000000..c99f0d79 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/stod_en.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/stod_sv.png b/assets/data/nollning_26/nolleguide/homescreen/stod_sv.png new file mode 100644 index 00000000..21615625 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/stod_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/studentlivet_en.png b/assets/data/nollning_26/nolleguide/homescreen/studentlivet_en.png new file mode 100644 index 00000000..fd9e7a78 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/studentlivet_en.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/studentlivet_sv.png b/assets/data/nollning_26/nolleguide/homescreen/studentlivet_sv.png new file mode 100644 index 00000000..e4620031 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/studentlivet_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/title_en.png b/assets/data/nollning_26/nolleguide/homescreen/title_en.png new file mode 100644 index 00000000..b19f81ac Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/title_en.png differ diff --git a/assets/data/nollning_26/nolleguide/homescreen/title_sv.png b/assets/data/nollning_26/nolleguide/homescreen/title_sv.png new file mode 100644 index 00000000..2a33927b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/homescreen/title_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/infobg.png b/assets/data/nollning_26/nolleguide/infobg.png new file mode 100644 index 00000000..6e21323d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/infobg.png differ diff --git a/assets/data/nollning_26/nolleguide/poweredby.png b/assets/data/nollning_26/nolleguide/poweredby.png new file mode 100644 index 00000000..68f7ac58 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/poweredby.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/apricotbrie_en.png b/assets/data/nollning_26/nolleguide/sandwich/apricotbrie_en.png new file mode 100644 index 00000000..db6b70dc Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/apricotbrie_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/apricotbrie_sv.png b/assets/data/nollning_26/nolleguide/sandwich/apricotbrie_sv.png new file mode 100644 index 00000000..d1b6a2d9 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/apricotbrie_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/avocado_en.png b/assets/data/nollning_26/nolleguide/sandwich/avocado_en.png new file mode 100644 index 00000000..0b69ad13 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/avocado_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/avocado_sv.png b/assets/data/nollning_26/nolleguide/sandwich/avocado_sv.png new file mode 100644 index 00000000..f5474011 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/avocado_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/bg.png b/assets/data/nollning_26/nolleguide/sandwich/bg.png new file mode 100644 index 00000000..0e80c986 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/bg.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/bg_end.png b/assets/data/nollning_26/nolleguide/sandwich/bg_end.png new file mode 100644 index 00000000..6dc8e27c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/bg_end.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/bg_sandwich.png b/assets/data/nollning_26/nolleguide/sandwich/bg_sandwich.png new file mode 100644 index 00000000..b8c0e73a Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/bg_sandwich.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/bg_top_en.png b/assets/data/nollning_26/nolleguide/sandwich/bg_top_en.png new file mode 100644 index 00000000..3654ebaf Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/bg_top_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/bg_top_sv.png b/assets/data/nollning_26/nolleguide/sandwich/bg_top_sv.png new file mode 100644 index 00000000..9198b1fb Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/bg_top_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/cheese_en.png b/assets/data/nollning_26/nolleguide/sandwich/cheese_en.png new file mode 100644 index 00000000..0cf87262 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/cheese_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/cheese_sv.png b/assets/data/nollning_26/nolleguide/sandwich/cheese_sv.png new file mode 100644 index 00000000..70e8ef23 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/cheese_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/chevre_en.png b/assets/data/nollning_26/nolleguide/sandwich/chevre_en.png new file mode 100644 index 00000000..95d3104a Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/chevre_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/chevre_sv.png b/assets/data/nollning_26/nolleguide/sandwich/chevre_sv.png new file mode 100644 index 00000000..d52359a3 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/chevre_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/chickendallas_en.png b/assets/data/nollning_26/nolleguide/sandwich/chickendallas_en.png new file mode 100644 index 00000000..09af8860 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/chickendallas_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/chickendallas_sv.png b/assets/data/nollning_26/nolleguide/sandwich/chickendallas_sv.png new file mode 100644 index 00000000..49d4639e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/chickendallas_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/chilli_en.png b/assets/data/nollning_26/nolleguide/sandwich/chilli_en.png new file mode 100644 index 00000000..08cd4b8e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/chilli_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/chilli_sv.png b/assets/data/nollning_26/nolleguide/sandwich/chilli_sv.png new file mode 100644 index 00000000..6e2c3b7d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/chilli_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/curry_en.png b/assets/data/nollning_26/nolleguide/sandwich/curry_en.png new file mode 100644 index 00000000..287fa8ef Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/curry_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/curry_sv.png b/assets/data/nollning_26/nolleguide/sandwich/curry_sv.png new file mode 100644 index 00000000..a5d54b0f Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/curry_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/data.json b/assets/data/nollning_26/nolleguide/sandwich/data.json new file mode 100644 index 00000000..410018c8 --- /dev/null +++ b/assets/data/nollning_26/nolleguide/sandwich/data.json @@ -0,0 +1,288 @@ +[ + { + "title": { + "sv": "Quorn Dallas", + "en": "Quorn Dallas" + }, + "description": { + "sv": "Noggrant komponerad med en blandning av utsökta smaker, precis som en Amerikansk BBQ. En uppfriskande sås bryter av en perfekt quornblandning toppad av delikat rostad lök. Med dess storlek uppfyller den alla krav en amerikan skulle kunna ställa. Det amerikanska självförtroendet har även lånats när man djärvt blandade in sallad för att fullända mackans komposition.\n\nSmak: 25/25\nPris: 17/25\nStorlek: 23/25\nUpplevelse: 25/25\n\nTotalt: 90/100", + "en": "Carefully composed with a blend of exquisite flavors, just like an American BBQ. A refreshing sauce cuts through a perfect Quorn mix, topped with delicate crispy onions. With its size, it meets every demand an American could possibly make. American confidence was also borrowed when they boldly mixed in lettuce to perfect the sandwich's composition.\n\nTaste: 25/25\nPrice: 17/25\nSize: 23/25\nExperience: 25/25\n\nTotal: 90/100" + }, + "additional": "", + "price": "44 kr", + "asset": "quorndallas" + }, + { + "title": { + "sv": "Aprikos Brie", + "en": "Apricot Brie" + }, + "description": { + "sv": "Håller CSN på att ta slut? Närmar sig tenta P och du har inte tid för semester? Åk på en 33 kronors resa till södra frankrike där du kan njuta av den söta aprikosen och den lena brien. Denna macka frambringar det bästa och det värsta av en dessertbricka, Riktigt god smak i blygsam mängd.\n\nSmak: 22/25\nPris: 25/25\nStorlek: 13/25\nUpplevelse: 21/25\n\nTotalt: 81/100", + "en": "Is your CSN (student finance) running out? Is the exam period approaching and you have no time for a vacation? Take a 33 SEK trip to southern France where you can enjoy the sweet apricot and the smooth brie. This sandwich brings out the best and the worst of a dessert platter. Really good taste in a modest quantity.\n\nTaste: 22/25\nPrice: 25/25\nSize: 13/25\nExperience: 21/25\n\nTotal: 81/100" + }, + "additional": "", + "price": "33 kr", + "asset": "apricotbrie" + }, + { + "title": { + "sv": "Mozzarella pesto", + "en": "Mozzarella Pesto" + }, + "description": { + "sv": "\"Som att läsa en historia du redan känner till\" Du vet exakt vad du kommer få och du blir inte besviken. Gudarna ska veta! Peston är studentens hjärtebröd, den valsar passionerat fram på tungan för att efterföljas av mozzarellans mjuka tango.\n\nSmak: 19/25\nPris: 18/25\nStorlek: 16/25\nUpplevelse: 20/25\n\nTotalt: 73/100", + "en": "\"Like reading a story you already know.\" You know exactly what you're going to get, and you won't be disappointed. Heaven knows! Pesto is the bread and butter of the student; it waltzes passionately across the tongue, followed by the soft tango of the mozzarella.\n\nTaste: 19/25\nPrice: 18/25\nSize: 16/25\nExperience: 20/25\n\nTotal: 73/100" + }, + "additional": "", + "price": "42 kr", + "asset": "pesto" + }, + { + "title": { + "sv": "Serrano Färskost", + "en": "Serrano Cream Cheese" + }, + "description": { + "sv": "Serrano, denna salta skinka, typisk för det spanska köket, låter lite mer som en italiensk maffiaboss. Precis som en maffiaboss lovade skinkan mycket men gjorde istället en blygsam entré. I själva verket var det tomaten och färskosten som bar smaken på sina axlar. En god färskost macka helt enkel.\n\nSmak: 19/25\nPris: 20/25\nStorlek: 18/25\nUpplevelse: 16/25\n\nTotalt: 73/100", + "en": "Serrano, this salty ham typical of Spanish cuisine, sounds a bit more like an Italian mafia boss. And just like a mafia boss, the ham promised a lot but made a modest entrance instead. In reality, the tomato and the cream cheese carried the flavor on their shoulders. So simply put, it's a good cream cheese sandwich.\n\nTaste: 19/25\nPrice: 20/25\nSize: 18/25\nExperience: 16/25\n\nTotal: 73/100" + }, + "additional": "", + "price": "40 kr", + "asset": "serrano" + }, + { + "title": { + "sv": "Chillimarinerad blomkål", + "en": "Chilli Marinated Cauliflower" + }, + "description": { + "sv": "Saknade den intensiva hetta som namnet utlovade. Och utan hetta blir det ingen passion (shoutout Reise25). Annars en stabil macka där chili och lök gör grovjobbet. Blomkålen var där.\n\nSmak: 17/25\nPris: 21/25\nStorlek: 17/25\nUpplevelse: 17/25\n\nTotalt: 72/100", + "en": "Lacked the intense heat the name promised. And without heat, there is no passion (shoutout Reise25). Otherwise a solid sandwich where chili and onion do the heavy lifting. The cauliflower was there.\n\nTaste: 17/25\nPrice: 21/25\nSize: 17/25\nExperience: 17/25\n\nTotal: 72/100" + }, + "additional": "", + "price": "38 kr", + "asset": "chilli" + }, + { + "title": { + "sv": "Tofu Bahn mi", + "en": "Tofu Bánh Mì" + }, + "description": { + "sv": "Med ett lovande intryck (bröd med pålägg) var denna macka välfylld som första föreläsningen i endim. Tyvärr är det dock en praktikant och inte Micke P som ska föreläsa. Såsen och tofun existerade men slank ner utan att lämna något större intryck, till och med mjölk kunde inte rädda denna upplevelse från dess bleka realitet.\n\nSmak: 11/25\nPris: 19/25\nStorlek: 17/25\nUpplevelse: 13/25\n\nTotalt: 60/100", + "en": "With a promising first impression (bread with toppings), this sandwich was as packed as the first lecture in one-dimensional calculus. Unfortunately, it's an intern lecturing and not Micke P. The sauce and tofu existed but slipped down without leaving any major impression; even milk couldn't save this experience from its pale reality.\n\nTaste: 11/25\nPrice: 19/25\nSize: 17/25\nExperience: 13/25\n\nTotal: 60/100" + }, + "additional": "", + "price": "41 kr", + "asset": "tofu" + }, + { + "title": { + "sv": "Dallas Kyckling", + "en": "Dallas Chicken" + }, + "description": { + "sv": "Denna macka sticker verkligen ut! Både i pris (svindyr) och i smak (svingod). Ett av få icke vegetariska alternativ passar perfekt för de läkarstudenter som lyckas förhålla sig ner till MH och fått för sig att det inte går att äta vegetariskt. Tyvärr hittades denna macka inte längre i Hilbert då den har pensionerats. RIP.\n\nSmak: 24/25\nPris: 15/25\nStorlek: 23/25\nUpplevelse: 25/25\n\nTotalt: 87/100", + "en": "This sandwich really stands out! Both in price (hella expensive) and in taste (hella good). One of the few non-vegetarian options fits perfectly for those medical students who manage to wander down to MH and have gotten it into their heads that it's impossible to eat vegetarian. Unfortunately, this sandwich is no longer found in Hilbert Café as it has been retired. RIP.\n\nTaste: 24/25\nPrice: 15/25\nSize: 23/25\nExperience: 25/25\n\nTotal: 87/100" + }, + "additional": "", + "price": "48 kr", + "asset": "chickendallas" + }, + { + "title": { + "sv": "Quorn Tzatziki", + "en": "Quorn Tzatziki" + }, + "description": { + "sv": "En solig måndag morgon gick jag in i Foajen och där var den, Ljuset studsade mot brödets spröda yta, Doften av tzatziki hängde i luften och jag lyftes liksom av osynliga fingrar mot Hilbertcafe. Längtar du redan efter känslan då du får ta fram grillen igen nästa vår? Då är detta mackan för dig.\n\nSmak: 20/25\nPris: 18/25\nStorlek: 21/25\nUpplevelse: 23/25\n\nTotalt: 82/100", + "en": "One sunny Monday morning I walked into the foyer and there it was. The light bounced off the crispy surface of the bread, the scent of tzatziki hung in the air, and I was lifted, as if by invisible fingers, towards Hilbert Café. Are you already longing for the feeling of bringing out the grill again next spring? Then this is the sandwich for you.\n\nTaste: 20/25\nPrice: 18/25\nSize: 21/25\nExperience: 23/25\n\nTotal: 82/100" + }, + "additional": "", + "price": "42 kr", + "asset": "quorntz" + }, + { + "title": { + "sv": "Kalkon feta", + "en": "Turkey Feta" + }, + "description": { + "sv": "Inför denna macka var mina förväntningar låga. Men den var bra och jag har inget att såga. Fetaosten var välvald som Micke P's ord. Kalkonen var fräsch, magen blev smord. Om du efter en stabil macka leta, rekommenderar jag Kalkon Feta.\n\nSmak: 23/25\nPris: 16/25\nStorlek: 22/25\nUpplevelse: 24/25\n\nTotalt: 85/100", + "en": "Before this sandwich, my expectations were low. But it was good, and I have no critique to throw. The feta was well-chosen, like Micke P's word. The turkey was fresh, my stomach concurred. If a solid sandwich is what you're trying to get, a recommendation goes to the Turkey Feta.\n\nTaste: 23/25\nPrice: 16/25\nSize: 22/25\nExperience: 24/25\n\nTotal: 85/100" + }, + "additional": "", + "price": "44 kr", + "asset": "turkey" + }, + { + "title": { + "sv": "Lax pepparot", + "en": "Salmon Horseradish" + }, + "description": { + "sv": "Har du förlorat din inre Stockholms grisch på Lunds smågator? Frukta inte, här har vi lösningen. För ringa 49 kr kan du åter känna den ljuva smekningen av lax på tungan. Dess samspel med pepparrotens eleganta sting gjorde mig upphetsad av ren gastronomisk upplevelse och fulländade alla mina behov av lyx.\n\nSmak: 25/25\nPris: 14/25\nStorlek: 23/25\nUpplevelse: 25/25\n\nTotalt: 87/100", + "en": "Have you lost your inner Stockholm \"grisch\" (posh vibe) on the small streets of Lund? Fear not, here is the solution. For a mere 49 SEK you can once again feel the sweet caress of salmon on your tongue. Its interplay with the elegant sting of the horseradish aroused me with pure gastronomic delight and fulfilled all my needs for luxury.\n\nTaste: 25/25\nPrice: 14/25\nSize: 23/25\nExperience: 25/25\n\nTotal: 87/100" + }, + "additional": "", + "price": "49 kr", + "asset": "salmon" + }, + { + "title": { + "sv": "Chevre och Honung", + "en": "Chèvre and Honey" + }, + "description": { + "sv": "En estetiskt upplyftande macka. Det frasiga brödet arbetade i unison med chevrens kraftiga karaktär och medförde en maffig upplevelse. Honungen var något blygsam men dess ojämna närvaro gjorde det hela till en intressant skattjakt.\n\nSmak: 18/25\nPris: 16/25\nStorlek: 19/25\nUpplevelse: 19/25\n\nTotalt: 72/100", + "en": "An aesthetically uplifting sandwich. The crusty bread worked in unison with the strong character of the chèvre, resulting in a hefty experience. The honey was somewhat modest, but its uneven presence turned the whole thing into an interesting treasure hunt.\n\nTaste: 18/25\nPrice: 16/25\nSize: 19/25\nExperience: 19/25\n\nTotal: 72/100" + }, + "additional": "", + "price": "44 kr", + "asset": "chevre" + }, + { + "title": { + "sv": "Salami brie", + "en": "Salami Brie" + }, + "description": { + "sv": "Under tenta p provade jag salami bri(e). Den fick mig att känna mig lite mera fri. Med osten tyckte jag att hilbert cafe var lite snåla. Men jag kommer ej göra som Gordon Ramsay och vråla. En bra macka, trots detta ris, definitivt värt sitt pris.\n\nSmak: 20/25\nPris: 20/25\nStorlek: 21/25\nUpplevelse: 21/25\n\nTotalt: 82/100", + "en": "During the exam period I tried the salami bri(e), It made me feel a little more free. With the cheese, I thought Hilbert Café was a bit cheap, But I won't do like Gordon Ramsay and shout or weep. A good sandwich, despite this critique, definitely worth the fee.\n\nTaste: 20/25\nPrice: 20/25\nSize: 21/25\nExperience: 21/25\n\nTotal: 82/100" + }, + "additional": "", + "price": "38 kr", + "asset": "salamibrie" + }, + { + "title": { + "sv": "Avocado bagel", + "en": "Avocado Bagel" + }, + "description": { + "sv": "Detta var i grunden en riktigt härlig macka med ett väldigt bra koncept. Brödet var otroligt gott och var utan tvekan mackans stora stjärna. Tyvärr var avokadon välsaltad just den här dagen, vilket gav en känsla av att inhalera en kallsup. Med en försiktigare hand med saltkaret har den här mackan dock potential att bli en riktig favorit på kaféet! Avokado är ju både lyxigt och gott.\n\nSmak: 4/25\nPris: 20/25\nStorlek: 22/25\nUpplevelse: 2/25\n\nTotalt: 48/100", + "en": "This was fundamentally a sandwich with a very good concept. The bread was incredibly tasty and was undoubtedly the big star of the sandwich. Unfortunately, the avocado was heavily salted on this particular day, which gave the sensation of inhaling seawater. With a more careful hand on the salt shaker, however, this sandwich has the potential to become a real favorite at the café! Avocado is, after all, both luxurious and delicious.\n\nTaste: 4/25\nPrice: 20/25\nSize: 22/25\nExperience: 2/25\n\nTotal: 48/100" + }, + "additional": "", + "price": "38 kr", + "asset": "avocado" + }, + { + "title": { + "sv": "Mango curry", + "en": "Mango Curry" + }, + "description": { + "sv": "Äpple och curry var en spännande kombination som gör en liten piruett på tungan. Tyvärr blir föreställningen snabbt enformig då curry såsen inte riktigt vågar kliva in i rampljuset. Mackan känns lite som en ballerina som gör samma steg hela tiden, vackert till en början men förutsägbart efter ett tag. Jag tyckte att det var extra synd att en av huvudrollsinnehavarna knappt dyker upp på scenen. Mangons sötma märks knappt i mackans komposition. En relativt svag show men kan ändå avnjutas då tillfälle är rätt!\n\nSmak: 19/25\nPris: 18/25\nStorlek: 19/25\nUpplevelse: 16/25\n\nTotalt: 72/100", + "en": "Apple and curry was an exciting combination that does a little pirouette on the tongue. Unfortunately, the performance quickly becomes monotonous as the curry sauce doesn't quite dare to step into the spotlight. The sandwich feels a bit like a ballerina doing the same step over and over, beautiful at first, but predictable after a while. I thought it was an extra shame that one of the lead actors barely shows up on stage. The sweetness of the mango is barely noticeable in the sandwich's composition. A relatively weak show, but it can still be enjoyed when the occasion is right!\n\nTaste: 19/25\nPrice: 18/25\nSize: 19/25\nExperience: 16/25\n\nTotal: 72/100" + }, + "additional": "", + "price": "42 kr", + "asset": "mango" + }, + { + "title": { + "sv": "Rödbetshummus", + "en": "Beetroot Hummus" + }, + "description": { + "sv": "Likt ett par vita byxor under en sangria kväll har hummusen färgats rosa av rödbetor. Tyvärr stannar rödbetans insats vid just färgen, smaken känns inte alls. Det är hummusen som gör att detta överhuvudtaget kan kallas en macka. Eftersträvar du mer hummus i ditt liv (som jag gör) är detta en ren guldgruva. Annars skjuter du dig själv i foten.\n\nSmak: 19/25\nPris: 20/25\nStorlek: 22/25\nUpplevelse: 21/25\n\nTotalt: 82/100", + "en": "Like a pair of white pants during a sangria night, the hummus has been dyed pink by beetroots. Unfortunately, the beetroot's contribution stops at just the color; the taste isn't there at all. It's the hummus that makes this possible to call a sandwich in the first place. If you are striving for more hummus in your life (as I am), this is an absolute goldmine. Otherwise, you're shooting yourself in the foot.\n\nTaste: 19/25\nPrice: 20/25\nSize: 22/25\nExperience: 21/25\n\nTotal: 82/100" + }, + "additional": "", + "price": "39 kr", + "asset": "hummus" + }, + { + "title": { + "sv": "Smurrig vegocurry", + "en": "Scrumptious Veggie Curry" + }, + "description": { + "sv": "Läses till melodin Var nöjd med allt som livet ger. Smurrig curry vill jag ha. och mackan den va riktigt bra. Glöm bort bekymmer, plugget och och bli kär. vad glad och mätt jag blev ida'. Den macka som jag självklart tar. Tacka hilbert för att de finns här.\n\nSmak: 22/25\nPris: 18/25\nStorlek: 22/25\nUpplevelse: 25/25\n\nTotalt: 87/100", + "en": "(Read to the tune of \"The Bare Necessities\") Scrumptious curry's what I crave, and this sandwich was a real rave. Forget your worries, studies, and fall in love, how happy and full I feel today. The sandwich that I'll gladly take, Thank Hilbert that they're here to stay.\n\nTaste: 22/25\nPrice: 18/25\nSize: 22/25\nExperience: 25/25\n\nTotal: 87/100" + }, + "additional": "", + "price": "45 kr", + "asset": "curry" + }, + { + "title": { + "sv": "Taco mack", + "en": "Taco Sandwich" + }, + "description": { + "sv": "Denna macka gav mig nästan traumatiska flashbacks till Avokado Bageln. Den var på gränsen till för salt vilket möjligtvis var en engångsgrej. För den som gillar tacos och inte pallar hacka alla grönsaker själv är denna macka perfekt. Med lite mindre salt och mer majs (för de e najs) så har vi en perfekt torsdagsmacka som kan avnjutas med valfri dryck!\n\nSmak: 21/25\nPris: 17/25\nStorlek: 23/25\nUpplevelse: 14/25\n\nTotalt: 76/100", + "en": "This sandwich gave me almost traumatic flashbacks to the Avocado Bagel. It was on the verge of being too salty, which was possibly a one-time thing. For someone who likes tacos and can't be bothered chopping all the vegetables themselves, this sandwich is perfect. With a little less salt and more corn (because corn is godchild newly born), we have a perfect Thursday sandwich that can be enjoyed with a beverage of your choice!\n\nTaste: 21/25\nPrice: 17/25\nSize: 23/25\nExperience: 14/25\n\nTotal: 76/100" + }, + "additional": "", + "price": "44 kr", + "asset": "taco" + }, + { + "title": { + "sv": "Spicy vegan", + "en": "Spicy Vegan" + }, + "description": { + "sv": "Jag är en stark förespråkare av att inte blanda in för mycket hetta i min mat. Om du gillar smärta i din mat så är det bara att köra på men jag undviker helst att bli aggressivt boxad på tungan. Mackan levererar på de förväntningar som namnet ger med en okej smak som för mig blir helt skymd av \"WHY IS IT SPICY\".\n\nSmak: 17/25\nPris: 18/25\nStorlek: 21/25\nUpplevelse: 14/25\n\nTotalt: 70/100", + "en": "I am a strong advocate for not mixing too much heat into my food. If you enjoy pain in your food, go right ahead, but I prefer to avoid getting aggressively punched on the tongue. The sandwich delivers on the expectations set by the name with an okay taste that, to me, gets completely overshadowed by \"WHY IS IT SPICY.\"\n\nTaste: 17/25\nPrice: 18/25\nSize: 21/25\nExperience: 14/25\n\nTotal: 70/100" + }, + "additional": "spicy.gif", + "price": "43 kr", + "asset": "vegan" + }, + { + "title": { + "sv": "All Mountain", + "en": "All Mountain" + }, + "description": { + "sv": "Denna smäckra macka var en gourmetisk sensation. Den salami liknande produkten i mitten skapade eufori på mina smaklökar. Tyvärr tyngdes den ner av opersonlig ost som inte uppfyllde mackans potential. Man brukar ju säga att \"size doesn't matter\", men å alla studenters vägnar… jag har sett större.\n\nSmak: 23/25\nPris: 21/25\nStorlek: 13/25\nUpplevelse: 21/25\n\nTotalt: 78/100", + "en": "This sleek sandwich was a gourmet sensation. The salami-like product in the middle created euphoria on my taste buds. Unfortunately, it was weighed down by impersonal cheese that didn't fulfill the sandwich's potential. They usually say that \"size doesn't matter,\" but on behalf of all students... I've seen bigger.\n\nTaste: 23/25\nPrice: 21/25\nSize: 13/25\nExperience: 21/25\n\nTotal: 78/100" + }, + "additional": "", + "price": "38 kr", + "asset": "mountain" + }, + { + "title": { + "sv": "Ostbulle", + "en": "Cheese Roll" + }, + "description": { + "sv": "För en student är denna guld värd, så att man kan bli mycket närd. En klassisk ost macka, när man på morgon ej frukost hinner packa.\n\nSmak: 24/25\nPris: 25/25\nStorlek: 9/25\nUpplevelse: 20/25\n\nTotalt: 78/100", + "en": "For a student this is worth its weight in gold, keeping you nourished and bold. A classic cheese roll to pack, when in the morning, time for breakfast you lack.\n\nTaste: 24/25\nPrice: 25/25\nSize: 9/25\nExperience: 20/25\n\nTotal: 78/100" + }, + "additional": "", + "price": "20 kr", + "asset": "cheese" + }, + { + "title": { + "sv": "Eslöv Baguette", + "en": "Eslöv Baguette" + }, + "description": { + "sv": "En klassisk vegobullemacka. För en liten peng kan du borra dig in i en oljekälla som praktiskt taget svämmar över av fyllning. En kladdig upplevelse som känns som en riktig vinstlott. Här gör rödbetan storslagen entré och gör att varje tugga blir som ett nytt spännande äventyr.\n\nSmak: 24/25\nPris: 21/25\nStorlek: 25/25\nUpplevelse: 25/25\n\nTotalt: 95/100", + "en": "A classic veggie-meatball sandwich. For a small penny, you can drill into an oil well that practically overflows with filling. A messy experience that feels like a real winning lottery ticket. Here the beetroot makes a grand entrance, making every bite feel like a new exciting adventure.\n\nTaste: 24/25\nPrice: 21/25\nSize: 25/25\nExperience: 25/25\n\nTotal: 95/100" + }, + "additional": "", + "price": "38 kr", + "asset": "eslov" + }, + { + "title": { + "sv": "Mackan som saknas", + "en": "The Missing Sandwich" + }, + "description": { + "sv": "Med en stor näve nyfångade, handskalade räkor till det låga priset 149 kr. Så utgör denna macka, studentens sista levebröd. En rågskiva med två ägghalvor på en klick majonnäs och ett salladsblad ger dig all näring du behöver. Kompositionen rundas av med en skiva ny skuren citron. Rekommenderar verkligen denna macka. Tyvärr har den ännu inte dykt upp i Hilbert cafe.\n\nSmak: 25/25\nPris: 25/25\nStorlek: 25/25\nUpplevelse: 25/25\n\nTotalt: 100/100", + "en": "With a large handful of freshly caught, hand-peeled shrimp for the low price of 149 SEK. This sandwich constitutes the student's final livelihood. A slice of rye bread with two egg halves on a dollop of mayonnaise and a lettuce leaf gives you all the nutrition you need. The composition is rounded off with a slice of freshly cut lemon. Highly recommend this sandwich. Unfortunately, it has not yet appeared in Hilbert Café.\n\nTaste: 25/25\nPrice: 25/25\nSize: 25/25\nExperience: 25/25\n\nTotal: 100/100" + }, + "additional": "", + "price": "149 kr", + "asset": "missing" + } +] \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/sandwich/eslov_en.png b/assets/data/nollning_26/nolleguide/sandwich/eslov_en.png new file mode 100644 index 00000000..67aa8a81 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/eslov_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/eslov_sv.png b/assets/data/nollning_26/nolleguide/sandwich/eslov_sv.png new file mode 100644 index 00000000..36b389f9 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/eslov_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/hummus_en.png b/assets/data/nollning_26/nolleguide/sandwich/hummus_en.png new file mode 100644 index 00000000..5c8400f0 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/hummus_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/hummus_sv.png b/assets/data/nollning_26/nolleguide/sandwich/hummus_sv.png new file mode 100644 index 00000000..6fcfb897 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/hummus_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/mango_en.png b/assets/data/nollning_26/nolleguide/sandwich/mango_en.png new file mode 100644 index 00000000..86f6c0a6 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/mango_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/mango_sv.png b/assets/data/nollning_26/nolleguide/sandwich/mango_sv.png new file mode 100644 index 00000000..e76c4431 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/mango_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/missing_en.png b/assets/data/nollning_26/nolleguide/sandwich/missing_en.png new file mode 100644 index 00000000..4276a6e2 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/missing_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/missing_sv.png b/assets/data/nollning_26/nolleguide/sandwich/missing_sv.png new file mode 100644 index 00000000..affe0088 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/missing_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/mountain_en.png b/assets/data/nollning_26/nolleguide/sandwich/mountain_en.png new file mode 100644 index 00000000..9b903a8c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/mountain_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/mountain_sv.png b/assets/data/nollning_26/nolleguide/sandwich/mountain_sv.png new file mode 100644 index 00000000..cb7c097e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/mountain_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/pesto_en.png b/assets/data/nollning_26/nolleguide/sandwich/pesto_en.png new file mode 100644 index 00000000..a1f69fb9 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/pesto_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/pesto_sv.png b/assets/data/nollning_26/nolleguide/sandwich/pesto_sv.png new file mode 100644 index 00000000..8ec70ce6 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/pesto_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/quorndallas_en.png b/assets/data/nollning_26/nolleguide/sandwich/quorndallas_en.png new file mode 100644 index 00000000..094b62e1 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/quorndallas_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/quorndallas_sv.png b/assets/data/nollning_26/nolleguide/sandwich/quorndallas_sv.png new file mode 100644 index 00000000..dde0dc16 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/quorndallas_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/quorntz_en.png b/assets/data/nollning_26/nolleguide/sandwich/quorntz_en.png new file mode 100644 index 00000000..32254864 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/quorntz_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/quorntz_sv.png b/assets/data/nollning_26/nolleguide/sandwich/quorntz_sv.png new file mode 100644 index 00000000..68f6eb46 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/quorntz_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/salamibrie_en.png b/assets/data/nollning_26/nolleguide/sandwich/salamibrie_en.png new file mode 100644 index 00000000..2cf4c638 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/salamibrie_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/salamibrie_sv.png b/assets/data/nollning_26/nolleguide/sandwich/salamibrie_sv.png new file mode 100644 index 00000000..b0d7905d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/salamibrie_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/salmon_en.png b/assets/data/nollning_26/nolleguide/sandwich/salmon_en.png new file mode 100644 index 00000000..7c0d6d67 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/salmon_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/salmon_sv.png b/assets/data/nollning_26/nolleguide/sandwich/salmon_sv.png new file mode 100644 index 00000000..3bde09dd Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/salmon_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/serrano_en.png b/assets/data/nollning_26/nolleguide/sandwich/serrano_en.png new file mode 100644 index 00000000..71e98b67 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/serrano_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/serrano_sv.png b/assets/data/nollning_26/nolleguide/sandwich/serrano_sv.png new file mode 100644 index 00000000..b55ca8c4 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/serrano_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/spicy.gif b/assets/data/nollning_26/nolleguide/sandwich/spicy.gif new file mode 100644 index 00000000..f0f531cb Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/spicy.gif differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/taco_en.png b/assets/data/nollning_26/nolleguide/sandwich/taco_en.png new file mode 100644 index 00000000..a0216218 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/taco_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/taco_sv.png b/assets/data/nollning_26/nolleguide/sandwich/taco_sv.png new file mode 100644 index 00000000..321256b5 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/taco_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/tofu_en.png b/assets/data/nollning_26/nolleguide/sandwich/tofu_en.png new file mode 100644 index 00000000..0c600dab Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/tofu_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/tofu_sv.png b/assets/data/nollning_26/nolleguide/sandwich/tofu_sv.png new file mode 100644 index 00000000..e8ecff04 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/tofu_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/turkey_en.png b/assets/data/nollning_26/nolleguide/sandwich/turkey_en.png new file mode 100644 index 00000000..76aa3769 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/turkey_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/turkey_sv.png b/assets/data/nollning_26/nolleguide/sandwich/turkey_sv.png new file mode 100644 index 00000000..24af77bc Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/turkey_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/vegan_en.png b/assets/data/nollning_26/nolleguide/sandwich/vegan_en.png new file mode 100644 index 00000000..5db6d4f7 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/vegan_en.png differ diff --git a/assets/data/nollning_26/nolleguide/sandwich/vegan_sv.png b/assets/data/nollning_26/nolleguide/sandwich/vegan_sv.png new file mode 100644 index 00000000..b96067ae Binary files /dev/null and b/assets/data/nollning_26/nolleguide/sandwich/vegan_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/stud_freja.jpeg b/assets/data/nollning_26/nolleguide/stud_freja.jpeg new file mode 100644 index 00000000..aa94f479 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/stud_freja.jpeg differ diff --git a/assets/data/nollning_26/nolleguide/stud_karin.jpg b/assets/data/nollning_26/nolleguide/stud_karin.jpg new file mode 100644 index 00000000..24248866 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/stud_karin.jpg differ diff --git a/assets/data/nollning_26/nolleguide/stud_petra.png b/assets/data/nollning_26/nolleguide/stud_petra.png new file mode 100644 index 00000000..f3de9504 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/stud_petra.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/back_en.png b/assets/data/nollning_26/nolleguide/studentlife/back_en.png new file mode 100644 index 00000000..66a7d656 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/back_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/back_sv.png b/assets/data/nollning_26/nolleguide/studentlife/back_sv.png new file mode 100644 index 00000000..aa02495a Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/back_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/building_blocks/background.png b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/background.png new file mode 100644 index 00000000..be9126b7 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/background.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/building_blocks/textbox.png b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/textbox.png new file mode 100644 index 00000000..8ccea633 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/textbox.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/building_blocks/wall_background.png b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/wall_background.png new file mode 100644 index 00000000..1a8352f8 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/wall_background.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/building_blocks/wall_edge.png b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/wall_edge.png new file mode 100644 index 00000000..329c3fa8 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/building_blocks/wall_edge.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/data_faculty.json b/assets/data/nollning_26/nolleguide/studentlife/faculty/data_faculty.json new file mode 100644 index 00000000..55b5cdfe --- /dev/null +++ b/assets/data/nollning_26/nolleguide/studentlife/faculty/data_faculty.json @@ -0,0 +1,60 @@ +{ + "people": [ + { + "title":{ + "sv": "Kårordförande", + "en": "President of the Teknologkåren" + }, + "name": { + "sv": "Axel Kjellberg", + "en": "Axel Kjellberg" + }, + "text": { + "sv": "Hej hallå!\nJag heter Axel Kjellberg och jag är Kårordförande för Teknologkåren vid Lunds Tekniska Högskola (TLTH)! I vanliga fall pluggar jag också på LTH men just i år har jag tagit studieuppehåll för att fokusera på Teknologkåren och studenterna på LTH.\nHösten i Lund är fortfarande en bit bort men livet på campus är i full rullning. Studietiden är på många sätt fantastisk och unik i möjligheterna den ger. För att studietiden och livet som student just ska bli så bra som bara möjligt finns studentkårer som organiserar studenter och för deras talan och din studentkår är Teknologkåren!\nTeknologkåren arbetar, tillsammans med våra 11 sektioner, för allas studenters bästa på LTH. Bland annat säkerställer vi att kvaliteten på utbildningen ständigt förbättras. Vi hjälper er att knyta kontakter med framtida arbetsgivare, exempelvis genom arbetsmarknadsmässan ARKAD. Allt detta knyts sedan samman med all social verksamhet, oavsett om det handlar om att kunna köpa billigt kaffe på campus, gå på sittningar, programmera, sporta, anordna storslagna evenemang eller anordna och delta i vår fantastiska nollning du nu får uppleva. Ta chansen att uppleva världens bästa studentliv och ta tillvara på möjligheten att engagera dig, oavsett var eller hur mycket det än må vara!\nKom gärna fram o säg hej om du ser mig eller någon annan från Teknologkåren på campus och hör av dig om du undrar något om verksamheten, studierna eller studentlivet i allmänhet. Vi ses i vimlet!", + "en": "Hello everyone!\nMy name is Axel Kjellberg and I am the President of the Teknologkåren at the Faculty of Engineering LTH (TLTH)! Normally, I also study at LTH, but this year I have taken a break from my studies to focus on TLTH and the students at LTH.\nAutumn in Lund is still a while away, but life on campus is in full swing. Studying is fantastic in many ways and unique in the opportunities it offers. To make sure that your time as a student is as good as possible, there are student unions that organize students and speak on their behalf, and your student union is TLTH!\nTeknologkåren works together with our 11 guilds for the benefit of all students at LTH. Among other things, we ensure that the quality of education is constantly improving. We help you establish contacts with future employers, for example through the ARKAD job fair. All of this is then linked to all social activities, whether it's buying cheap coffee on campus, going to parties, programming, playing sports, organizing grand events, or organizing and participating in our fantastic introduction week that you are now experiencing. Take the opportunity to experience the world's best student life and take advantage of the opportunity to get involved, no matter where or how much it may be!\nFeel free to come up and say hello if you see me or anyone else from the TLTH on campus, and get in touch if you have any questions about the activities, studies, or student life in general. See you around!" + } + }, + { + "title":{ + "sv": "Informationsansvarig", + "en": "Head of Public Relations" + }, + "name": { + "sv": "Elias Gullberg", + "en": "Elias Gullberg" + }, + "text": { + "sv": "Hej nollan.\nElias heter jag och sitter som informationsansvarig på teknologkåren. Hjärtligt välkommen till Lund och till LTH. Jag hoppas verkligen att du kommer att trivas och få den bästa studietiden du kan tänka dig.\nJag sitter då som heltidare på teknologkåren, som är studentkåren vid LTH. Som studentkår är vårt främsta syfte att bevaka och utveckla utbildningen vid LTH, men vi gör också en massa annat kul. Vi ordnar näringslivsaktiviteter, events och fritidssaker så att du både kan få bra kontakter inför framtiden och samtidigt ha en rolig studietid utanför plugget. Som heltidare har jag tagit ett års uppehåll från studierna för att jobba ett helt år med enbart studentengagemang. Totalt är vi elva stycken heltidare som alla ansvarar för olika områden inom kårens verksamhet.\nEn stor del av verksamheten bedrivs av sektionerna, som är underorganisationer till Teknologkåren. Sektionerna bedriver även en varierad mängd aktiviteter, allt från studiebevakning och caféverksamhet till fester och näringslivskontakt och mycket mer. Det kan låta ganska rörigt, särskilt när allt redan är så nytt. Men summan av kardemumman är att kåren finns för att studenter på LTH ska ha de bästa förutsättningarna under studietiden, oavsett var man väljer att lägga sitt engagemang.\nNi kommer säkert att stöta på oss mer i framtiden på de stora gemensamma eventen under nollningen eller under tentorna när vi står och delar ut frukost.\nHa en underbar nollning så hoppas jag att vi ses på campus!", + "en": "Hello nollan.\nMy name is Elias, and I serve as Head of Public Relations at Teknologkåren at the Faculty of Engineering LTH. A warm welcome to Lund and to LTH! I truly hope that you will enjoy your time here and have the best study experience you can imagine.\nI am a sabbatical officer at the Union, meaning I have taken a year off from my studies to work full-time with student engagement. The Union is the students' union at LTH, and our primary purpose is to monitor and improve the quality of education. However, we also do a lot of other fun things. We organize corporate relations activities, events, and recreational opportunities so that you can both build valuable connections for the future and enjoy your time outside of your studies. In total, we are eleven sabbatical officers, each responsible for different areas within the Union’s operations.\nA large part of the Union’s work is carried out by the guilds, which are sub-organizations of the Union. The guilds also run a wide range of activities, from educational advocacy and cafés to festivities, corporate relations, and much more. It may sound a bit overwhelming, especially when everything is already new. But in short, the Union exists to ensure that students at LTH have the best possible conditions during their studies, regardless of how they choose to get involved.\nYou will likely encounter us again in the future, at major joint events during the introduction, or during exam periods when we hand out breakfast.\nHave a wonderful introduction, and I hope to see you on campus!" + } + }, + { + "title":{ + "sv": "Nollegeneral", + "en": "Head of the Introduction" + }, + "name": { + "sv": "Norea Sjöberg", + "en": "Norea Sjöberg" + }, + "text": { + "sv": "Hejsan Nollan, och varmt välkommen till Nollningen 2026.\nMitt namn är Norea Sjöberg och jag har det ärofyllda uppdraget att vara årets Nollegeneral. Det innebär att jag under våren tillsammans med Nolleamiralen, Øverstarna och alla andra ansvariga på Teknologkårens sektioner har jobbat för att göra din första tid här på LTH så fantastisk som möjligt.\nNollningen bjuder på ett brett utbud av aktiviteter och för oss som anordnar den är det extra viktigt att du som Nolla vet att tanken inte är att du ska vara med på allt, tanken är snarare att där ska finnas något för alla. Ni ska ju ha tid för era studier också!\nVi här på Teknologkåren är otroligt stolta över att vår kår är en plats där man kan känna sig trygg, utvecklas och ha en bra studietid oavsett vem man är. Det innebär att du, som nybliven medlem, har ett ansvar för att se till att denna goda stämning upprätthålls. Visa respekt och omtanke för dina medstudenter och du kommer få tillbaka det tusenfallt.\nOm du har något du vill lyfta kring nollningen, undrar något eller bara är sugen på lite gött häng är det bara att komma fram och hugga tag i mig!\nÅterigen, välkommen till Lund, LTH och Teknologkåren och vi ses snart!", + "en": "Hello mentee, and a warm welcome to the Introduction 2026!\nMy name is Norea Sjöberg, and I have the honorable role of this year’s Head of the Introduction. This means that throughout this year, together with The Chief of Introductions, the Øverstar, and all the other responsible members of the sections within the Student Union, I’ve been working to make your first time here at LTH as amazing as possible.\nThe Introduction offers a wide range of activities, and for us who organize them, it’s especially important that you as a mentee know that the idea is not for you to attend everything. Rather, the goal is that there should be something for everyone. After all, you also need time for your studies!\nHere at the Student Union, we are incredibly proud that our union is a place where you can feel safe, grow, and have a great study experience regardless of who you are. This means that you, as a new member, have a responsibility to help maintain this positive atmosphere. Show respect and consideration for your fellow students, and you will receive it back a thousandfold.\nIf there’s anything you’d like to raise regarding the Introduction, if you have any questions, or if you just feel like hanging out, don’t hesitate to come up and talk to me!\nOnce again, welcome to Lund, LTH, and the Student Union! See you soon!" + } + }, + { + "title":{ + "sv": "NollU", + "en": "NollU" + }, + "name": { + "sv": "NollU", + "en": "NollU" + }, + "text": { + "sv": "Hejsan Nollan!\nVi är nollningsutskottet (NollU) på Teknologkåren; Nolleamiralen, Nollegeneralen, fyra Øverster och massa funktionärer. Vårt mål under det gångna året har varit att planera en så rolig och trygg mottagning som möjligt. Vi håller i event där du får uppleva och tävla i allt från ett sjøslag under Regattan till lådbilsrace på Nollelördagen – och allt detta medan du träffar en massa studenter från TLTH:s alla sektioner! Vi på NollU ser fram emot att få träffa dig och vi hoppas du får en fantastisk nollning!\nP.S. Följ oss på Instagram via @tlthnollning för att se vilken sektion som vinner kårens nollningsuppdrag!", + "en": "Hello Mentee!\nWe are the Introduction Committee (NollU) at Teknologkåren; the Chief of Introduction, the Head of Introduction, four Øverster, and a lot of volunteers. Our goal during the past year has been to plan as fun and safe an introduction as possible. We host events where you get to experience and compete in everything from a naval battle at the Regatta to a boxcar race on Nollelördagen – and all this while meeting a bunch of other students from all of TLTH's guilds! We at NollU are looking forward to meeting you, and we hope you have a fantastic introduction!\nP.S. Follow us on Instagram at @tlthnollning to see what guild wins the Union's introduction missions!" + } + } + ] +} \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/frame.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/frame.png new file mode 100644 index 00000000..3f02b4a1 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/frame.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/general_en.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/general_en.png new file mode 100644 index 00000000..0367c5fb Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/general_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/general_sv.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/general_sv.png new file mode 100644 index 00000000..8a005882 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/general_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/nollu.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/nollu.png new file mode 100644 index 00000000..cbbba2e5 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/nollu.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/officers_en.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/officers_en.png new file mode 100644 index 00000000..b5abb993 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/officers_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/officers_sv.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/officers_sv.png new file mode 100644 index 00000000..446c0113 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/officers_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/president_en.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/president_en.png new file mode 100644 index 00000000..00f9e9c3 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/president_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/president_sv.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/president_sv.png new file mode 100644 index 00000000..48999716 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/president_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/title_en.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/title_en.png new file mode 100644 index 00000000..a7bc610e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/title_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/faculty/title_sv.png b/assets/data/nollning_26/nolleguide/studentlife/faculty/title_sv.png new file mode 100644 index 00000000..051c8fb3 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/faculty/title_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/data_guild.json b/assets/data/nollning_26/nolleguide/studentlife/guild/data_guild.json new file mode 100644 index 00000000..b91f311a --- /dev/null +++ b/assets/data/nollning_26/nolleguide/studentlife/guild/data_guild.json @@ -0,0 +1,439 @@ +{ + "people": [ + { + "title":{ + "sv": "Överfös", + "en": "Head of the Introduction Committee" + }, + "name": { + "sv": "Elina Kazemi", + "en": "Elina Kazemi" + }, + "text": { + "sv": "Hej! Jag heter Elina och det är jag som är överföset på F-sektionen för årets nollning!! Detta innebär att det är jag som bär huvudansvaret för att göra er första tid vid vår Fantastiska sektion så underbar som möjligt. Jag, tillsammans med mina fantastiska Cofös vid namn Manne, Linnea, Alice, Harald, Ada och Edith utgör Föset. Sedan december har vi arbetat hårt med att planera årets nollning och lösa alla detaljer, stora som små, som man kan tänkas behöva när man ska leda uppemot 200 otroliga volontärer i sitt arbete och fösa in er nollor i studentlivet. Nollningen hade verkligen aldrig gått ihop utan alla volontärer som bidrar med sin tid och engagemang på olika sätt för ett gemensamt mål: att ge DIG det absolut bästa välkomnandet och start på din studietid genom en nollning på NY NIVÅ™.\nÅrets nollning tar oss iväg till en värld bortom vår egen. En värld som är färgsprakande, vid tillfällen glitchande eller pixelerad men framförallt fylld med side-quests. I detta episka universum kan man samla ihop sina poäng och levla upp till nya nivåer. Gör er redo för att träffa på de mest underliga av karaktärer, hitta på adrenalin inducerande galenskaper och skapa sig själv en grupp av människor att umgås med under din tid som student och kanske resten av ditt liv!\nAtt studera på vår Fenomenala sektion kommer med medgång såväl som motgång. Det gäller att man har någon vid sin sida som stöttar en när det blir tufft och firar när man lyckas. Framförallt är ett stort råd från mig att se till att njuta av eran studieperiod och våga utmana er själva, om det så är en post på sektionen, ett jobb pass på nation eller att vara med i ett spex. Stort som smått finns det något för dig i Lund, annars tveka inte att skapa en egen förening/klubb/grupp efter just ditt intresse. Vi vill se till att göra dina första veckor som student de absolut bästa för att du sedan ska kunna ta klivet in i studentlivet med storm!\nHäslningar,\nErt Överfös", + "en": "Hi! My name is Elina, and I’m the head of the Introduction Committee at the F-section for this year’s introduction!! This means I’m the one primarily responsible for making your first experience at our Fantastic section as wonderful as possible. Together with my amazing Cofös—Manne, Linnea, Alice, Harald, Ada, and Edith—we make up the Introduction Committee. Since December, we’ve been working hard to plan this year’s introduction and iron out all the details—big and small—that you might need when leading nearly 200 incredible volunteers in their work and welcoming you mentees into student life. The introduction would truly never have come together without all the volunteers who contribute their time and dedication in various ways toward a common goal: to give YOU the absolute best welcome and start to your time as a student through an introduction week at a NEW LEVEL™.\nThis year’s introduction takes us to a world beyond our own—a world that’s bursting with color, sometimes glitchy or pixelated, but above all filled with side quests. In this epic universe, you can collect points and level up to new stages. Get ready to meet the strangest of characters, come up with adrenaline-pumping antics, and build a group of friends to hang out with during your time as a student—and maybe even for the rest of your life!\nStudying at our Fenomenal section comes with both ups and downs. It’s important to have someone by your side who supports you when things get tough and celebrates with you when you succeed. Above all, my best advice is to make sure you enjoy your time as a student and dare to challenge yourselves—whether it’s taking on a role in your student section, working a shift at the student union, or participating in a student play. Big or small, there’s something for you in Lund; if not, don’t hesitate to start your own association, club, or group based on your specific interests. We want to make sure your first few weeks as a student are the absolute best so that you can then dive headfirst into student life!\nBest regards,\nYour Head of the Introduction Committee" + } + }, + { + "title":{ + "sv": "Cofös med bokföringsansvar", + "en": "Economy Cofös" + }, + "name": { + "sv": "Manne Mönster", + "en": "Manne Mönster" + }, + "text": { + "sv": "Halli hallå! Det är jag som är Cofös Manne och det är jag som ser till att allt kring nollningens ekonomi flyter på som den ska! Vi i föset planerar och arrangerar nollningen, en månad av skojigheter för att ni ska få en så bra och rolig första studietid som möjligt! Vårt arbete började redan innan jul och det är så roligt att nollningen äntligen är här:) I föset är mitt främsta ansvar all bokföring och att hålla ett öga på ekonomin för nollningen. Genom detta arbete har jag en del kontakt med andra sektionsmedlemmar, men främst våra kära extrafös och mina bästa föskollegor. Nog om det! Har du någon fundering så tveka inte på att komma fram och prata med mig. Ta hand om dig så hoppas jag att vi ses på ett nollningsevent eller i korridoren framöver!!", + "en": "Hello there! I am Cofös Manne and I am the one who makes sure that everything around the finances of the Introduction runs smoothly! We in the Introduction Committee plan and organize the Introduction, a month of fun events to make sure you have the best and most fun first time at the guild possible! My main responsibility in the Introduction committee is all the bookkeeping and keeping an eye on the finances for the Introduction. Through this work I have some contact with other members of the guild, but mainly our dear extrafös and my best colleagues<33 Enough about that! If you have any questions, do not hesitate to come and talk to me<3 Take care and I hope to see you at an event or in the corridor in the future!" + } + }, + { + "title":{ + "sv": "Cofös med informationsansvar", + "en": "Information Cofös" + }, + "name": { + "sv": "Alice Önnerheim", + "en": "Alice Önnerheim" + }, + "text": { + "sv": "Hejsan nollan! Det är jag, Cofös Alice, som du vid detta laget sett skicka ut massor med rolig och relevant information om vad det är som sker under nollningens låååånga och måååånga veckor. Jag är alltså informationsansvarig i Föset och med det tillkommer utöver att informera er även att se till att era faddrar är informerade, att med hjälp av Webbfösen se till att F-appen och hemsidan fungerar och i år har jag även ansvarat över Fashionfösen som sytt våra otroliga mantlar!!\nJag ser sååå mycket fram emot att spendera dessa veckorna tillsammans med er alla och trots att det ser ut som jag bits så gör jag (oftast) inte det så kom gärna fram och fråga mig om allt mellan himmel och jord!\nKram <3", + "en": "Hello mentee! It’s me, Cofös Alice, who by now you’ve seen sending out tons of fun and relevant info about what’s going on during the loooong and maaaany weeks of orientation. So, I’m in charge of everuthing information in the introduction committee, and in addition to keeping you all informed, I also make sure your mentors are up to date, use Webbfösen to ensure the F-app and website are working, and this year I’ve also been in charge of Fashionfösen, who sewed our incredible capes!!\nI’m sooo looking forward to spending these weeks with all of you, and even though it looks like i bite, I (usually) don’t, so please feel free to come up and ask me anything under the sun!\nHugs <3" + } + }, + { + "title":{ + "sv": "Cofös med sponsoringsansvar", + "en": "Sponsor Cofös" + }, + "name": { + "sv": "Harald Barck-Holst", + "en": "Harald Barck-Holst" + }, + "text": { + "sv": "Sup gamers! Det är jag som är Cofös Harald. Jag har avklarat 22 levlar i livet och går andra året på Pi-programmet. Mitt huvudansvar i Föset är all spons som sker under nollningen. Detta innebär att jag planerar samarbeten, håller kontakten med intresserade företag och organiserar sponsrade event. Allt för att du redan nu ska få tidig kontakt med näringslivet! Utöver detta ansvarar jag för Äventyrsuppdragen, Nollefilmen och Revyn. Nollningen är verkligen årets höjdpunkt och jag hoppas att ni är lika taggade som jag på att springa runt i våra fina overaller! Om ni undrar något är det bara att skriva på Mattermost eller stoppa mig i corridoren. Jag lovar, jag bits inte! Om ni ska ta med er något från denna text: Kom ihåg att ha kul!", + "en": "Sup gamers! My name is cofos Harald, I have cleared 22 levels in life, and I am currently in my second year of the Pi-programe. My main responsibility is all the sponsorships with different companies that occur during the Introduction. This means that I plan new partnerships, maintain contact with interested companies, and I am responsible for the sponsorship of events. The purpose is to get you into contact with your future employers as soon as possible. Other than that, I am responsible för the Adventure missions and help wherever I'm needed. The introduction is truly the highlight of my year, and I hope that you also look forward to running around in our orange overalls! If you ever have any questions, don't hesitate to write on Mattermost or grab me in the corridor! Remember! Life is not fun if you're not having fun, so have fun!" + } + }, + { + "title":{ + "sv": "Cofös med fadderansvar", + "en": "Mentors Cofös" + }, + "name": { + "sv": "Ada Parén", + "en": "Ada Parén" + }, + "text": { + "sv": "Heeeeej!!!!! Det är jag som är Cofös Ada! Jag har tillsammans med mina kollegor i Föset och våra underbara volontärer planerat nollningen! Det har varit många långa månader av hårt arbete (och mycket skratt) så det är SUPERKUL att det äntligen är dags för nollning!\nInom föset har jag varit ansvarig för faddrar. Det innebär bland annat att jag har planerat utbildningar, har möten med faddrar för att få höra mer om hur ni har det i era grupper, och alltid finns där när faddrarna behöver hjälp eller har frågor!\nJag ser jättemycket fram emot att få lära känna er alla, så kom gärna fram och säg hej!\nTillsammans tar vi nollningen till en ny nivå <3", + "en": "Heyyyyy!!!!! I am Cofös Ada! Together with my colleagues in the Introduction Committee and our wonderful volunteers, I’ve been planning the introduction period! It’s been many long months of hard work (and lots of fun), so it’s SO MUCH FUN that the introduction period is finally here!\nWithin the Introduction Committee, I’ve been in charge of mentors. That means, among other things, that I’ve planned educations, hold meetings with mentors to hear more about how things are going in your groups, and am always there when mentors need help or have questions!\nI’m really looking forward to getting to know all of you, so please come up and say hi!\nTogether, we’re taking the introduction period to a new level <3" + } + }, + { + "title":{ + "sv": "Cofös med designansvar", + "en": "Design Cofös" + }, + "name": { + "sv": "Edith Fållsten", + "en": "Edith Fållsten" + }, + "text": { + "sv": "Det är jag som är Cofös Edith (eller ∑-fös i vissa kretsar) och OJOJOJOJOJ vad glad jag är att just du äntligen är här! Under nollningen kommer du att stöta på oss i Föset (dvs vi i mantlar) på en hel massa event och aktiviteter som vi hoppas att du ska tycka är riktigt riktigt roliga och att du ska få möjligheten att skapa minnen för livet. <3\nI Föset är jag ansvarig för all design och de internationella studenterna. Det innebär att jag tillsammans med världens bästa grafikfös har designat märken, posters, outfits och app för att nollningen ska se så episk ut som möjligt. Det innebär också att jag har lite extra öga på alla de studenter som vi välkomnar från andra länder och den internationella nollningen!\nTa nu hand om dig, och tveka inte att komma fram och prata om du har någon fundering. Luta dig tillbaka och låt din studietid börja på en Ny Nivå!", + "en": "Hi bestie!\nIt’s me, Edith (or ∑-fös in some circles), and OH WOW am I SO happy that you’re finally here! During the introduction period, you’ll come across us in the introduction committee (that is, us in the cloaks) at a whole bunch of events and activities that we really hope you’ll find super fun, and that will give you the chance to create memories for life. <3\nIn the introduction committee, I’m responsible for all design as well as the international students. That means that together with the world’s best graphic design helpers, I’ve been cooking up badges, posters, outfits, and the app to make the introduction period look as epic as possible. It also means I help make sure that all the students we welcome from other countries are included and have a great experience during the international introduction!\nTake care of yourself, and don’t hesitate to come and talk if you have any questions about anything. Now lean back and let your student life begin on a New Level!" + } + }, + { + "title":{ + "sv": "Cofös med eventansvar", + "en": "Event Cofös" + }, + "name": { + "sv": "Linnea Becker", + "en": "Linnea Becker" + }, + "text": { + "sv": "Hejhej!\nDet är jag som är Cofös Linnea, och inom Föset är jag ansvarig för eventplaneringen. Det innebär att jag under året har pysslat med schemaläggning, bokningar och kontakt med utskott och de andra sektionerna på LTH. Helt enkelt logistiken kring alla skojsigheter som fyller schemat varje dag!\nJag är så taggad på att träffa er och på de superroliga veckor vi har framför oss. Ta hand om er, så tar vi oss tillsammans till en ny nivå<3", + "en": "Hi hi!\nI’m Cofös Linnea, and within Föset I’m responsible for event planning. That means that throughout the year I’ve been working with scheduling, bookings, and coordinating with committees and the other guilds at LTH. In short, I handle the logistics behind all the fun activities that fill the schedule every day!\nI’m so excited to meet you all and for the incredibly fun weeks ahead of us. Take care of yourselves, and together we’ll reach a whole new level<3" + } + }, + { + "title":{ + "sv": "Ordförande", + "en": "President" + }, + "name": { + "sv": "Algot Kullberg", + "en": "Algot Kullberg" + }, + "text": { + "sv": "Hej alla nollor och nudlar! Jag är ordförande Algot. Varmt välkomna till sektionen och LTH!\nNi har fantastiska år framför er, och jag hoppas verkligen att ni kommer att trivas här. Oavsett om ni väljer att engagera er i sektionen eller på annat håll vill jag verkligen slå ett slag för Lunds studentliv. Här finns allt från idrott, musik och mat till teknik, media, politik – och mycket mer. Jag är övertygad om att ni alla kan hitta ett sammanhang där ni trivs!\nVad är då min roll här på sektionen? Jag har det yttersta ansvaret för hela sektionen och dess verksamhet. Tillsammans med styrelsen och nämnden arbetar jag för att allt ska rulla på som det ska – både på kort och lång sikt. Utöver att finnas till hands för alla våra fantastiska funktionärer har jag också mycket kontakt med de andra verksamheterna i Mattehuset och med sektionsordföranden på övriga sektioner här på LTH.\nDet viktigaste jag vill att ni tar med er är att det löser sig! I början är det mycket som är nytt och lite rörigt – boende, vänner, studier – men sådant brukar falla på plats efter ett tag. En omtenta är inte hela världen, och många av oss har haft lite konstiga boendesituationer under någon period. Har ni några frågor, stora som små, är ni alltid välkomna att hugga tag i mig i korridoren eller skriva till mig på Mattermost. Jag älskar problem!\nTa hand om er och njut av nollningen!", + "en": "Hello all freshmen and fruits! I’m President Algot. A warm welcome to the guild and to LTH!\nYou have some fantastic years ahead of you, and I truly hope you’ll enjoy your time here.\nWhether you choose to get involved in the guild or elsewhere, I really want to highlight student life in Lund. There’s everything from sports, music, and food to technology, media, politics—and much more. I’m convinced that all of you can find a community where you feel at home!\nSo, what is my role here in the guild? I hold the overall responsibility for the entire guild and its activities. Together with the board and committees, I work to make sure everything runs as it should—both in the short and long term. In addition to being available for all our amazing volunteers, I’m also in close contact with other organizations in the Mathematics Building and with the presidents of other guilds here at LTH.\nThe most important thing I want you to take with you is that everything will work out! At the beginning, a lot of things are new and a bit chaotic—housing, friends, studies—but these things usually fall into place after a while. Failing an exam isn’t the end of the world, and many of us have had some unusual living situations at times. If you have any questions, big or small, you’re always welcome to grab me in the corridor or message me on Mattermost. I love problems!\nEnjoy!" + } + }, + { + "title": { + "sv": "Vice Ordförande", + "en": "Vice President" + }, + "name": { + "sv": "Alma Holmgren", + "en": "Alma Holmgren" + }, + "text": { + "sv": "Hejsan nollan\nMitt namn är Alma, och jag sitter som vice ordförande här på F-sektionen. Mitt främsta uppdrag är att vara ordförande Algots högra hand, och tillsammans utgör vi det som kallas presidiet.\nSom vice har jag många olika ansvarsområden. Förutom att sammarbeta med Algot i våra ålliganden i presidiet, sitter jag som ledamot i styrelsen och jobbar för sektionens långsiktiga och visionära arbete. Som Vice leder jag vår nämnd (alla sektionens utskottsorföranden) och ser till att de känner sig hörda och inkluderade inför styrelsens diskussioner och beslut. Sedan hjälper jag medlemmar med att starta upp de projekt och abreten de är taggade på.\nNi kommer säker se mig studsa mellan min pluggplats och ledningscentralen och om har du några frågor om sektionen eller är taggad på att sätta en idé till liv så får du mer än gärna stoppa mig för att snacka!\nNjut nu av nollningen och allt som Lund har att erbjuda, så hoppas jag att vi ses!", + "en": "My name is Alma, and I am the Vice President here at the F-guild. My primary role is to be President Algot’s right-hand person, and together we make up what is known as the Presidency (Presidiet).\nAs Vice President, I have many different responsibilities. In addition to collaborating with Algot on our presidential duties, I sit as a member of the Board, working on the section’s long-term goals and visionary work. As Vice, I also lead our Council (all the section’s committee chairs) and ensure they feel heard and included ahead of the Board's discussions and decisions. Furthermore, I help members launch the projects and initiatives they are excited about.\nYou will likely see me bouncing between my study spot and the board/council-room (Ledningscentralen). If you have any questions about the section or are eager to bring an idea to life, please feel free to stop me for a chat!\nEnjoy the Nollning and everything Lund has to offer, I hope to see you around!" + } + }, + { + "title": { + "sv": "Styrelsepreses", + "en": "Chair of the Board" + }, + "name": { + "sv": "Albin Torpel", + "en": "Albin Torpel" + }, + "text": { + "sv": "Tjenare! Jag heter Albin, och jag är styrelsepreses här på sektionen. Det är jag som planerar och leder arbetet i styrelsen, så att resten av styrelsen kan fokusera på sitt arbete och så att vi får saker gjorda i tid. Jag sammankallar till och leder även styrelsemötena, som hålls regelbundet i vår lokal Ledningscentralen. Dessa möten är öppna för alla medlemmar på F-sektionen, och det är där styrelsen behandlar motioner som skickats in av sektionsmedlemmar.\nOm ni har några funderingar på hur sektionen fungerar, vad styrelsen håller på med, undrar över ett beslut vi har tagit eller gärna vill förändra något på sektionen, så är det bara att kontakta mig! Ni når mig lättast preses@fsektionen.se eller genom att skriva till mig på Mattermost. Jag hoppas ni kommer att trivas här på sektionen!", + "en": "Hi there! I am Albin, and I am the Chair of the Board here at the guild.\nIt is my job to plan and lead the work of The Board, so that the rest of The Board can focus on their tasks and ensure we get things done on time. I also convene and lead the board meetings, which are held regularly in our facility, The Land of Management And Operatives (LMAO). These meetings are open to all members of the F-guild, and it is where The Board processes motions submitted by guild members.\nIf you have any thoughts on how the guild works, what The Board is up to, have questions about a decision we have made, or would like to change something within the guild, please just contact me! You can reach me most easily at preses@fsektionen.se or by writing to me on Mattermost. I hope you will enjoy your time here at the guild!" + } + }, + { + "title": { + "sv": "Ledamöter", + "en": "Board members" + }, + "name": { + "sv": "Alicia, Alva, Jacob och Nina", + "en": "Alicia, Alva, Jacob and Nina" + }, + "text": { + "sv": "Tjenixen!\nVi heter Alicia, Alva, Jacob och Nina och vi är styrelseledamöter!\nSom styrelseledamot sitter man i styrelsen och är med och styr sektionens övergripande strategiska arbete. Detta innebär att vi bland annat håller koll på sektionens ekonomi, beslutar om saker på styrelsemöten, hjälper de andra utskotten om de skulle fundera över nåt och jobbar med mer långsiktiga frågor för sektionen. Styrelseledamotposten är ganska flexibel och det finns stor frihet i att själv driva egna frågor om saker man tycker är kul eller bör förbättras. Kom gärna till någon av oss om ni har tankar eller frågor om sektionens verksamhet.\nHoppas vi ses på något av höstens styrelsemöten, vi bjuder på fika!", + "en": "Hi there! We are Alicia, Alva, Jacob, and Nina and we are Board members!\nAs a Board member, you sit on The Board and take part in steering the guild's overall strategic work. This means that we, among other things, keep track of the guild's finances, make decisions at board meetings, help the other committees if they have questions, and work on more long-term issues for the guild. The Board member position is quite flexible, and there is great freedom to personally drive your own questions about things you find fun or that should be improved. Please come to any of us if you have thoughts or questions about the guild's operations.\nHope to see you at one of the autumn board meetings; we provide snacks!" + } + }, + { + "title": { + "sv": "Utbildningsminister", + "en": "Minister of Education" + }, + "name": { + "sv": "Mattis Mattson", + "en": "Mattis Mattson" + }, + "text": { + "sv": "Hej! Jag heter Mattis Mattsson och är utbildningsminister på F-sektionen. Det betyder att jag leder studierådet – en grupp engagerade studenter som jobbar för att göra utbildningen och studiemiljön bättre för alla på sektionen. Jag sitter också i ledningen och har ansvar för kontakten mellan studierådet, ledningen och de andra utskotten. Dessutom samarbetar jag med andra sektioners utbildningsbevakare för att vi tillsammans ska kunna driva viktiga frågor på hela LTH.\nUtöver det är jag även studerandeskyddsombud. Det innebär att du kan vända dig till mig om du upplever att något känns fel eller obekvämt i din studiemiljö. Det kan handla om att en lärare beter sig olämpligt, att du blivit orättvist behandlad, eller om andra studenter utsätter dig för något, som till exempel grupparbeten, seminarier eller labbar. Jag har tystnadsplikt enligt lag, så du kan alltid prata med mig i förtroende.\nOavsett om någon har en åsikt om en kurs, behöver hjälp med något som känns jobbigt, eller bara är nyfiken på vad utbildningsbevakning är så går det alltid att höra av sig! Jag finns här för alla studenter och svarar gärna på frågor eller bara lyssnar.", + "en": "Hi! My name is Mattis Mattsson, and I’m the Minister of Education for the F-section. That means I lead the Student Council—a group of dedicated students who work to improve the educational programs and the learning environment for everyone in the section. I’m also on the executive board and am responsible for coordinating between the Student Council, the executive board, and the other committees. In addition, I collaborate with education representatives from other sections so that together we can advocate for important issues across the entire LTH.\nIn addition, I’m also the student safety representative. This means you can turn to me if you feel that something is wrong or uncomfortable in your learning environment. This could involve a professor behaving inappropriately, you being treated unfairly, or other students subjecting you to something—such as group work, seminars, or labs. I am bound by a legal duty of confidentiality, so you can always talk to me in confidence.\nWhether you have an opinion about a course, need help with something that feels difficult, or are just curious about what educational oversight entails, feel free to reach out anytime! I’m here for all students and am happy to answer questions or just listen" + + } + }, + { + "title": { + "sv": "Sexmästare", + "en": "Head of the Festivities Committee" + }, + "name": { + "sv": "Emmie Andersson", + "en": "Emmie Andersson" + }, + "text": { + "sv": "Tjena! Jag heter Emmie Andersson och är sexmästare här på F! Som sexmästare är jag utskottsordförande för sexmästeriet, ett utskott som håller i sittningar, pubar och dansgolv för alla på sektionen!\nBredvid mig har jag vice sexmästare Marcus Jacobsson! Han fokuserar mycket på den interna sammanhållningen i utskottet samt utför en stor del av det ekonomiska arbetet. Utöver oss finns det sex andra mästare: två pubmästare, två köksmästare och två hofmästare. Tillsammans planerar vi evenemang och ser till att alla utskottets funktionärer har det bra!\nI utskottet finns även en DJ, tre sångförmän och massa sexetjobbare! Sångförmännen är de som står för underhållningen på sittningar, medan DJ:n fixar musiken till dansgolvet. Sexetjobbarna är de som står och svarvar drinkar i baren, hackar lök i köket, dekorerar lokalen och serverar all mat.\nNär vi inte håller i sittningar eller pubar, så ses vi i sexmästeriet även ofta för interna event så som cykelfester, kickoffs eller bara allmänt gött häng! Efter varje avslutad sittning så har vi också en traditionsenlig eftersexa tillsammans för att fira en (förhoppningsvis) lyckad sittning!\nAtt vara med i sexmästeriet är helt enkelt superkul! Det är ett härligt sätt att vara engagerad där vi både kan ha kul tillsammans inom utskottet och sprida glädje till våra medstudenter genom olika events och aktiviteter. Det är en chans att vara kreativ, träffa många nya vänner och bidra till en härlig och inkluderande studentmiljö!", + "en": "Hi! My name is Emmie Andersson, and I am the Head of the Festivities Committee here at F! As Head, I chair the committee responsible for organizing formal dinners, pubs, and dance floors for everyone in the section.\nNext to me is our Deputy Head of Festivities, Marcus Jacobsson! He focuses a lot on internal cohesion within the committee and handles a large portion of the financial work. In addition to us, there are six other coordinators: two Pub managers, two Head chefs, and two Head waiters. Together, we plan events and make sure that all committee members are doing well!\nThe committee also includes a DJ, three Toastmasters and lots of Sex(y)workers! The Toastmasters are responsible for the entertainment during formal dinners, while the DJ takes care of the music for the dance floor. The sex(y)workers are the ones mixing drinks at the bar, chopping onions in the kitchen, decorating the venue, and serving all the food.\nWhen we’re not organizing dinners or pubs, we often get together for internal events such as bike parties, kickoffs, or just hanging out. After every formal dinner, we also have a traditional “afterparty” together to celebrate a (hopefully) successful event!\nBeing part of the social committee is simply a lot of fun! It’s a great way to get involved—we have fun together within the committee while also spreading joy to our fellow students through various events and activities. It’s a chance to be creative, meet lots of new friends, and contribute to a fun and inclusive student environment!" + } + }, + { + "title": { + "sv": "Krögare", + "en": "Chief Executive Tavern Director" + }, + "name": { + "sv": "Hugo Klaesson", + "en": "Hugo Klaesson" + }, + "text": { + "sv": "Tjena! Mitt namn är Hugo Klaesson och jag är krögare på vår kära F-sektion! Som krögare arbetar jag som utskottsordförande för Krögeriet, ett utskott som stöttar andra delar av sektionen med att arrangera alkoholevent. Till exempel hjälper vi näringslivsutskottet FNU med en alumnipub eller FARAD med deras bal!\nI utskottet har vi även en grupp bartenders som arbetar tillsammans med mig. Våra arbetsuppgifter går ut på att både stötta utskotten i deras planering och att på eventen arbeta som serveringsansvariga. Eventen varierar mycket, och genom året får vi möjligheten att arbeta med många olika människor och typer av arrangemang!\nFörutom de event där vi stöttar andra utskott har vi även möjlighet att arrangera egna event samt samarbetevent med andra utskott, där vi hjälps åt med planeringen och arbetar tillsammans. Till dessa event har vi våra otroliga puffare som kommer och jobbar med oss!\nSom puffare går man med i vår puffarpool och blir tillfrågad att hjälpa till vid de event där vi behöver extra händer. Det är en möjlighet att testa på att arbeta i kök, bakom baren eller med något helt annat som våra utskott hittar på. Det blir mysigt häng, god stämning och en chans att engagera sig lite extra utan att ta på sig en helårspost!\nAtt vara med i Krögeriet, antingen som puffare, bartender eller krögare, är otroligt kul! Vi har ett jättemysigt gäng, man får utbildning i allt man behöver veta och möjlighet att testa på något helt nytt. Vi har en väldigt härlig kultur med massor av interna event och ett enormt kreativt utrymme!", + "en": "Hi! My name is Hugo Klaesson, and I am the Chief Executive Tavern Director of our beloved F-guild!\nAs Chief Executive Tavern Director, I serve as the committee chair of the Tavern Committee, a committee that supports other parts of the section in organizing events involving alcohol service. For example, we help the Industry Relations Committee (FNU) with alumni pub nights or FARAD with their annual ball!\nWithin the committee, we also have a group of Tavern Operations Specialists who work alongside me. Our responsibilities include supporting other committees in their event planning and serving as responsible managers for food and beverage service during events. The events vary greatly, and throughout the year we get the opportunity to work with many different people and a wide range of arrangements!\nIn addition to the events where we support other committees, we also have the opportunity to organize our own events and collaborative events with other committees, where we share the planning responsibilities and work together. For these events, we are joined by our amazing volunteers, puffare, who come and work alongside us!\nAs a volunteer, you join our volunteer pool and are invited to help out at events whenever we need extra hands. It is a great opportunity to try working in the kitchen, behind the bar, or with whatever other creative activities our committees come up with. Expect a friendly atmosphere, great company, and a chance to get involved without committing to a full-year position!\nBeing part of the Tavern Committee, whether as a volunteer, Tavern Operations Specialist, or Chief Executive Tavern Director, is incredibly rewarding. We have a fantastic and welcoming group, provide training in everything you need to know, and offer the chance to try something completely new. We have a wonderful culture with plenty of internal events and an enormous amount of room for creativity!" + } + }, + { + "title": { + "sv": "Jubelsdespot", + "en": "Jubilee Despot" + }, + "name": { + "sv": "Jacob Stelling", + "en": "Jacob Stelling" + }, + "text": { + "sv": "Hej! Jag heter Jacob och är Jubeldespot här på F-sektionen. I år fyller sektionen nämligen hela 65 år och det är förstås något som måste firas ordentligt! Som Jubeldespot har jag tillsammans med den fantastiska Jubileumskommitén äran att få arrangera detta.\nSå håll utkik, den 30 november drar Jubileumsveckorna igång, och de avslutas med en majestätisk bal den 10 december.\nVi ses där!", + "en": "Hi! My name is Jacob and I’m the Jubilee Despot here in the F guild. This year, the guild is turning a whopping 65, and that’s obviously something that needs to be celebrated in style! As Jubilee despot, I have the honour of organising this, together with the fantastic Jubilee Committee.\nSo keep an eye out - the Anniversary Weeks kick off on 30 November and will culminate in a magnificent ball on 10 December.\nSee you there!" + } + }, + { + "title": { + "sv": "Sekreterare", + "en": "Secretary" + }, + "name": { + "sv": "Victor Liedberg", + "en": "Victor Liedberg" + }, + "text": { + "sv": "Hello gamers! Jag heter Victor och är sekreterare på F-sektionen. Som sekreterare är mitt jobb att protokollföra alla sektionsmöten och styrelsemöten. Jag sitter även med i styrelsen som jobbar strategiskt (alltså inte hands-on) med frågor som rör hela sektionen. Mer om styrelsearbetet kan ni läsa vid styrelseledamöterna! Förutom att sitta som sekreterare i styrelsen är jag även utskottsordförande för utskottet Sekret Service!\nSekret Service innefattar ett gäng poster som har med styrelsens och sekreterarens verksamhet, bland annat sektionsmötesordförande som leder sektionsmöten och arbetar fram en plan tillsammans med styrelsen om hur dessa möten ska gå till. Även har vi representant i TLTHs valnämnd, som är med i valprocessen inom Teknologkåren, och SaFT-blandare, som är ansvariga för att arrangera att landets F-sektioner träffas varje termin någonstans i landet. Sist, men definitivt inte minst, har vi LaBamba, ett team som ansvarar för att lösa mat till intervjuer och sektionsmötet.\nSekreterare handlar mycket om att skriva ner och dokumentera allt viktigt som sägs på såväl sektionsmöten som styrelsemöten, men det absolut roligaste tycker jag är att få vara en del av styrelsen och tycka till om hur man underlättar arbetet för alla andra på sektionen!", + "en": "Hello gamers! My name is Victor, and I’m the secretary of the F-guild. As secretary, my job is to take notes at all guild meetings and board meetings. I’m also a member of the board, which works strategically (i.e., not hands-on) on issues affecting the entire guild. You can read more about the board’s work under “Board Members”! In addition to serving as secretary on the board, I’m also the chair of the Sekret Service filial!\nSekret Service encompasses a number of roles related to the board’s and secretary’s activities, including the guild meeting chair, who leads guild meetings and works with the board to develop a plan for how these meetings should be conducted. We also have a representative on TLTH’s Election Committee, which is involved in the election process within the Student Union of Engineering, and the SaFT Organizers, who are responsible for arranging for the country’s F-guilds to meet somewhere in the country every semester. Last, but definitely not least, we have LaBamba, a team responsible for providing food for interviews and guild meetings.\nBeing a secretary involves a lot of writing down and documenting everything important that is said at both guild meetings and board meetings, but what I enjoy most is being part of the board and having a say in how we can make the work easier for everyone else in the guild!" + } + }, + { + "title": { + "sv": "Sanningsminister", + "en": "Minister of Truth" + }, + "name": { + "sv": "Maria Davidsson", + "en": "Maria Davidsson" + }, + "text": { + "sv": "Yoo, storasyster här, eller mer officiellt Sanningsminister! Maria Davidsson heter jag egentligen, går i F24, och är ordförande för utskottet sanningsministeriet.\nSom ny studen tar det lite tid att komma in i lingot och många äldre studenter glömmer bort detta. Termer slängs runt hit och dit och man fattar inget. Kortfattat så är F-sektionen helheten, organisationen som du bjuds in till med en massa evenemang och händelser. Nollningen som ni deltar i nu är en del av sektionens verksamhet som drivs av vårat nollningsutskott Föset. Men sektionen gör såå mycket mer, och det är där mitt utskott, Sanningsministeriet, och alla andra utskott kommer in i bilden!\nSanningsministeriet är ett utskott fokuserat på design, information och kommunikation. För detta ändamål har vi sanningsspridare (sköter grafisk design), spindelmän (sköter hemsidan och F-appen), sektionsfotografer (fotograferar och redigerar bilder), filmförmän (spelar in och redigerar filmer), arkivarier (sköter sektionens arkiv), sanningsagenter (sköter sektionens sociala medier) och von-Tänen redaktionen som ger ut tidningen von Tänen en gång varje läsperiod.\nSom Sanningsminister leder jag detta utskott på drygt 45 funktionärer (och medstudenter), representerar det i sektionens nämnd (samling av utskottsordförande och styrelserepresentanter) samt är allmänt informationsansvarig för sektionen.\nFör att få koll på vad som händer på sektionen bör du nu:\n- Bekanta dig med hemsidan/Fappen och Mattermost (glöm inte sätta på notiser!!!)\n- Följa F-sektionen på instagram @fsektionen, TikTok @fsektionen och gilla facebook-sidan F-sektionen inom TLTH\nStorasyster ser dig", + "en": "Hey, big sister here—or, more officially, Minister of Truth! My real name is Maria Davidsson; I’m in F24, and I’m the president of the Ministry of Truth.\nAs a new student, it takes a little time to get the hang of things, and many older students forget this. Terms are thrown around left and right, and you don’t understand a thing. In short, the F-section is the whole package—the organization that invites you to a ton of events and activities. The orientation you’re participating in now is part of the section’s activities, run by our introduction committee, Föset. But the section does so much more, and that’s where my committee, the Ministry of Truth, and all the other committees come into the picture!\nThe Ministry of Truth is a committee focused on design, information, and communication. To this end, we have Truth Spreaders (who handle graphic design), Spiders (who manage the website and the F-app), Section Photographers (who take and edit photos), Film Foremen (who record and edit videos), Archivists (who manage the section’s archives), truth agents (who manage the section’s social media), and the von Tänen editorial team, which publishes the magazine von Tänen once per semester.\nAs Minister of Truth, I lead this committee of over 45 officers (and fellow students), represent it in the section’s council (a gathering of committee chairs and board representatives), and serve as the section’s general information officer.\nTo stay up to date on what’s happening in the section, you should now:\n- Get familiar with the website/F-app and Mattermost (don’t forget to turn on notifications!!!)\n- Follow the F-section on Instagram @fsektionen, TikTok @fsektionen, and like the Facebook page F-sektionen inom TLTH\nBig Sister is watching you" + } + }, + { + "title": { + "sv": "Spindelförman", + "en": "Spidermaster" + }, + "name": { + "sv": "Felix Hellborg", + "en": "Felix Hellborg" + }, + "text": { + "sv": "Hej och välkommen till appen! Jag heter Felix Hellborg och är årets spindelförman på sektionen; så om något går snett digitalt är det mitt nät du hamnar i.\nVi i spindelmännen är en del av utskottet Sanningsministeriet och vårt huvuduppdrag är att spinna upp de digitala tjänster som används på sektionen, däribland hemsidan och F-appen du använder just nu. Vi håller även sektionens Mattermost vid liv (sätt på notiser så missar du ingenting! Vi lovar att inte spamma... för mycket) och ser till att sektionens digitala verktyg inte trasslar ihop sig.\nSom spindelförman ansvarar jag för sektionens spindelnät, internät och nätfiske. Jag representerar också spindelmännen i nämnden och hjälper andra utskott att inte fastna i nätet.\nHar du problem med att anmäla dig till event, tycker hemsidan ser ut som om den designades i mörkret, eller har Mattermost bestämt sig för att ta en oplanerad semester? Då är det oss du ska kontakta! Skicka ett mejl till spindelman@fsektionen.se så reder vi ut härvan.\nMen först och främst, se till att skaffa konto på hemsidan/appen och på Mattermost så att du kan anmäla dig till event och hänga med i allt roligt som händer. Vi ses i nätet!", + "en": "Hi and welcome to the app! My name is Felix Hellborg and I'm this year's Spidermaster at the guild, so if anything goes haywire digitally, I'm the one pulling the strings.\nThe Spidermen are part of the Ministry of Truth, and our main mission is to spin up the digital services used at the guild, including the website and the F-app you're using right now. We also keep the guild's Mattermost alive (turn on notifications so you don't miss anything! We promise not to spam... too much) and make sure the guild's digital tools don't get tangled up.\nAs Spidermaster, I oversee everything from web development to catching bugs – it's what spiders do best. I also represent the Spidermen on the board and help other committees find their footing on the digital web.\nHaving trouble signing up for events, think the website looks like it was designed in the dark, or has Mattermost decided to take an unscheduled vacation? That's where we come in! Send an email to spindelman@fsektionen.se and we'll untangle the mess.\nBut first things first, make sure you set up an account on the website/app and on Mattermost so you can sign up for events and stay in the loop. See you on the web!" + } + }, + { + "title": { + "sv": "Samvetsmästare", + "en": "Master of Conscience" + }, + "name": { + "sv": "Linnea Lundevall", + "en": "Linnea Lundevall" + }, + "text": { + "sv": "Hejsan!\nMitt namn är Linnea Lundevall, jag går Pi24 och är Samvetsmästare på sektionen. Min roll innebär dels att leda utskottet Samvetet, vilket inkluderar delutskotten Likabehandlingsutskottet (LiBU) och Hållbarhetssamordnarna. Vidare är jag ansvarig för att främja jämställdhets- och hållbarhetsarbete inom sektionen. Jag representerar också Samvetet i ledningen, som består av alla utskottsordföranden och styrelsen.\nLiBU leder jag tillsammans med sektionens Likabehandlingsordförande (LiBO) Viggo, så när det gäller just likabehandling har han stenkoll! När man flyttar hemifrån och börjar universitetet är det inte ovanligt att känna sig osäker eller ensam. Att skapa en välkomnande och trygg miljö är något Viggo och LiBU arbetar mycket med, tillsammans med en mängd andra likabehandlingsrelaterade ämnen. Allt detta gör de parallellt med att planera in roliga och intressanta aktiviteter!\nDet andra delutskottet, Hållbarhetssamordnarna, arbetar utifrån sektionens hållbarhetspolicy och strävar efter att göra sektionen mer miljömässigt och socialt hållbar. Detta gör de bland annat genom att hjälpa sektionens alla utskott att sköta sitt normala arbete på ett lite mer hållbart sätt. Såklart anordnar även Hållbarhetssamordnarna lärorika event och lunchföreläsningar!\nNu till mina viktigaste åligganden som Samvetsmästare: studerandeskyddsombud och likabehandlingsombud. Samvetsmästaren bär huvudansvar för personärenden på sektionen, vilket betyder att om det är något du behöver prata om kan du vända dig till mig. Oavsett om det handlar om ensamhet, nedstämdhet, någon form av diskriminering, ångest, en vän du är orolig för, ventilering eller om du vill dela med dig av något kul finns jag alltid tillgänglig för att lyssna. Jag är ingen kurator eller psykolog, men jag kan lyssna och hjälpa dig hitta de resurser du behöver. Ordförande Algot, LiBO Viggo och jag agerar konfidentiellt, så ni kan alltid tala med dem också om det känns bättre! Jag vet att de gärna lyssnar.\nDet är en stor livsförändring som ligger framför er, mycket som händer samtidigt. Att lära sig balansera ett helt nytt socialt liv med er utbildning kan vara väldigt svårt, det är du inte ensam i. Du ska aldrig tveka att höra av dig, jag vill inget hellre än att lyssna och förhoppningsvis hjälpa till. Om du är i behov av pedagogiskt stöd, för exempelvis funktionsnedsättningar, kan jag hjälpa dig med det också.\nUnder nollningen i år är jag fadder också, så om ni ser mig kom gärna och prata! Ni känner igen mig på min blåa tofs i teknologmössan.\nJag ser så mycket fram emot att träffa er och hoppas att ni ska få det kul här i Lund och på sektionen!", + "en": "Hello!\nMy name is Linnea Lundevall, I am a student in Pi24, and I am the Master of Conscience (Samvetsmästare) at the guild. My role involves leading the Committee of Conscience (Samvetet), which includes the sub-committees the Committee for Student Equality (LiBU) and the Sustainability Coordinators. Furthermore, I am responsible for encouraging equality and sustainability work within the guild. I also represent the Committee of Conscience in the Management (Ledningen), which consists of all committee presidents and the Board.\nI lead LiBU together with the guild’s President of the Committee for Student Equality (LiBO) Viggo, so when it comes to equality, he is the expert! When moving away from home to start university, it is not uncommon to feel uncertain or lonely. Creating a welcoming and safe environment is something Viggo and LiBU work on extensively, along with many other equality-related topics. They do all of this while simultaneously planning fun and interesting activities!\nThe other sub-committee, the Sustainability Coordinators, works based on the guild’s sustainability policy and strives to make the section more environmentally and socially sustainable. They do this, among other things, by helping all the guild’s committees carry out their regular work in a more sustainable way. Of course, the Sustainability Coordinators also organize educational events and lunch lectures!\nNow for my most important duties as Master of Conscience: Student Safety Representative and Equal Treatment Representative. The Master of Conscience bears the primary responsibility for personal matters within the section, which means that if there is anything you need to talk about, you can turn to me. Whether it’s about loneliness, feeling low, any form of discrimination, anxiety, a friend you are worried about, just needing to vent, or if you want to share something happy I am always available to listen. I am not a counselor or psychologist, but I can listen and help you find the resources you need. Our President of the Board Algot, LiBO Viggo, and I all act with confidentiality, so you can always speak with them as well if that feels better! I know they are more than happy to listen.\nYou have a major life change ahead of you, with many things happening at once. Learning to balance a brand-new social life with your education can be very difficult, you are not alone in that. You should never hesitate to reach out, there is nothing I want more than to listen and hopefully help. If you are in need of study support, for example due to a disability, I can help you with that as well.\nDuring this year’s introduction (the nollning), I am also a mentor, so if you see me, don’t hesitate to come and say hi! You can recognize me by the blue tassel on my student hat.\nI am looking forward to meeting you all, and I hope you will have a great time here in Lund and at the guild!" + } + }, + { + "title": { + "sv": "Likabehandlingsordförande", + "en": "President of the Committee for Student Equality" + }, + "name": { + "sv": "Viggo Broman", + "en": "Viggo Broman" + }, + "text": { + "sv": "Tjololo! Mitt namn är Viggo Broman, jag går π24 och är likabehandlingsordförande (LiBO) på sektionen. Min roll innebär att leda likabehandlingsutskottet (LiBU) tillsammans med vår samvetsmästare Linnea. Jag och Linnea representerar även sektionen i TLTHs likabehandlingskollegie där vi diskuterar och samarbetar med andra sektioners representanter inom likabehandlingsfrågor och evenemang.\nJag kommer ursprungligen från Skellefteå och flyttade hit till Lund helt utan att känna någon person någonstans i närheten, så jag vet hur det kan kännas att flytta hemifrån och känna sig totalt ensam. Det är där jag lägger stort fokus på det jag arbetar med, att skapa en välkomnande och trygg miljö på vår sektion. Tillsammans med våra fantastiska ledamöter i LiBU anordnar vi även roliga och inkluderande aktiviteter för alla sektionens medlemmar!\nUtöver mitt arbete inom utskottet har jag även ett annat viktigt åliggande som ligger mig nära hjärtat, att vara likabehandlingsombud. Det innebär att jag är en trygg punkt för dig på sektionen. Oavsett vad du bär på, om du känner dig ensam, nedstämd, upplever diskriminering, känner ångest eller oroar dig för en vän så kan du alltid vända dig till mig. Jag finns också här om du bara behöver ventilera eller vill dela med dig av något roligt! Jag är varken kurator eller psykolog, men jag kan alltid erbjuda ett lyssnande öra och hjälpa dig vidare till rätt resurser om du skulle behöva det. Utöver mig kan du alltid vända dig till vår ordförande Algot eller vår samvetsmästare Linnea. Vi tre agerar konfidentiellt, så allt du delar stannar mellan oss om så önskas.\nAtt börja plugga är en stor omställning och det är mycket nytt som ska falla på plats. Det kan vara en utmaning att hitta balansen mellan studier och studentliv, men kom ihåg att du inte är ensam i det. Tveka aldrig att höra av dig till mig om du behöver prata.\nSer verkligen fram emot att få träffa er och hoppas ni får en alldeles underbar tid här i Lund och på sektionen! <3", + "en": "Hello! My name is Viggo Broman, I'm in π24, and I am the President of the Committee for Student Equality (LiBO) at the guild. My role involves leading the Committee for Student Equality (LiBU) together with our Master of Conscience Linnea. Linnea and I also represent the guild in TLTH's College of Equality Opportunities, where we discuss and collaborate with representatives from other guilds on equal treatment issues and events.\nI am originally from Skellefteå and moved here to Lund without knowing a single person anywhere nearby, so I know exactly what it can feel like to move away from home and feel completely alone. That is where I put much focus on my work: to create a welcoming and safe environment at our guild. Together with our fantastic committee members in LiBU, we also organize fun and inclusive activities for all the members of the guild!\nIn addition to my work in the Committee, I also have another important role that is very close to my heart: being an Equal Opportunities Representative. This means that I am a safe point of contact for you within the guild. No matter what is on your mind, whether you are feeling lonely, feeling down, experiencing discrimination, dealing with anxiety or worrying about a friend you can always turn to me. I am also here if you just need to vent or want to share something fun! I am neither a counselor nor a psychologist, but I can always offer a listening ear and help guide you to the right resources if you need them. Besides me, you can always reach out to our President Algot or our Master of Conscience Linnea. The three of us are bound by confidentiality, so everything you share stays between us for as long as you wish.\nStarting university is a huge transition and there are a lot of new things to figure out. Finding the balance between studies and student life can be a challenge, but remember that you are not alone in this. Never hesitate to reach out to me if you need to talk.\nI am really looking forward to meeting you all, and I hope you have an absolutely wonderful time here in Lund and at the guild! <3" + } + }, + { + "title": { + "sv": "Prylmästare", + "en": "Head of Facilities and Logistic" + }, + "name": { + "sv": "Erik Mällroth Franzen", + "en": "Erik Mällroth Franzen" + }, + "text": { + "sv": "Hejsan Nollan! Jag heter Erik och jag är Prylmästare!\nPrylmästaren är utskottsordförande för Prylmästeriet som består av ett härligt gäng fixare, merch ansvariga och bilförmån. Vi ansvarar för sektionens verktyg, sektionens bil F-älgen, LTH:s coolaste merch,skåpsuthyrning. En del övrig utrustning och våra sektionslokaler.\nDu kommer antagligen se oss en del under nollningen — ofta med orangea hängslen på ovven — när vi hjälper uppdragsgrupper på bygg kvällarna och när vi säljer merch.\nSkulle du få punka på cykeln, frukta ej! Det finns verktyg att låna, och vi anordnar cykelfixardagar några gånger per termin där du kan få hjälp av våra otroliga fixare. Behöver du plötsligt låna en slagborr, ingenfara! Vi lånar ut verktyg som ni kan ta hem. Visste du även att du kan hyra sektionens soundboxar? Vi hjälper gärna till med allt praktiskt du kan tänka dig! Har du några frågor om vad vi gör eller vad du kan få hjälp med? Hör av dig! Det är bara att skriva eller rycka tag i mig på campus. Ha det bäst!", + "en": "Hello all new Students!\nMy name is Erik and I am Head of Facilities and Logistics!\nThe Head of Facilities and Logistics is the committee chairman of the Facilities Committee, which consists of a group of Caretakers, merch managers and a car supervisor. We are responsible of the guild’s tools, our very own car F-älgen, LTH’s coolest merch, locker rental, some miscellaneous stuff and our guild rooms. You will probably see us a lot during the introduction – often with orange braces on the top – when we help mission groups on construction nights and when we sell merch. Should you get a puncture on your bike, fear not! There are tools to borrow, and we organise bike repair\ndays a couple of times during the semester where you can get help from our Caretakers. Do your suddenly need a drill, no worries! You can borrow tools and take them home if you need to. Did you also know that you can rent a soundbox? We gladly help with anything practical that you might need! If you have any questions about what we are\ndoing or what you can get help with? Get in touch! Just send a message or find me on campus. See you all!" + } + }, + { + "title": { + "sv": "Näringslivsansvarig", + "en": "Head of Corporate Relations" + }, + "name": { + "sv": "David Mörtberg", + "en": "David Mörtberg" + }, + "text": { + "sv": "Hejsan! Jag heter David, går i trean på teknisk fysik och sitter som näringslivsansvarig. Det betyder att jag är utskottsordförande för F-sektionens näringslivsutskott (FNU).\nUtskottet ansvarar för sektionens företagssamarbeten, vilket ger studenterna chansen att knyta kontakter med framtida arbetsgivare och se vilka möjligheter som finns under och efter studierna. Vi sköter även sektionens alumniverksamhet och anordnar bland annat lunchföreläsningar och företagspubar. FNU är ett utskott där utskottets medlemmars idéer styr verksamheten. Tveka inte att prata med mig eller någon annan i utskottet om vilka aktiviteter du vill se i framtiden!", + "en": "Hi there! My name is David, I'm a third-year student in Engineering Physics and I'm the head of Corporate Relation.\nThis means that I am the chairman of the guild's Corporate Relations Committee (FNU). The committee is responsible for the guild's business partnerships, which give students the chance to make contacts with future employers and see what opportunities are available during and after their studies. We also manage the guild's alumni activities and organize, among other things, lunch lectures and pubs. FNU is a committee where the committee members' ideas guide the activities. Don't hesitate to talk to me or anyone else on the committee about what activities you would like to see in the future!" + } + }, + { + "title": { + "sv": "Projektledare FARAD", + "en": "Project Manager of FARAD" + }, + "name": { + "sv": "Vacant", + "en": "Vacant" + }, + "text": { + "sv": "?", + "en": "?" + } + }, + { + "title": { + "sv": "Kulturminister", + "en": "Minister of Culture" + }, + "name": { + "sv": "Albert Belfrage", + "en": "Albert Belfrage" + }, + "text": { + "sv": "Tjo! Jag heter Abbe Belfrage och är kulturminister på F-sektionen. Som kulturminister är man utskottsordförande för kulturministeriet - ett helt fantastiskt utskott bestående av många olika delutskott. Till kulturministeriet hör reisemeisters och reiseleiters, idrottsförman och atleterna, @1337s (uttalas atleets), F- och sångarstridsförmän.\nKulturministeriet är ett otroligt brett utskott och tillsammans anordnar vi väldigt många olika typer av aktiviteter och event. Några exempel är sittningar, bussresor, spelkvällar och idrottsaktiviteter såsom racket-fredagar, löpning, fotboll och volleyboll. Vi ser också till att F-sektionen har ett bidrag i den traditionella Sångarstriden.\nUnder nollningen syns Kulturministeriet ofta en hel del och är med och anordnar event som Ovvelekarna, Tour de Lomma och ett KM-event.\nHar du några frågor eller funderingar kring Kulturministeriet som utskott, någon specifik post eller om du bara vill snacka så får du jättegärna höra av dig! Under nollningen kommer jag ofta att gå runt i frack med ett stort F på ryggen!", + "en": "Hi! My name is Abbe Belfrage, and I'm the Minister of Culture in the F-guild. As Minister of Culture, I serve as commitee chair of the Ministry of Culture—an absolutely fantastic committee consisting of many different subcommittees. The Ministry of Culture includes the Reisemeisters and Reiseleiters, the Sports foreman and the Athletes, @1337s (pronounced “atleets”), F- and Song Contest Team Leader.\nThe Ministry of Culture is an incredibly broad committee, and together we organize a wide variety of activities and events. Some examples include sittings, bus trips, game nights, and sports activities such as racket Fridays, running, soccer, and volleyball. We also ensure that the F-section has a contribution in the traditional TLTH Song Contest.\nDuring the introduction, the Ministry of Culture is often very visible and helps organize events like the Ovvelekarna, Tour de Lomma, and a KM event.\nIf you have any questions or thoughts about the Ministry of Culture as a committee, a specific position, or if you just want to chat, please feel free to reach out! During orientation, I’ll often be walking around in a tailcoat with a big F on my back!" + } + }, + { + "title": { + "sv": "Reisemeisters", + "en": "Reisemeisters" + }, + "name": { + "sv": "Ella Thomsson & Max Edvik", + "en": "Ella Thomsson & Max Edvik" + }, + "text": { + "sv": "Hej kära nollor!\nVi heter Ella och Max och vi är reisemeisters! Som reisemeister har man hand om sektionens alldeles egna reiseleiteri!!!\nReiseleiteriet anordnar massa roliga event. Det kan vara allt från fulsittningar, bussresor till Danmark, ölmil och släpp, men vår viktigaste arbetsuppgift är att tagga till sektionen inför och under våra event. Vi ser helt enkelt till att studietiden blir lite roligare!\nVåra reiseleiters kommer ni se en hel del av under nollningen och ni känner igen dem på den ikoniska looken med knästrumpor, teknologmössa, frack och pilotglasögon. De finns alltid här för att tagga till, leka och dansa med nollorna, men självklart alltid för att svara på frågor eller lyssna på dina besvär! Det enda du behöver komma ihåg är att sjunga Teknisk Fysiks hyllningsvisa varje gång du hör en visselpipa och mata reiseleiters med sin favoritfrukt!\nTack för oss! Vi lär ses en hel del framöver! <3", + "en": "Hello dear mentees!\nWe are Ella and Max, and we are reisemeisters! As reisemeisters, we take care of the guild’s very own reiseleiteri!!!\nThe reiseleiteri organizes lots of fun events. It can be anything from informal seatings, bus trips to Denmark, beer miles, and release parties, but our most important task is to hype up the guild before and during our events. We simply make student life a bit more fun!\nYou will see a lot of our reiseleiters during the introduction period, and you’ll recognize them by their iconic look: knee-high socks, a technology student cap, tailcoat, and pilot sunglasses. They are always here to hype things up, play and dance with the mentees, but of course also to answer questions or listen to your concerns! The only thing you need to remember is to sing the Teknisk Fysik tribute song every time you hear a whistle blow and to feed the reiseleiters their favorite fruit!\nThanks from us! We’ll definitely be seeing a lot of each other going forward! <3" + } + }, + { + "title": { + "sv": "Idrottsförman", + "en": "Sports Foreman" + }, + "name": { + "sv": "Ellen Lindell", + "en": "Ellen Lindell" + }, + "text": { + "sv": "Hejsvejs!\nJag heter Ellen Lindell och är idrottsförman här på sektionen. Tillsammans med Kulturminister Abbe leder vi Atleterna, utskottet som planerar och genomför våra idrottsevenemang för alla sektionens medlemmar.\n\nUnder nollningen hittar ni oss på bland annat Tour de Lomma och volleybollturneringen.\n\nResten av året erbjuder vi massor av olika sporter och aktiviteter: racketfredag, Sporta med E, klättring, frisbee, fotboll, volleyboll, löpning med andra sektioner och flera engångsevent. Håll koll i kanalen ”Sports” på Mattermost för uppdateringar, eller kika i kalendern i F‑appen.\n\nVi älskar sport och vill skapa en plats där alla kan vara med, oavsett tidigare erfarenhet. Vi hoppas att just du vill komma och testa olika sporter med oss! Har du frågor om vad vi gör eller hur du söker till utskottet, tveka inte att höra av dig till mig eller någon av Atleterna.", + "en": "Hello there! My name is Ellen Lindell and I am the Sports foreman here at the guild. This means that I, together with Minister for Culture Abbe, lead the Athletes and plan and help to implement all our sports events at the guild. Everyone is always welcome at our events!\n\nDuring the introduction you will see us during Tour de Lomma, the volleyball tournament and together with the whole Ministry of Culture.\n\nIn addition to the events during the introduction, you can try out a lot of different sports with the athletes during the rest of the year, such as racket Friday, sports with E, climbing, frisbee, football, volleyball, running (run with V) and several one-off events. Keep an eye on our Sports channel on Mattermost to find out what we're up to and how you can get involved! You can also see our events in the calendar on the F app.\n\nWe love sports and are here for anyone who wants to get moving, regardless of previous experience. We hope you'll come and try new (or old) sports with us! If you have any questions about what we do or how to apply to become an athlete, please contact me or one of the athletes!" + } + }, + { + "title": { + "sv": "Ordförande för FREJA", + "en": "Chair of FREJA" + }, + "name": { + "sv": "Freja Wallblom", + "en": "Freja Wallblom" + }, + "text": { + "sv": "Hejhej!\nJag heter Freja Wallblom och går nu mitt tredje år på Teknisk nanovetenskap. Jag är även ordförande för FREJA, en fristående samarbetsförening till F-sektionen som arbetar för att främja kvinnor och icke-binära på sektionen.\nSom ordförande har jag det övergripande ansvaret för föreningen, vilket bland annat innebär att jag håller i möten och stöttar resten av styrelsen. Genom olika event och aktiviteter vill vi skapa gemenskap, glädje och bidra till en mer jämställd teknikbransch.\nSå om du definierar dig som något av det ovannämnda, hoppas vi i FREJA att du vill ta del av våran gemenskap. Och om du definierar dig som något annat, oroa inte! Vi håller även en del event där alla är välkomna.\nHa det bäst, vi ses! :)", + "en": "Hi!\nMy name is Freja Wallblom, and I’m currently in my third year of the Technical Nanoscience program. I’m also the chair of FREJA, an independent student association at the F-guild that works to promote women and non-binary individuals within the section.\nAs chair, I have overall responsibility for the association, which includes leading meetings and supporting the rest of the board. Through various events and activities, we aim to foster a community, joy, and contribute to a more gender-equal tech industry.\nSo if you identify as any of the above, we at FREJA hope you’ll join our community. And if you identify as something else, don’t worry! We also host events where everyone is welcome.\nTake care, see you at F-guild :)" + } + }, + { + "title": { + "sv": "Kassör", + "en": "Treasurer" + }, + "name": { + "sv": "Rasmus Pernesten", + "en": "Rasmus Pernesten" + }, + "text": { + "sv": "Hejsan! Jag heter Rasmus och är inne på mitt tredje år av Teknisk Fysik. Utöver det sitter jag även som kassör, vilket innebär att jag ansvarar för sektionens bokföring, fakturor och att sektionen har en budget att följa.\nJag är även med i styrelsen där jag jobbar med traditionellt styrelsearbete och ser till att styrelsen har koll på sektionens ekonomi. Till min hjälp har jag mitt utskott, bokförlaget, som består av bokförmannen Sixten och tre bokförfattare som tillsammans med mig sköter större delen av sektionens bokföring och fakturering. Vi samarbetar också med cofös med bokföringsansvar, cafémästaren, vice cafémästaren och vice sexmästaren, som sköter bokföringen för sina respektive områden. Om du undrar något om sektionens ekonomi eller bara har lust att snacka allmänt så är det bara att leta upp mig på Fsektionen.se eller i MH!", + "en": "Hello! My name is Rasmus and I'm in my third year of Engineering Physics. In addition to that, I also sit as Treasurer, which means that I'm responsible for the guild’s bookkeeping, invoicing and that the guild has a budget.\nI’m also a member of the board, where I do traditional board work and make sure that the rest of the board has all the information that they need about the guilds finances. To help me, I have my committee, the Accounting Department, which consists of Sixten the Accounting Manager and three Accounting Analysts who, together with me, handle most of the guild’s bookkeeping and invoicing. We also work together with the Cofös with Accounting Responsibility, the heads of Hilbert café, and the Deputy Head of Festivities, who handle the accounting for their respective committees. If you have any questions about the guild’s finances or just want to chat, just find me on Fsektionen.se or in MH!" + } + }, + { + "title": { + "sv": "Bokförman", + "en": "Bookkeeper" + }, + "name": { + "sv": "Sixten Georgsson", + "en": "Sixten Georgsson" + }, + "text": { + "sv": "Tjo! Jag heter Sixten och går 5:e året teknisk fysik och sitter även som bokförman. Som bokförman är jag ansvarig för att leda bokförlagets möten och se till att de flyter på bra. Om du undrar hur det är att vara med i bokförlaget eller bara snacka om nåt helt annat så är det bara att leta upp mig i MH :)", + "en": "Hey there! My name is Sixten, and I’m a fifth-year student in engineering physics. I also serve as the bookkeeper. As bookkeeper, I’m responsible for leading the publishing group’s meetings and making sure they run smoothly. If you’re wondering what it’s like to be part of the publishing group or just want to chat about something else entirely, feel free to come find me at MH :)" + } + }, + { + "title": { + "sv": "Cafémästarna", + "en": "Cafémasters" + }, + "name": { + "sv": "Albin Björk och Gunnar Nordell", + "en": "Albin Björk and Gunnar Nordell" + }, + "text": { + "sv": "Halli Hallå! Våra namn är Albin och Gunnar, och det är vi som är era Cafémästare! I Mattehusets hjärta ligger nämligen F-sektionens alldeles egna Hilbert Café! Här finns ett brett utbud som kan komma till en F-students nytta – fika, våra campuskända Hilbertmackor™, och viktigast av allt, KAFFE! Vill man locka in i plugget när ens tankar divergerar likt integralen av 1/x från 0 till oändligheten, kan man slå sig ner på en av våra fina studieplatser. Ifall nollningen förstör matpreppsplanerna, eller det känns svårt att stiga upp på morgonen, så kan ni i F-appen eller på hemsidan skriva upp er på ett jobbarpass för att få gratis lunch och fika. Våra nyckelpigor lär er på plats, så inga förkunskaper krävs. Vi ses!", + "en": "Hello there! Our names are Albin and Gunnar, and we are your Cafémasters! At the heart of Mattehuset lies the F-guild's very own Hilbert Café! Here you'll find a wide selection that any F-student might find to their liking – fika, our campus-famous Hilbert Sandwiches™, and most importantly, COFFEE! If you need to lock in and study even though your thoughts diverge like the integral of 1/x from 0 to infinity, you can settle into one of our great study spots. If the introduction wreaks havoc on your meal prep plans, or getting out of bed in the morning feels like a challenge, you can sign up for a work shift in the F-app or on the website to get a free lunch and fika. Our ladybugs will train you on the spot, so no prior experience required. See you there!" + } + }, + { + "title": { + "sv": "Sektionshärold", + "en": "Chief Herald of Arms" + }, + "name": { + "sv": "Emil Fredriksson", + "en": "Emil Fredriksson" + }, + "text": { + "sv": "Hejsan!\nJag heter Emil och är sektionshärold här på F-sektionen. Jag är därmed utskottsordförande för processionen, ett litet utskott som ansvarar för det ceremoniella på sektionen såsom medaljutdelning och Hilbert älgs orden.\nUtskottet består av trumpetare, fanbärare och medaljkommittén. Trumpetarna spelar fanfarer då det är passande, fanbäraren bär sektionens standar vid ceremonier och hissar sektionens fana på dess flaggdagar och medaljkommittén, som består av persevanter och sektionshärold, ansvarar för sektionens alla medaljer samt över administration över Hilbert älgs orden.", + "en": "Hello!\nMy name is Emil, and I am the Chief Herald of Arms here at the F-guild. In this role, I serve as the head of the Procession, a small committee responsible for ceremonial matters within the section, such as medal ceremonies and the Order of Hilbert Elk.\nThe committee consists of Trumpeters, a Standard bearer, and The Committee of Medals and Honours. The trumpeters play fanfares when appropriate, the standard bearer carries the section’s standard during ceremonies and raises the section’s flag on its designated flag days and the Medal Committee, comprising pursuivants and the Chief Herald of Arms, is responsible for all of the section’s medals as well as the administration of the Order of Hilbert Elk." + } + } + ] +} \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/frame.png b/assets/data/nollning_26/nolleguide/studentlife/guild/frame.png new file mode 100644 index 00000000..3f02b4a1 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/frame.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_board_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_board_en.png new file mode 100644 index 00000000..fc811c0b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_board_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_board_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_board_sv.png new file mode 100644 index 00000000..11c6028c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_board_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_boardmember_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_boardmember_en.png new file mode 100644 index 00000000..061727ce Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_boardmember_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_boardmember_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_boardmember_sv.png new file mode 100644 index 00000000..0c4d0cdd Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_boardmember_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_book_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_book_en.png new file mode 100644 index 00000000..a4bf3e02 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_book_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_book_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_book_sv.png new file mode 100644 index 00000000..e4f25f8d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_book_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_bookfos_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_bookfos_en.png new file mode 100644 index 00000000..0996f701 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_bookfos_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_bookfos_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_bookfos_sv.png new file mode 100644 index 00000000..0de9c970 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_bookfos_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cafe_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cafe_en.png new file mode 100644 index 00000000..288ca373 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cafe_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cafe_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cafe_sv.png new file mode 100644 index 00000000..56828981 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cafe_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cr_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cr_en.png new file mode 100644 index 00000000..66d24ff3 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cr_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cr_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cr_sv.png new file mode 100644 index 00000000..eeae110e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_cr_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_culture_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_culture_en.png new file mode 100644 index 00000000..1d2b615c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_culture_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_culture_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_culture_sv.png new file mode 100644 index 00000000..b2080c4c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_culture_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_edu_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_edu_en.png new file mode 100644 index 00000000..a13c084d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_edu_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_edu_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_edu_sv.png new file mode 100644 index 00000000..2e59c136 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_edu_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_eventfos_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_eventfos_en.png new file mode 100644 index 00000000..f4c5742c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_eventfos_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_eventfos_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_eventfos_sv.png new file mode 100644 index 00000000..ab03648b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_eventfos_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_fadderfos_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_fadderfos_en.png new file mode 100644 index 00000000..f4d79a6b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_fadderfos_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_fadderfos_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_fadderfos_sv.png new file mode 100644 index 00000000..f100e38d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_fadderfos_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_farad_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_farad_en.png new file mode 100644 index 00000000..ed212e9c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_farad_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_farad_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_farad_sv.png new file mode 100644 index 00000000..d978cd43 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_farad_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_freja_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_freja_en.png new file mode 100644 index 00000000..426a0e3d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_freja_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_freja_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_freja_sv.png new file mode 100644 index 00000000..a035612d Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_freja_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_herald_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_herald_en.png new file mode 100644 index 00000000..d8cc2510 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_herald_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_herald_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_herald_sv.png new file mode 100644 index 00000000..1f73c230 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_herald_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_infofos_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_infofos_en.png new file mode 100644 index 00000000..a688e7b3 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_infofos_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_infofos_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_infofos_sv.png new file mode 100644 index 00000000..c5719552 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_infofos_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_jubilee_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_jubilee_en.png new file mode 100644 index 00000000..3d4c7ea6 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_jubilee_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_jubilee_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_jubilee_sv.png new file mode 100644 index 00000000..6ea8c105 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_jubilee_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_libu.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_libu.png new file mode 100644 index 00000000..0b918a19 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_libu.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_overfos_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_overfos_en.png new file mode 100644 index 00000000..b92aa8b5 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_overfos_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_overfos_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_overfos_sv.png new file mode 100644 index 00000000..ba782716 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_overfos_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_president_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_president_en.png new file mode 100644 index 00000000..92ca61d0 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_president_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_president_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_president_sv.png new file mode 100644 index 00000000..4506fb64 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_president_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_pryl_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_pryl_en.png new file mode 100644 index 00000000..981a1cb5 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_pryl_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_pryl_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_pryl_sv.png new file mode 100644 index 00000000..78beb1d1 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_pryl_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_reisemeister.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_reisemeister.png new file mode 100644 index 00000000..c91c1c5f Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_reisemeister.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_samvetet_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_samvetet_en.png new file mode 100644 index 00000000..dff0410b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_samvetet_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_samvetet_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_samvetet_sv.png new file mode 100644 index 00000000..b73ea1c1 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_samvetet_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_secretary_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_secretary_en.png new file mode 100644 index 00000000..7fd66089 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_secretary_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_secretary_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_secretary_sv.png new file mode 100644 index 00000000..f9a8c582 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_secretary_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sex_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sex_en.png new file mode 100644 index 00000000..d25ad4c7 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sex_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sex_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sex_sv.png new file mode 100644 index 00000000..0c1f869a Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sex_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sigmafos_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sigmafos_en.png new file mode 100644 index 00000000..68b8df2f Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sigmafos_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sigmafos_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sigmafos_sv.png new file mode 100644 index 00000000..7142ece4 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sigmafos_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_spider_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_spider_en.png new file mode 100644 index 00000000..56fc4f3b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_spider_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_spider_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_spider_sv.png new file mode 100644 index 00000000..eea9f162 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_spider_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sponsfos_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sponsfos_en.png new file mode 100644 index 00000000..e80e1e6e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sponsfos_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sponsfos_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sponsfos_sv.png new file mode 100644 index 00000000..15c8479b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sponsfos_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sport_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sport_en.png new file mode 100644 index 00000000..df72d1d6 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sport_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sport_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sport_sv.png new file mode 100644 index 00000000..d1abcb4b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_sport_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_tavern_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_tavern_en.png new file mode 100644 index 00000000..d93a2a24 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_tavern_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_tavern_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_tavern_sv.png new file mode 100644 index 00000000..80d77a6a Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_tavern_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_treasurer_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_treasurer_en.png new file mode 100644 index 00000000..44fccd9e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_treasurer_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_treasurer_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_treasurer_sv.png new file mode 100644 index 00000000..7f0e215a Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_treasurer_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_truth_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_truth_en.png new file mode 100644 index 00000000..f02bf043 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_truth_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_truth_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_truth_sv.png new file mode 100644 index 00000000..627b13c7 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_truth_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_vp_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_vp_en.png new file mode 100644 index 00000000..44a2dd10 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_vp_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_vp_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_vp_sv.png new file mode 100644 index 00000000..8874547c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/portrait_vp_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_accounting_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_accounting_en.png new file mode 100644 index 00000000..6c044276 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_accounting_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_accounting_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_accounting_sv.png new file mode 100644 index 00000000..59da474c Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_accounting_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_blank.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_blank.png new file mode 100644 index 00000000..30fe192f Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_blank.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_board_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_board_en.png new file mode 100644 index 00000000..76bbe5b6 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_board_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_board_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_board_sv.png new file mode 100644 index 00000000..bc988a0b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_board_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_cafe_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_cafe_en.png new file mode 100644 index 00000000..7a825e35 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_cafe_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_cafe_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_cafe_sv.png new file mode 100644 index 00000000..d992eda0 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_cafe_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_culture_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_culture_en.png new file mode 100644 index 00000000..ccdea9e3 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_culture_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_culture_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_culture_sv.png new file mode 100644 index 00000000..6cdfd4ff Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_culture_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_facilities_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_facilities_en.png new file mode 100644 index 00000000..e8933faf Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_facilities_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_facilities_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_facilities_sv.png new file mode 100644 index 00000000..2c60ac77 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_facilities_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_fnu_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_fnu_en.png new file mode 100644 index 00000000..5427c114 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_fnu_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_fnu_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_fnu_sv.png new file mode 100644 index 00000000..2da8f0b9 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_fnu_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_foset_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_foset_en.png new file mode 100644 index 00000000..75e69d77 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_foset_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_foset_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_foset_sv.png new file mode 100644 index 00000000..7e4fa389 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_foset_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_freja.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_freja.png new file mode 100644 index 00000000..c1bcf736 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_freja.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_jubilee_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_jubilee_en.png new file mode 100644 index 00000000..a2b99905 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_jubilee_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_jubilee_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_jubilee_sv.png new file mode 100644 index 00000000..00668c21 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_jubilee_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_libu_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_libu_en.png new file mode 100644 index 00000000..784fc073 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_libu_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_libu_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_libu_sv.png new file mode 100644 index 00000000..f8caac1e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_libu_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_organisation.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_organisation.png new file mode 100644 index 00000000..0c5eb8a7 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_organisation.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_procession_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_procession_en.png new file mode 100644 index 00000000..f1cdd3eb Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_procession_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_procession_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_procession_sv.png new file mode 100644 index 00000000..49db9e72 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_procession_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_samvetet_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_samvetet_en.png new file mode 100644 index 00000000..6a3e761e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_samvetet_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_samvetet_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_samvetet_sv.png new file mode 100644 index 00000000..589d10c4 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_samvetet_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_service_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_service_en.png new file mode 100644 index 00000000..5ccdc5fa Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_service_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_service_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_service_sv.png new file mode 100644 index 00000000..a0182ac0 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_service_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_sex_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_sex_en.png new file mode 100644 index 00000000..06dcd459 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_sex_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_sex_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_sex_sv.png new file mode 100644 index 00000000..f363ef5b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_sex_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_studentcouncil_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_studentcouncil_en.png new file mode 100644 index 00000000..e6799da6 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_studentcouncil_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_studentcouncil_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_studentcouncil_sv.png new file mode 100644 index 00000000..6f9930d3 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_studentcouncil_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_tavern_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_tavern_en.png new file mode 100644 index 00000000..e9fb5abc Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_tavern_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_tavern_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_tavern_sv.png new file mode 100644 index 00000000..638490ac Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_tavern_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_truth_en.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_truth_en.png new file mode 100644 index 00000000..f51c1c44 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_truth_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/guild/title_truth_sv.png b/assets/data/nollning_26/nolleguide/studentlife/guild/title_truth_sv.png new file mode 100644 index 00000000..21ebcfce Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/guild/title_truth_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/karen_en.png b/assets/data/nollning_26/nolleguide/studentlife/karen_en.png new file mode 100644 index 00000000..317ed934 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/karen_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/karen_sv.png b/assets/data/nollning_26/nolleguide/studentlife/karen_sv.png new file mode 100644 index 00000000..129be4e6 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/karen_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/lund.png b/assets/data/nollning_26/nolleguide/studentlife/lund.png new file mode 100644 index 00000000..e5b8ccbb Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/lund.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/lund/data_lund.json b/assets/data/nollning_26/nolleguide/studentlife/lund/data_lund.json new file mode 100644 index 00000000..ddbb349e --- /dev/null +++ b/assets/data/nollning_26/nolleguide/studentlife/lund/data_lund.json @@ -0,0 +1,32 @@ +{ + "spex": { + "title": { + "sv": "Spex", + "en": "Spex" + }, + "text": { + "sv": "I Lund finns ca 10 studentspex och varje spex sätter upp föreställningar 1 till 3 gånger per år. Många spex håller till i AF-borgen, men en del mindre nationsspex håller till i nationens egna lokaler.\n\nSom engagerad i spex kan man göra allt från att bygga dekor, sy, sminka, spela instrument eller sjunga. Endast en liten del av spex-ensemblen brukar stå på scen, så det finns mycket att göra, även för dig som inte vill stå i centrum. Repetitioner brukar ske under 3-5 veckor under terminen. Beroende på spexets storlek har man sedan ett större eller mindre antal föreställningar för Lunds studenter och allmänheten.\n\nLunds fyra största spex (som alla håller till i stora salen i AF-borgen) heter Jesper, Toddy, Boel och Lundaspexarna. Jesper är teknologspexet som riktar sig mycket till teknologstudenter, Toddy är motsvarande för läkarstudenter, Boel har bara kvinnor på scen och Lunda har bara män på scen.\n\nText och bild: Johan Furuhjelm", + "en": "In Lund there are about ten different student spex, and each spex puts on performances between one and three times a year. Many of these spex are located in the AF-borgen, while smaller nation spex often use the nation's own premises.\n\nBeing involved in a spex means you can take part in many different activities, such as building sets, making costumes, applying make-up, playing instruments or singing. Only a small part of the spex ensemble is on stage, which means there is plenty to do even for those who don't want to be in the spotlight. Rehearsals usually last 3-5 weeks during the semester, and depending on the size of the spex, a number of performances are then put on for both Lund students and the public.\n\nThe four largest spexes in Lund, all of which hold their performances in the main hall of the AF-borgen, are Jesper, Toddy, Boel and Lundaspexarna. Jesper is the technologist spex and is mainly aimed at technologist students, Toddy is mainly for medical students, Boel has only women on stage, and Lundaspexarna has only men on stage.\n\nImages from Jesperspexet's acclaimed show \"Marie Curie\", which was performed in spring 2024.\n\nText and image: Johan Furuhjelm." + } + }, + "sektion": { + "title": { + "sv": "Sektioner", + "en": "Guilds" + }, + "text": { + "sv": "Lunds Universitet, LU, består av flera olika fakulteter bland vilka Lunds tekniska högskola, LTH, är störst. Till varje fakultet hör en kår och för oss på LTH är det Teknologkåren som förkortas TLTH. Teknologkåren är uppdelad i elva så kallade sektioner där varje sektion innefattar ett eller flera utbildningsprogram. Alla sektioner på LTH drivs som ideella föreningar med hjälp av de studenter som studerar på utbildningarna sektionen omfattar. F-sektionen, som du tillhör, innefattar utbildningarna Teknisk Fysik (F), Teknisk Matematik (π) och Teknisk Nanovetenskap (n). Det är din sektion som anordnar din nollning. Det är även den som har hand om alla programspecifika frågor, oavsett om de gäller studier, näringslivskontakt, fritidsaktiviteter eller annat roligt du kan tänka dig att hitta på under din tid på F-sektionen. Under nollningen är det lättast att känna igen andra sektioner på dess overaller då färgen på overallen är samma som sin sektionsfärg. Sektionerna inom TLTH räknas traditionellt upp i kronologisk ordning enligt: F E M V A K D DOKT Ing W I.", + "en": "Lund University, LU, consists of several faculties among which the engineering faculty, LTH, is the biggest. Every faculty has their own student union and at LTH that is Teknologkåren which is abbreviated TLTH. Teknologkåren is divided into eleven guilds, where each guild represents one or several educational programmes. Every guild is run like a non profit organization by students from the guild’s programmes. You belong to the F-guild that consists of the programmes engineering physics, engineering mathematics and engineering nanotechnology. It is your guild that arranges your introduction. It is also your guild that takes care of all matters that concern your education, as well as contact with the business world, fun activities and anything else that you do during your time at the F-guild. During the introduction it is easy to recognize other guilds on their overalls since the overall is the color of the wearer's guild. The guilds are traditionally presented in the following order (which is the same as the order in which the guilds were created): F E M V A K D DOKT Ing W I" + } + }, + "nation": { + "title": { + "sv": "Nationer", + "en": "Nationer" + }, + "text":{ + "sv": "I Lund finns något som kallas Nationer. De är på samma sätt som sektioner föreningar drivna av studenter vid universitetet men till skillnad från sektioner är nationerna inte bundna till en utbildning och står inte under en kår. Många nationer grundades på 1600-talet, den allra senaste grundades 1928. I Lund finns det 13 nationer och man väljer fritt vilken nation man vill gå med i. Nationerna anordnar fester, pubar, lunch och middagsrestaurang och många andra aktiviteter. När man inte har novischförtur längre på AF Bostäder måste man vara medlem i Studentlund och därigenom en Nation för att få bo på AFB. Läs mer på www.studentlund.se.", + "en": "In Lund there is also something called Nations. Like guilds they are run by students at the University but they are not bound to a specific education and they do not answer to a Student Union. Many Nations were started in the 17th century, but the newest one was founded in 1928. In Lund there are 13 different nations and you get to choose which nation you want to join. The nations arrange parties, pubs, lunch and dinner servings and many other events. You can read more at www.studentlund.se. In Lund there is also something called Nations. Like guilds they are run by students at the University but they are not bound to a specific education and they do not answer to a Student Union. Many Nations were started in the 17th century, but the newest one was founded in 1928. In Lund there are 13 different nations and you get to choose which nation you want to join. The nations arrange parties, pubs, lunch and dinner servings and many other events. You can read more at www.studentlund.se." + } + } +} \ No newline at end of file diff --git a/assets/data/nollning_26/nolleguide/studentlife/lund/spexbild1.jpg b/assets/data/nollning_26/nolleguide/studentlife/lund/spexbild1.jpg new file mode 100644 index 00000000..ff077153 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/lund/spexbild1.jpg differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/lund/spexbild2.jpg b/assets/data/nollning_26/nolleguide/studentlife/lund/spexbild2.jpg new file mode 100644 index 00000000..b233a25e Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/lund/spexbild2.jpg differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/sektionen_en.png b/assets/data/nollning_26/nolleguide/studentlife/sektionen_en.png new file mode 100644 index 00000000..23aa710b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/sektionen_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/sektionen_sv.png b/assets/data/nollning_26/nolleguide/studentlife/sektionen_sv.png new file mode 100644 index 00000000..46d9e1a4 Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/sektionen_sv.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/title_en.png b/assets/data/nollning_26/nolleguide/studentlife/title_en.png new file mode 100644 index 00000000..ba3fe21b Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/title_en.png differ diff --git a/assets/data/nollning_26/nolleguide/studentlife/title_sv.png b/assets/data/nollning_26/nolleguide/studentlife/title_sv.png new file mode 100644 index 00000000..0adf152f Binary files /dev/null and b/assets/data/nollning_26/nolleguide/studentlife/title_sv.png differ diff --git a/assets/data/nollning_26/schema/schema_en.png b/assets/data/nollning_26/schema/schema_en.png new file mode 100644 index 00000000..b6c73dbf Binary files /dev/null and b/assets/data/nollning_26/schema/schema_en.png differ diff --git a/assets/data/nollning_26/schema/schema_sv.png b/assets/data/nollning_26/schema/schema_sv.png new file mode 100644 index 00000000..5ebcab84 Binary files /dev/null and b/assets/data/nollning_26/schema/schema_sv.png differ diff --git a/assets/fonts/Consolas-Regular.ttf b/assets/fonts/Consolas-Regular.ttf new file mode 100644 index 00000000..cd4980c1 Binary files /dev/null and b/assets/fonts/Consolas-Regular.ttf differ diff --git a/assets/img/moose_game/alien_voi_l.png b/assets/img/moose_game/alien_voi_l.png new file mode 100644 index 00000000..78b9e841 Binary files /dev/null and b/assets/img/moose_game/alien_voi_l.png differ diff --git a/assets/img/moose_game/alien_voi_l_d.png b/assets/img/moose_game/alien_voi_l_d.png new file mode 100644 index 00000000..a37b0a75 Binary files /dev/null and b/assets/img/moose_game/alien_voi_l_d.png differ diff --git a/assets/img/moose_game/alien_voi_r.png b/assets/img/moose_game/alien_voi_r.png new file mode 100644 index 00000000..94518676 Binary files /dev/null and b/assets/img/moose_game/alien_voi_r.png differ diff --git a/assets/img/moose_game/alien_voi_r_d.png b/assets/img/moose_game/alien_voi_r_d.png new file mode 100644 index 00000000..b5ebbda6 Binary files /dev/null and b/assets/img/moose_game/alien_voi_r_d.png differ diff --git a/assets/img/moose_game/antenna.png b/assets/img/moose_game/antenna.png new file mode 100644 index 00000000..3e8bd163 Binary files /dev/null and b/assets/img/moose_game/antenna.png differ diff --git a/assets/img/moose_game/antenna_d.png b/assets/img/moose_game/antenna_d.png new file mode 100644 index 00000000..325e277b Binary files /dev/null and b/assets/img/moose_game/antenna_d.png differ diff --git a/assets/img/moose_game/galaxy.png b/assets/img/moose_game/galaxy.png new file mode 100644 index 00000000..a957aa3d Binary files /dev/null and b/assets/img/moose_game/galaxy.png differ diff --git a/assets/img/moose_game/galaxy_d.png b/assets/img/moose_game/galaxy_d.png new file mode 100644 index 00000000..ba70d580 Binary files /dev/null and b/assets/img/moose_game/galaxy_d.png differ diff --git a/assets/img/moose_game/hilbert_space_fall.png b/assets/img/moose_game/hilbert_space_fall.png new file mode 100644 index 00000000..a529da25 Binary files /dev/null and b/assets/img/moose_game/hilbert_space_fall.png differ diff --git a/assets/img/moose_game/hilbert_space_jump.png b/assets/img/moose_game/hilbert_space_jump.png new file mode 100644 index 00000000..e5cf1ec9 Binary files /dev/null and b/assets/img/moose_game/hilbert_space_jump.png differ diff --git a/assets/img/moose_game/hilbert_space_run_1.png b/assets/img/moose_game/hilbert_space_run_1.png new file mode 100644 index 00000000..7881fcf5 Binary files /dev/null and b/assets/img/moose_game/hilbert_space_run_1.png differ diff --git a/assets/img/moose_game/hilbert_space_run_2.png b/assets/img/moose_game/hilbert_space_run_2.png new file mode 100644 index 00000000..f1964b12 Binary files /dev/null and b/assets/img/moose_game/hilbert_space_run_2.png differ diff --git a/assets/img/moose_game/hilbert_space_run_3.png b/assets/img/moose_game/hilbert_space_run_3.png new file mode 100644 index 00000000..e78a7845 Binary files /dev/null and b/assets/img/moose_game/hilbert_space_run_3.png differ diff --git a/assets/img/moose_game/hilbert_space_run_4.png b/assets/img/moose_game/hilbert_space_run_4.png new file mode 100644 index 00000000..ac409f7e Binary files /dev/null and b/assets/img/moose_game/hilbert_space_run_4.png differ diff --git a/assets/img/moose_game/o2_bottle.png b/assets/img/moose_game/o2_bottle.png new file mode 100644 index 00000000..142984ee Binary files /dev/null and b/assets/img/moose_game/o2_bottle.png differ diff --git a/assets/img/moose_game/o2_bottle_d.png b/assets/img/moose_game/o2_bottle_d.png new file mode 100644 index 00000000..73ab9556 Binary files /dev/null and b/assets/img/moose_game/o2_bottle_d.png differ diff --git a/assets/img/moose_game/rocket.png b/assets/img/moose_game/rocket.png new file mode 100644 index 00000000..43647b59 Binary files /dev/null and b/assets/img/moose_game/rocket.png differ diff --git a/assets/img/moose_game/rocket_d.png b/assets/img/moose_game/rocket_d.png new file mode 100644 index 00000000..fdb16dd7 Binary files /dev/null and b/assets/img/moose_game/rocket_d.png differ diff --git a/assets/img/moose_game/ufo_l.png b/assets/img/moose_game/ufo_l.png new file mode 100644 index 00000000..f48c94ec Binary files /dev/null and b/assets/img/moose_game/ufo_l.png differ diff --git a/assets/img/moose_game/ufo_l_d.png b/assets/img/moose_game/ufo_l_d.png new file mode 100644 index 00000000..6fdb2c8f Binary files /dev/null and b/assets/img/moose_game/ufo_l_d.png differ diff --git a/assets/img/moose_game/ufo_r.png b/assets/img/moose_game/ufo_r.png new file mode 100644 index 00000000..77233ee3 Binary files /dev/null and b/assets/img/moose_game/ufo_r.png differ diff --git a/assets/img/moose_game/ufo_r_d.png b/assets/img/moose_game/ufo_r_d.png new file mode 100644 index 00000000..aef7a0c4 Binary files /dev/null and b/assets/img/moose_game/ufo_r_d.png differ diff --git a/lib/api_client/.openapi-generator/FILES b/lib/api_client/.openapi-generator/FILES index eb8f63c3..eb293634 100644 --- a/lib/api_client/.openapi-generator/FILES +++ b/lib/api_client/.openapi-generator/FILES @@ -59,6 +59,12 @@ doc/ElectionPostRead.md doc/ElectionRead.md doc/ElectionUpdate.md doc/ElectionsApi.md +doc/EncloseMooseApi.md +doc/EncloseMooseLevelCreate.md +doc/EncloseMooseLevelRead.md +doc/EncloseMooseLevelUpdate.md +doc/EncloseMooseSubmissionCreate.md +doc/EncloseMooseSubmissionRead.md doc/ErrorModel.md doc/EventCreate.md doc/EventRead.md @@ -117,6 +123,10 @@ doc/PostPermissionRead.md doc/PostRead.md doc/PostUpdate.md doc/PostsApi.md +doc/PreregMemberCreate.md +doc/PreregMemberRead.md +doc/PreregMemberUpdate.md +doc/PreregMembersApi.md doc/PriorityDB.md doc/RoomBookingApi.md doc/RoomBookingCreate.md @@ -153,6 +163,7 @@ doc/UserAccessUpdate.md doc/UserCreate.md doc/UserDoorAccessApi.md doc/UserEventRead.md +doc/UserForEventSignupRead.md doc/UserInEventRead.md doc/UserInGroupRead.md doc/UserPostRead.md @@ -174,6 +185,7 @@ lib/src/api/council_api.dart lib/src/api/default_api.dart lib/src/api/document_api.dart lib/src/api/elections_api.dart +lib/src/api/enclose_moose_api.dart lib/src/api/event_signup_api.dart lib/src/api/events_api.dart lib/src/api/groups_api.dart @@ -187,6 +199,7 @@ lib/src/api/nollning_api.dart lib/src/api/nominations_api.dart lib/src/api/permissions_api.dart lib/src/api/posts_api.dart +lib/src/api/prereg_members_api.dart lib/src/api/room_booking_api.dart lib/src/api/songs_api.dart lib/src/api/songs_category_api.dart @@ -248,6 +261,11 @@ lib/src/model/election_populate.dart lib/src/model/election_post_read.dart lib/src/model/election_read.dart lib/src/model/election_update.dart +lib/src/model/enclose_moose_level_create.dart +lib/src/model/enclose_moose_level_read.dart +lib/src/model/enclose_moose_level_update.dart +lib/src/model/enclose_moose_submission_create.dart +lib/src/model/enclose_moose_submission_read.dart lib/src/model/error_model.dart lib/src/model/event_create.dart lib/src/model/event_read.dart @@ -293,6 +311,9 @@ lib/src/model/post_door_access_read.dart lib/src/model/post_permission_read.dart lib/src/model/post_read.dart lib/src/model/post_update.dart +lib/src/model/prereg_member_create.dart +lib/src/model/prereg_member_read.dart +lib/src/model/prereg_member_update.dart lib/src/model/priority_db.dart lib/src/model/room_booking_create.dart lib/src/model/room_booking_read.dart @@ -323,6 +344,7 @@ lib/src/model/user_access_read.dart lib/src/model/user_access_update.dart lib/src/model/user_create.dart lib/src/model/user_event_read.dart +lib/src/model/user_for_event_signup_read.dart lib/src/model/user_in_event_read.dart lib/src/model/user_in_group_read.dart lib/src/model/user_post_read.dart @@ -331,3 +353,13 @@ lib/src/model/user_update.dart lib/src/model/validation_error.dart lib/src/serializers.dart pubspec.yaml +test/enclose_moose_api_test.dart +test/enclose_moose_level_create_test.dart +test/enclose_moose_level_read_test.dart +test/enclose_moose_level_update_test.dart +test/enclose_moose_submission_create_test.dart +test/enclose_moose_submission_read_test.dart +test/prereg_member_create_test.dart +test/prereg_member_read_test.dart +test/prereg_member_update_test.dart +test/prereg_members_api_test.dart diff --git a/lib/api_client/README.md b/lib/api_client/README.md index ee688c85..cc85a0db 100644 --- a/lib/api_client/README.md +++ b/lib/api_client/README.md @@ -146,9 +146,21 @@ Class | Method | HTTP request | Description [*ElectionsApi*](doc/ElectionsApi.md) | [**electionsGetVisibleElection**](doc/ElectionsApi.md#electionsgetvisibleelection) | **GET** /election/visible | Get Visible Election [*ElectionsApi*](doc/ElectionsApi.md) | [**electionsPopulateElection**](doc/ElectionsApi.md#electionspopulateelection) | **POST** /election/{election_id}/populate | Populate Election [*ElectionsApi*](doc/ElectionsApi.md) | [**electionsUpdateElection**](doc/ElectionsApi.md#electionsupdateelection) | **PATCH** /election/{election_id} | Update Election +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseAdminCreateLevel**](doc/EncloseMooseApi.md#enclosemooseadmincreatelevel) | **POST** /enclose-moose/admin/levels | Admin Create Level +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseAdminDeleteLevel**](doc/EncloseMooseApi.md#enclosemooseadmindeletelevel) | **DELETE** /enclose-moose/admin/levels/{level_id} | Admin Delete Level +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseAdminGetAllLevelSubmissions**](doc/EncloseMooseApi.md#enclosemooseadmingetalllevelsubmissions) | **GET** /enclose-moose/admin/submissions/{level_id} | Admin Get All Level Submissions +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseAdminGetAllLevels**](doc/EncloseMooseApi.md#enclosemooseadmingetalllevels) | **GET** /enclose-moose/admin/levels | Admin Get All Levels +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseAdminGetLevel**](doc/EncloseMooseApi.md#enclosemooseadmingetlevel) | **GET** /enclose-moose/admin/levels/{level_id} | Admin Get Level +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseAdminUpdateLevel**](doc/EncloseMooseApi.md#enclosemooseadminupdatelevel) | **PATCH** /enclose-moose/admin/levels/{level_id} | Admin Update Level +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseGetAllLevels**](doc/EncloseMooseApi.md#enclosemoosegetalllevels) | **GET** /enclose-moose/levels | Get All Levels +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseGetAllSubmissions**](doc/EncloseMooseApi.md#enclosemoosegetallsubmissions) | **GET** /enclose-moose/submissions | Get All Submissions +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseGetLevel**](doc/EncloseMooseApi.md#enclosemoosegetlevel) | **GET** /enclose-moose/levels/{level_id} | Get Level +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseGetSubmission**](doc/EncloseMooseApi.md#enclosemoosegetsubmission) | **GET** /enclose-moose/submissions/{level_id} | Get Submission +[*EncloseMooseApi*](doc/EncloseMooseApi.md) | [**encloseMooseSubmitSolution**](doc/EncloseMooseApi.md#enclosemoosesubmitsolution) | **POST** /enclose-moose/submissions/{level_id} | Submit Solution [*EventSignupApi*](doc/EventSignupApi.md) | [**eventSignupEventSignoffRoute**](doc/EventSignupApi.md#eventsignupeventsignoffroute) | **DELETE** /event-signup/{event_id} | Event Signoff Route [*EventSignupApi*](doc/EventSignupApi.md) | [**eventSignupEventSignupRoute**](doc/EventSignupApi.md#eventsignupeventsignuproute) | **POST** /event-signup/{event_id} | Event Signup Route [*EventSignupApi*](doc/EventSignupApi.md) | [**eventSignupGetMeEventSignup**](doc/EventSignupApi.md#eventsignupgetmeeventsignup) | **GET** /event-signup/me-signup/{event_id} | Get Me Event Signup +[*EventSignupApi*](doc/EventSignupApi.md) | [**eventSignupGetMeForEventSignup**](doc/EventSignupApi.md#eventsignupgetmeforeventsignup) | **GET** /event-signup/me/{event_id} | Get Me For Event Signup [*EventSignupApi*](doc/EventSignupApi.md) | [**eventSignupUpdateEventSignupRoute**](doc/EventSignupApi.md#eventsignupupdateeventsignuproute) | **PATCH** /event-signup/{event_id} | Update Event Signup Route [*EventsApi*](doc/EventsApi.md) | [**eventsAddTagToEvent**](doc/EventsApi.md#eventsaddtagtoevent) | **POST** /events/add-tag | Add Tag To Event [*EventsApi*](doc/EventsApi.md) | [**eventsConfirmEventUsers**](doc/EventsApi.md#eventsconfirmeventusers) | **PATCH** /events/event-confirm-event-users/{event_id} | Confirm Event Users @@ -242,6 +254,13 @@ Class | Method | HTTP request | Description [*PostsApi*](doc/PostsApi.md) | [**postsGetPostImageStream**](doc/PostsApi.md#postsgetpostimagestream) | **GET** /posts/{post_id}/image/stream | Get Post Image Stream [*PostsApi*](doc/PostsApi.md) | [**postsPostPostImage**](doc/PostsApi.md#postspostpostimage) | **POST** /posts/{post_id}/image | Post Post Image [*PostsApi*](doc/PostsApi.md) | [**postsUpdatePost**](doc/PostsApi.md#postsupdatepost) | **PATCH** /posts/{post_id} | Update Post +[*PreregMembersApi*](doc/PreregMembersApi.md) | [**preregMembersCreateMultiplePreregMembers**](doc/PreregMembersApi.md#preregmemberscreatemultiplepreregmembers) | **POST** /prereg-members/multiple | Create Multiple Prereg Members +[*PreregMembersApi*](doc/PreregMembersApi.md) | [**preregMembersCreatePreregMember**](doc/PreregMembersApi.md#preregmemberscreatepreregmember) | **POST** /prereg-members/ | Create Prereg Member +[*PreregMembersApi*](doc/PreregMembersApi.md) | [**preregMembersDeleteMultiplePreregMembers**](doc/PreregMembersApi.md#preregmembersdeletemultiplepreregmembers) | **DELETE** /prereg-members/multiple | Delete Multiple Prereg Members +[*PreregMembersApi*](doc/PreregMembersApi.md) | [**preregMembersDeletePreregMember**](doc/PreregMembersApi.md#preregmembersdeletepreregmember) | **DELETE** /prereg-members/{prereg_member_id} | Delete Prereg Member +[*PreregMembersApi*](doc/PreregMembersApi.md) | [**preregMembersGetAllPreregMemberInfo**](doc/PreregMembersApi.md#preregmembersgetallpreregmemberinfo) | **GET** /prereg-members/ | Get All Prereg Member Info +[*PreregMembersApi*](doc/PreregMembersApi.md) | [**preregMembersGetPreregMemberInfo**](doc/PreregMembersApi.md#preregmembersgetpreregmemberinfo) | **GET** /prereg-members/{prereg_member_id} | Get Prereg Member Info +[*PreregMembersApi*](doc/PreregMembersApi.md) | [**preregMembersUpdatePreregMember**](doc/PreregMembersApi.md#preregmembersupdatepreregmember) | **PATCH** /prereg-members/{prereg_member_id} | Update Prereg Member [*RoomBookingApi*](doc/RoomBookingApi.md) | [**roomBookingCreateRoomBooking**](doc/RoomBookingApi.md#roombookingcreateroombooking) | **POST** /rooms/ | Create Room Booking [*RoomBookingApi*](doc/RoomBookingApi.md) | [**roomBookingGetAllRoomBookings**](doc/RoomBookingApi.md#roombookinggetallroombookings) | **GET** /rooms/get_all | Get All Room Bookings [*RoomBookingApi*](doc/RoomBookingApi.md) | [**roomBookingGetBookingsByRoom**](doc/RoomBookingApi.md#roombookinggetbookingsbyroom) | **GET** /rooms/get_by_room/ | Get Bookings By Room @@ -338,6 +357,11 @@ Class | Method | HTTP request | Description - [ElectionPostRead](doc/ElectionPostRead.md) - [ElectionRead](doc/ElectionRead.md) - [ElectionUpdate](doc/ElectionUpdate.md) + - [EncloseMooseLevelCreate](doc/EncloseMooseLevelCreate.md) + - [EncloseMooseLevelRead](doc/EncloseMooseLevelRead.md) + - [EncloseMooseLevelUpdate](doc/EncloseMooseLevelUpdate.md) + - [EncloseMooseSubmissionCreate](doc/EncloseMooseSubmissionCreate.md) + - [EncloseMooseSubmissionRead](doc/EncloseMooseSubmissionRead.md) - [ErrorModel](doc/ErrorModel.md) - [EventCreate](doc/EventCreate.md) - [EventRead](doc/EventRead.md) @@ -383,6 +407,9 @@ Class | Method | HTTP request | Description - [PostPermissionRead](doc/PostPermissionRead.md) - [PostRead](doc/PostRead.md) - [PostUpdate](doc/PostUpdate.md) + - [PreregMemberCreate](doc/PreregMemberCreate.md) + - [PreregMemberRead](doc/PreregMemberRead.md) + - [PreregMemberUpdate](doc/PreregMemberUpdate.md) - [PriorityDB](doc/PriorityDB.md) - [RoomBookingCreate](doc/RoomBookingCreate.md) - [RoomBookingRead](doc/RoomBookingRead.md) @@ -413,6 +440,7 @@ Class | Method | HTTP request | Description - [UserAccessUpdate](doc/UserAccessUpdate.md) - [UserCreate](doc/UserCreate.md) - [UserEventRead](doc/UserEventRead.md) + - [UserForEventSignupRead](doc/UserForEventSignupRead.md) - [UserInEventRead](doc/UserInEventRead.md) - [UserInGroupRead](doc/UserInGroupRead.md) - [UserPostRead](doc/UserPostRead.md) diff --git a/lib/api_client/doc/AdventureMissionCreate.md b/lib/api_client/doc/AdventureMissionCreate.md index 3d0b3283..20fcc3c6 100644 --- a/lib/api_client/doc/AdventureMissionCreate.md +++ b/lib/api_client/doc/AdventureMissionCreate.md @@ -15,6 +15,10 @@ Name | Type | Description | Notes **maxPoints** | **int** | | **minPoints** | **int** | | **nollningWeek** | **int** | | +**missionCategory** | **String** | | [optional] +**unlockCode** | **String** | | [optional] +**unlockHintSv** | **String** | | [optional] +**unlockHintEn** | **String** | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/lib/api_client/doc/AdventureMissionRead.md b/lib/api_client/doc/AdventureMissionRead.md index 6d4b2174..3ce66ec7 100644 --- a/lib/api_client/doc/AdventureMissionRead.md +++ b/lib/api_client/doc/AdventureMissionRead.md @@ -17,6 +17,10 @@ Name | Type | Description | Notes **minPoints** | **int** | | **nollningId** | **int** | | **nollningWeek** | **int** | | +**missionCategory** | **String** | | +**unlockCode** | **String** | | [optional] +**unlockHintSv** | **String** | | [optional] +**unlockHintEn** | **String** | | [optional] **createdAt** | [**DateTime**](DateTime.md) | | [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/lib/api_client/doc/EncloseMooseApi.md b/lib/api_client/doc/EncloseMooseApi.md new file mode 100644 index 00000000..a6973c66 --- /dev/null +++ b/lib/api_client/doc/EncloseMooseApi.md @@ -0,0 +1,533 @@ +# api_client.api.EncloseMooseApi + +## Load the API package +```dart +import 'package:api_client/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**encloseMooseAdminCreateLevel**](EncloseMooseApi.md#enclosemooseadmincreatelevel) | **POST** /enclose-moose/admin/levels | Admin Create Level +[**encloseMooseAdminDeleteLevel**](EncloseMooseApi.md#enclosemooseadmindeletelevel) | **DELETE** /enclose-moose/admin/levels/{level_id} | Admin Delete Level +[**encloseMooseAdminGetAllLevelSubmissions**](EncloseMooseApi.md#enclosemooseadmingetalllevelsubmissions) | **GET** /enclose-moose/admin/submissions/{level_id} | Admin Get All Level Submissions +[**encloseMooseAdminGetAllLevels**](EncloseMooseApi.md#enclosemooseadmingetalllevels) | **GET** /enclose-moose/admin/levels | Admin Get All Levels +[**encloseMooseAdminGetLevel**](EncloseMooseApi.md#enclosemooseadmingetlevel) | **GET** /enclose-moose/admin/levels/{level_id} | Admin Get Level +[**encloseMooseAdminUpdateLevel**](EncloseMooseApi.md#enclosemooseadminupdatelevel) | **PATCH** /enclose-moose/admin/levels/{level_id} | Admin Update Level +[**encloseMooseGetAllLevels**](EncloseMooseApi.md#enclosemoosegetalllevels) | **GET** /enclose-moose/levels | Get All Levels +[**encloseMooseGetAllSubmissions**](EncloseMooseApi.md#enclosemoosegetallsubmissions) | **GET** /enclose-moose/submissions | Get All Submissions +[**encloseMooseGetLevel**](EncloseMooseApi.md#enclosemoosegetlevel) | **GET** /enclose-moose/levels/{level_id} | Get Level +[**encloseMooseGetSubmission**](EncloseMooseApi.md#enclosemoosegetsubmission) | **GET** /enclose-moose/submissions/{level_id} | Get Submission +[**encloseMooseSubmitSolution**](EncloseMooseApi.md#enclosemoosesubmitsolution) | **POST** /enclose-moose/submissions/{level_id} | Submit Solution + + +# **encloseMooseAdminCreateLevel** +> EncloseMooseLevelRead encloseMooseAdminCreateLevel(encloseMooseLevelCreate) + +Admin Create Level + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final EncloseMooseLevelCreate encloseMooseLevelCreate = ; // EncloseMooseLevelCreate | + +try { + final response = api.encloseMooseAdminCreateLevel(encloseMooseLevelCreate); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseAdminCreateLevel: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **encloseMooseLevelCreate** | [**EncloseMooseLevelCreate**](EncloseMooseLevelCreate.md)| | + +### Return type + +[**EncloseMooseLevelRead**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseAdminDeleteLevel** +> EncloseMooseLevelRead encloseMooseAdminDeleteLevel(levelId) + +Admin Delete Level + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final int levelId = 56; // int | + +try { + final response = api.encloseMooseAdminDeleteLevel(levelId); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseAdminDeleteLevel: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **levelId** | **int**| | + +### Return type + +[**EncloseMooseLevelRead**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseAdminGetAllLevelSubmissions** +> BuiltList encloseMooseAdminGetAllLevelSubmissions(levelId) + +Admin Get All Level Submissions + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final int levelId = 56; // int | + +try { + final response = api.encloseMooseAdminGetAllLevelSubmissions(levelId); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseAdminGetAllLevelSubmissions: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **levelId** | **int**| | + +### Return type + +[**BuiltList<EncloseMooseSubmissionRead>**](EncloseMooseSubmissionRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseAdminGetAllLevels** +> BuiltList encloseMooseAdminGetAllLevels() + +Admin Get All Levels + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); + +try { + final response = api.encloseMooseAdminGetAllLevels(); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseAdminGetAllLevels: $e\n'); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +[**BuiltList<EncloseMooseLevelRead>**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseAdminGetLevel** +> EncloseMooseLevelRead encloseMooseAdminGetLevel(levelId) + +Admin Get Level + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final int levelId = 56; // int | + +try { + final response = api.encloseMooseAdminGetLevel(levelId); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseAdminGetLevel: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **levelId** | **int**| | + +### Return type + +[**EncloseMooseLevelRead**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseAdminUpdateLevel** +> EncloseMooseLevelRead encloseMooseAdminUpdateLevel(levelId, encloseMooseLevelUpdate) + +Admin Update Level + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final int levelId = 56; // int | +final EncloseMooseLevelUpdate encloseMooseLevelUpdate = ; // EncloseMooseLevelUpdate | + +try { + final response = api.encloseMooseAdminUpdateLevel(levelId, encloseMooseLevelUpdate); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseAdminUpdateLevel: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **levelId** | **int**| | + **encloseMooseLevelUpdate** | [**EncloseMooseLevelUpdate**](EncloseMooseLevelUpdate.md)| | + +### Return type + +[**EncloseMooseLevelRead**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseGetAllLevels** +> BuiltList encloseMooseGetAllLevels() + +Get All Levels + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); + +try { + final response = api.encloseMooseGetAllLevels(); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseGetAllLevels: $e\n'); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +[**BuiltList<EncloseMooseLevelRead>**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseGetAllSubmissions** +> BuiltList encloseMooseGetAllSubmissions() + +Get All Submissions + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); + +try { + final response = api.encloseMooseGetAllSubmissions(); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseGetAllSubmissions: $e\n'); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +[**BuiltList<EncloseMooseSubmissionRead>**](EncloseMooseSubmissionRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseGetLevel** +> EncloseMooseLevelRead encloseMooseGetLevel(levelId) + +Get Level + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final int levelId = 56; // int | + +try { + final response = api.encloseMooseGetLevel(levelId); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseGetLevel: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **levelId** | **int**| | + +### Return type + +[**EncloseMooseLevelRead**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseGetSubmission** +> EncloseMooseSubmissionRead encloseMooseGetSubmission(levelId) + +Get Submission + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final int levelId = 56; // int | + +try { + final response = api.encloseMooseGetSubmission(levelId); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseGetSubmission: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **levelId** | **int**| | + +### Return type + +[**EncloseMooseSubmissionRead**](EncloseMooseSubmissionRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **encloseMooseSubmitSolution** +> EncloseMooseLevelRead encloseMooseSubmitSolution(levelId, encloseMooseSubmissionCreate) + +Submit Solution + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEncloseMooseApi(); +final int levelId = 56; // int | +final EncloseMooseSubmissionCreate encloseMooseSubmissionCreate = ; // EncloseMooseSubmissionCreate | + +try { + final response = api.encloseMooseSubmitSolution(levelId, encloseMooseSubmissionCreate); + print(response); +} on DioException catch (e) { + print('Exception when calling EncloseMooseApi->encloseMooseSubmitSolution: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **levelId** | **int**| | + **encloseMooseSubmissionCreate** | [**EncloseMooseSubmissionCreate**](EncloseMooseSubmissionCreate.md)| | + +### Return type + +[**EncloseMooseLevelRead**](EncloseMooseLevelRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/lib/api_client/doc/EncloseMooseLevelCreate.md b/lib/api_client/doc/EncloseMooseLevelCreate.md new file mode 100644 index 00000000..769214b9 --- /dev/null +++ b/lib/api_client/doc/EncloseMooseLevelCreate.md @@ -0,0 +1,20 @@ +# api_client.model.EncloseMooseLevelCreate + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**releaseDate** | [**Date**](Date.md) | | [optional] +**dayIndex** | **int** | | [optional] +**nameSv** | **String** | | +**nameEn** | **String** | | +**encodedGrid** | **String** | | +**wallBudget** | **int** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/EncloseMooseLevelRead.md b/lib/api_client/doc/EncloseMooseLevelRead.md new file mode 100644 index 00000000..d5f4698b --- /dev/null +++ b/lib/api_client/doc/EncloseMooseLevelRead.md @@ -0,0 +1,26 @@ +# api_client.model.EncloseMooseLevelRead + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**levelId** | **int** | | +**releaseDate** | [**Date**](Date.md) | | +**dayIndex** | **int** | | +**nameSv** | **String** | | +**nameEn** | **String** | | +**encodedGrid** | **String** | | +**wallBudget** | **int** | | +**optimalScore** | **int** | | [optional] +**optimalSolution** | **BuiltSet<int>** | | [optional] +**optimalIsUnique** | **bool** | | [optional] +**playerSubmission** | [**EncloseMooseSubmissionRead**](EncloseMooseSubmissionRead.md) | | [optional] +**scoreDistribution** | **BuiltMap<String, int>** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/EncloseMooseLevelUpdate.md b/lib/api_client/doc/EncloseMooseLevelUpdate.md new file mode 100644 index 00000000..d8387b47 --- /dev/null +++ b/lib/api_client/doc/EncloseMooseLevelUpdate.md @@ -0,0 +1,20 @@ +# api_client.model.EncloseMooseLevelUpdate + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**releaseDate** | [**Date**](Date.md) | | [optional] +**dayIndex** | **int** | | [optional] +**nameSv** | **String** | | [optional] +**nameEn** | **String** | | [optional] +**encodedGrid** | **String** | | [optional] +**wallBudget** | **int** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/EncloseMooseSubmissionCreate.md b/lib/api_client/doc/EncloseMooseSubmissionCreate.md new file mode 100644 index 00000000..3a804cb0 --- /dev/null +++ b/lib/api_client/doc/EncloseMooseSubmissionCreate.md @@ -0,0 +1,15 @@ +# api_client.model.EncloseMooseSubmissionCreate + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**playerSolution** | **BuiltSet<int>** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/EncloseMooseSubmissionRead.md b/lib/api_client/doc/EncloseMooseSubmissionRead.md new file mode 100644 index 00000000..7e20c9d5 --- /dev/null +++ b/lib/api_client/doc/EncloseMooseSubmissionRead.md @@ -0,0 +1,19 @@ +# api_client.model.EncloseMooseSubmissionRead + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**levelId** | **int** | | +**submissionTime** | [**DateTime**](DateTime.md) | | +**playerId** | **int** | | +**playerScore** | **int** | | +**playerSolution** | **BuiltSet<int>** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/EventCreate.md b/lib/api_client/doc/EventCreate.md index 6ec1d91b..95ec0066 100644 --- a/lib/api_client/doc/EventCreate.md +++ b/lib/api_client/doc/EventCreate.md @@ -27,6 +27,8 @@ Name | Type | Description | Notes **canSignup** | **bool** | | **drinkPackage** | **bool** | | **isNollningEvent** | **bool** | | +**mentorGroupTypes** | **BuiltList<String>** | | +**allowOtherMentors** | **bool** | | **alcoholEventType** | **String** | | **dressCode** | **String** | | **price** | **int** | | diff --git a/lib/api_client/doc/EventRead.md b/lib/api_client/doc/EventRead.md index 4bdf5a1d..202c2673 100644 --- a/lib/api_client/doc/EventRead.md +++ b/lib/api_client/doc/EventRead.md @@ -29,6 +29,8 @@ Name | Type | Description | Notes **canSignup** | **bool** | | **drinkPackage** | **bool** | | **isNollningEvent** | **bool** | | +**mentorGroupTypes** | **BuiltList<String>** | | +**allowOtherMentors** | **bool** | | **alcoholEventType** | **String** | | **dressCode** | **String** | | **price** | **int** | | diff --git a/lib/api_client/doc/EventSignupApi.md b/lib/api_client/doc/EventSignupApi.md index cbc87d42..04f58d16 100644 --- a/lib/api_client/doc/EventSignupApi.md +++ b/lib/api_client/doc/EventSignupApi.md @@ -12,6 +12,7 @@ Method | HTTP request | Description [**eventSignupEventSignoffRoute**](EventSignupApi.md#eventsignupeventsignoffroute) | **DELETE** /event-signup/{event_id} | Event Signoff Route [**eventSignupEventSignupRoute**](EventSignupApi.md#eventsignupeventsignuproute) | **POST** /event-signup/{event_id} | Event Signup Route [**eventSignupGetMeEventSignup**](EventSignupApi.md#eventsignupgetmeeventsignup) | **GET** /event-signup/me-signup/{event_id} | Get Me Event Signup +[**eventSignupGetMeForEventSignup**](EventSignupApi.md#eventsignupgetmeforeventsignup) | **GET** /event-signup/me/{event_id} | Get Me For Event Signup [**eventSignupUpdateEventSignupRoute**](EventSignupApi.md#eventsignupupdateeventsignuproute) | **PATCH** /event-signup/{event_id} | Update Event Signup Route @@ -160,6 +161,53 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **eventSignupGetMeForEventSignup** +> UserForEventSignupRead eventSignupGetMeForEventSignup(eventId) + +Get Me For Event Signup + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getEventSignupApi(); +final int eventId = 56; // int | + +try { + final response = api.eventSignupGetMeForEventSignup(eventId); + print(response); +} on DioException catch (e) { + print('Exception when calling EventSignupApi->eventSignupGetMeForEventSignup: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **eventId** | **int**| | + +### Return type + +[**UserForEventSignupRead**](UserForEventSignupRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **eventSignupUpdateEventSignupRoute** > EventSignupRead eventSignupUpdateEventSignupRoute(eventId, eventSignupUpdate) diff --git a/lib/api_client/doc/EventUpdate.md b/lib/api_client/doc/EventUpdate.md index eca4e92a..5bf01658 100644 --- a/lib/api_client/doc/EventUpdate.md +++ b/lib/api_client/doc/EventUpdate.md @@ -26,11 +26,14 @@ Name | Type | Description | Notes **canSignup** | **bool** | | [optional] **drinkPackage** | **bool** | | [optional] **isNollningEvent** | **bool** | | [optional] +**mentorGroupTypes** | **BuiltList<String>** | | [optional] +**allowOtherMentors** | **bool** | | [optional] **priorities** | **BuiltList<String>** | | [optional] **alcoholEventType** | **String** | | [optional] **dressCode** | **String** | | [optional] **price** | **int** | | [optional] **dot** | **String** | | [optional] +**lottery** | **bool** | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/lib/api_client/doc/EventsApi.md b/lib/api_client/doc/EventsApi.md index ab4e7119..133da28d 100644 --- a/lib/api_client/doc/EventsApi.md +++ b/lib/api_client/doc/EventsApi.md @@ -132,6 +132,12 @@ Confirm Places ### Example ```dart import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; final api = ApiClient().getEventsApi(); final int eventId = 56; // int | @@ -156,7 +162,7 @@ Name | Type | Description | Notes ### Authorization -No authorization required +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) ### HTTP request headers diff --git a/lib/api_client/doc/PreregMemberCreate.md b/lib/api_client/doc/PreregMemberCreate.md new file mode 100644 index 00000000..d66dd856 --- /dev/null +++ b/lib/api_client/doc/PreregMemberCreate.md @@ -0,0 +1,17 @@ +# api_client.model.PreregMemberCreate + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**telephoneNumber** | **String** | | [optional] +**stilId** | **String** | | [optional] +**email** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/PreregMemberRead.md b/lib/api_client/doc/PreregMemberRead.md new file mode 100644 index 00000000..268b598a --- /dev/null +++ b/lib/api_client/doc/PreregMemberRead.md @@ -0,0 +1,18 @@ +# api_client.model.PreregMemberRead + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**preregMemberId** | **int** | | +**telephoneNumber** | **String** | | [optional] +**stilId** | **String** | | [optional] +**email** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/PreregMemberUpdate.md b/lib/api_client/doc/PreregMemberUpdate.md new file mode 100644 index 00000000..db294d12 --- /dev/null +++ b/lib/api_client/doc/PreregMemberUpdate.md @@ -0,0 +1,17 @@ +# api_client.model.PreregMemberUpdate + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**telephoneNumber** | **String** | | [optional] +**stilId** | **String** | | [optional] +**email** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/PreregMembersApi.md b/lib/api_client/doc/PreregMembersApi.md new file mode 100644 index 00000000..8ef3dc7d --- /dev/null +++ b/lib/api_client/doc/PreregMembersApi.md @@ -0,0 +1,347 @@ +# api_client.api.PreregMembersApi + +## Load the API package +```dart +import 'package:api_client/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**preregMembersCreateMultiplePreregMembers**](PreregMembersApi.md#preregmemberscreatemultiplepreregmembers) | **POST** /prereg-members/multiple | Create Multiple Prereg Members +[**preregMembersCreatePreregMember**](PreregMembersApi.md#preregmemberscreatepreregmember) | **POST** /prereg-members/ | Create Prereg Member +[**preregMembersDeleteMultiplePreregMembers**](PreregMembersApi.md#preregmembersdeletemultiplepreregmembers) | **DELETE** /prereg-members/multiple | Delete Multiple Prereg Members +[**preregMembersDeletePreregMember**](PreregMembersApi.md#preregmembersdeletepreregmember) | **DELETE** /prereg-members/{prereg_member_id} | Delete Prereg Member +[**preregMembersGetAllPreregMemberInfo**](PreregMembersApi.md#preregmembersgetallpreregmemberinfo) | **GET** /prereg-members/ | Get All Prereg Member Info +[**preregMembersGetPreregMemberInfo**](PreregMembersApi.md#preregmembersgetpreregmemberinfo) | **GET** /prereg-members/{prereg_member_id} | Get Prereg Member Info +[**preregMembersUpdatePreregMember**](PreregMembersApi.md#preregmembersupdatepreregmember) | **PATCH** /prereg-members/{prereg_member_id} | Update Prereg Member + + +# **preregMembersCreateMultiplePreregMembers** +> BuiltList preregMembersCreateMultiplePreregMembers(preregMemberCreate) + +Create Multiple Prereg Members + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getPreregMembersApi(); +final BuiltList preregMemberCreate = ; // BuiltList | + +try { + final response = api.preregMembersCreateMultiplePreregMembers(preregMemberCreate); + print(response); +} on DioException catch (e) { + print('Exception when calling PreregMembersApi->preregMembersCreateMultiplePreregMembers: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **preregMemberCreate** | [**BuiltList<PreregMemberCreate>**](PreregMemberCreate.md)| | + +### Return type + +[**BuiltList<PreregMemberRead>**](PreregMemberRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preregMembersCreatePreregMember** +> PreregMemberRead preregMembersCreatePreregMember(preregMemberCreate) + +Create Prereg Member + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getPreregMembersApi(); +final PreregMemberCreate preregMemberCreate = ; // PreregMemberCreate | + +try { + final response = api.preregMembersCreatePreregMember(preregMemberCreate); + print(response); +} on DioException catch (e) { + print('Exception when calling PreregMembersApi->preregMembersCreatePreregMember: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **preregMemberCreate** | [**PreregMemberCreate**](PreregMemberCreate.md)| | + +### Return type + +[**PreregMemberRead**](PreregMemberRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preregMembersDeleteMultiplePreregMembers** +> BuiltList preregMembersDeleteMultiplePreregMembers(requestBody) + +Delete Multiple Prereg Members + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getPreregMembersApi(); +final BuiltList requestBody = ; // BuiltList | + +try { + final response = api.preregMembersDeleteMultiplePreregMembers(requestBody); + print(response); +} on DioException catch (e) { + print('Exception when calling PreregMembersApi->preregMembersDeleteMultiplePreregMembers: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **requestBody** | [**BuiltList<int>**](int.md)| | + +### Return type + +[**BuiltList<PreregMemberRead>**](PreregMemberRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preregMembersDeletePreregMember** +> PreregMemberRead preregMembersDeletePreregMember(preregMemberId) + +Delete Prereg Member + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getPreregMembersApi(); +final int preregMemberId = 56; // int | + +try { + final response = api.preregMembersDeletePreregMember(preregMemberId); + print(response); +} on DioException catch (e) { + print('Exception when calling PreregMembersApi->preregMembersDeletePreregMember: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **preregMemberId** | **int**| | + +### Return type + +[**PreregMemberRead**](PreregMemberRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preregMembersGetAllPreregMemberInfo** +> BuiltList preregMembersGetAllPreregMemberInfo() + +Get All Prereg Member Info + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getPreregMembersApi(); + +try { + final response = api.preregMembersGetAllPreregMemberInfo(); + print(response); +} on DioException catch (e) { + print('Exception when calling PreregMembersApi->preregMembersGetAllPreregMemberInfo: $e\n'); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +[**BuiltList<PreregMemberRead>**](PreregMemberRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preregMembersGetPreregMemberInfo** +> PreregMemberRead preregMembersGetPreregMemberInfo(preregMemberId) + +Get Prereg Member Info + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getPreregMembersApi(); +final int preregMemberId = 56; // int | + +try { + final response = api.preregMembersGetPreregMemberInfo(preregMemberId); + print(response); +} on DioException catch (e) { + print('Exception when calling PreregMembersApi->preregMembersGetPreregMemberInfo: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **preregMemberId** | **int**| | + +### Return type + +[**PreregMemberRead**](PreregMemberRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preregMembersUpdatePreregMember** +> PreregMemberRead preregMembersUpdatePreregMember(preregMemberId, preregMemberUpdate) + +Update Prereg Member + +### Example +```dart +import 'package:api_client/api.dart'; +// TODO Configure OAuth2 access token for authorization: OAuth2PasswordBearer +//defaultApiClient.getAuthentication('OAuth2PasswordBearer').accessToken = 'YOUR_ACCESS_TOKEN'; +// TODO Configure API key authorization: APIKeyCookie +//defaultApiClient.getAuthentication('APIKeyCookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('APIKeyCookie').apiKeyPrefix = 'Bearer'; + +final api = ApiClient().getPreregMembersApi(); +final int preregMemberId = 56; // int | +final PreregMemberUpdate preregMemberUpdate = ; // PreregMemberUpdate | + +try { + final response = api.preregMembersUpdatePreregMember(preregMemberId, preregMemberUpdate); + print(response); +} on DioException catch (e) { + print('Exception when calling PreregMembersApi->preregMembersUpdatePreregMember: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **preregMemberId** | **int**| | + **preregMemberUpdate** | [**PreregMemberUpdate**](PreregMemberUpdate.md)| | + +### Return type + +[**PreregMemberRead**](PreregMemberRead.md) + +### Authorization + +[OAuth2PasswordBearer](../README.md#OAuth2PasswordBearer), [APIKeyCookie](../README.md#APIKeyCookie) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/lib/api_client/doc/UserCreate.md b/lib/api_client/doc/UserCreate.md index 2430f299..f15fd511 100644 --- a/lib/api_client/doc/UserCreate.md +++ b/lib/api_client/doc/UserCreate.md @@ -13,6 +13,7 @@ Name | Type | Description | Notes **isActive** | **bool** | | [optional] **isSuperuser** | **bool** | | [optional] **isVerified** | **bool** | | [optional] +**stilId** | **String** | | [optional] **firstName** | **String** | | **lastName** | **String** | | **telephoneNumber** | **String** | | diff --git a/lib/api_client/doc/UserForEventSignupRead.md b/lib/api_client/doc/UserForEventSignupRead.md new file mode 100644 index 00000000..f98e496b --- /dev/null +++ b/lib/api_client/doc/UserForEventSignupRead.md @@ -0,0 +1,20 @@ +# api_client.model.UserForEventSignupRead + +## Load the model package +```dart +import 'package:api_client/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | +**firstName** | **String** | | +**lastName** | **String** | | +**groups** | [**BuiltList<GroupRead>**](GroupRead.md) | | +**standardFoodPreferences** | **BuiltList<String>** | | +**otherFoodPreferences** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/api_client/doc/UserUpdate.md b/lib/api_client/doc/UserUpdate.md index 8092a96c..de13b4e4 100644 --- a/lib/api_client/doc/UserUpdate.md +++ b/lib/api_client/doc/UserUpdate.md @@ -8,12 +8,12 @@ import 'package:api_client/api.dart'; ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- +**stilId** | **String** | | [optional] **firstName** | **String** | | [optional] **lastName** | **String** | | [optional] **startYear** | **int** | | [optional] **program** | **String** | | [optional] **notifications** | **bool** | | [optional] -**stilId** | **String** | | [optional] **standardFoodPreferences** | **BuiltList<String>** | | [optional] **otherFoodPreferences** | **String** | | [optional] **telephoneNumber** | **String** | | [optional] diff --git a/lib/api_client/lib/api_client.dart b/lib/api_client/lib/api_client.dart index 12ec5de7..39a4d118 100644 --- a/lib/api_client/lib/api_client.dart +++ b/lib/api_client/lib/api_client.dart @@ -22,6 +22,7 @@ export 'package:api_client/src/api/council_api.dart'; export 'package:api_client/src/api/default_api.dart'; export 'package:api_client/src/api/document_api.dart'; export 'package:api_client/src/api/elections_api.dart'; +export 'package:api_client/src/api/enclose_moose_api.dart'; export 'package:api_client/src/api/event_signup_api.dart'; export 'package:api_client/src/api/events_api.dart'; export 'package:api_client/src/api/groups_api.dart'; @@ -35,6 +36,7 @@ export 'package:api_client/src/api/nollning_api.dart'; export 'package:api_client/src/api/nominations_api.dart'; export 'package:api_client/src/api/permissions_api.dart'; export 'package:api_client/src/api/posts_api.dart'; +export 'package:api_client/src/api/prereg_members_api.dart'; export 'package:api_client/src/api/room_booking_api.dart'; export 'package:api_client/src/api/songs_api.dart'; export 'package:api_client/src/api/songs_category_api.dart'; @@ -89,6 +91,11 @@ export 'package:api_client/src/model/election_populate.dart'; export 'package:api_client/src/model/election_post_read.dart'; export 'package:api_client/src/model/election_read.dart'; export 'package:api_client/src/model/election_update.dart'; +export 'package:api_client/src/model/enclose_moose_level_create.dart'; +export 'package:api_client/src/model/enclose_moose_level_read.dart'; +export 'package:api_client/src/model/enclose_moose_level_update.dart'; +export 'package:api_client/src/model/enclose_moose_submission_create.dart'; +export 'package:api_client/src/model/enclose_moose_submission_read.dart'; export 'package:api_client/src/model/error_model.dart'; export 'package:api_client/src/model/event_create.dart'; export 'package:api_client/src/model/event_read.dart'; @@ -134,6 +141,9 @@ export 'package:api_client/src/model/post_door_access_read.dart'; export 'package:api_client/src/model/post_permission_read.dart'; export 'package:api_client/src/model/post_read.dart'; export 'package:api_client/src/model/post_update.dart'; +export 'package:api_client/src/model/prereg_member_create.dart'; +export 'package:api_client/src/model/prereg_member_read.dart'; +export 'package:api_client/src/model/prereg_member_update.dart'; export 'package:api_client/src/model/priority_db.dart'; export 'package:api_client/src/model/room_booking_create.dart'; export 'package:api_client/src/model/room_booking_read.dart'; @@ -164,6 +174,7 @@ export 'package:api_client/src/model/user_access_read.dart'; export 'package:api_client/src/model/user_access_update.dart'; export 'package:api_client/src/model/user_create.dart'; export 'package:api_client/src/model/user_event_read.dart'; +export 'package:api_client/src/model/user_for_event_signup_read.dart'; export 'package:api_client/src/model/user_in_event_read.dart'; export 'package:api_client/src/model/user_in_group_read.dart'; export 'package:api_client/src/model/user_post_read.dart'; diff --git a/lib/api_client/lib/src/api.dart b/lib/api_client/lib/src/api.dart index 04b40cb2..348076f6 100644 --- a/lib/api_client/lib/src/api.dart +++ b/lib/api_client/lib/src/api.dart @@ -21,6 +21,7 @@ import 'package:api_client/src/api/council_api.dart'; import 'package:api_client/src/api/default_api.dart'; import 'package:api_client/src/api/document_api.dart'; import 'package:api_client/src/api/elections_api.dart'; +import 'package:api_client/src/api/enclose_moose_api.dart'; import 'package:api_client/src/api/event_signup_api.dart'; import 'package:api_client/src/api/events_api.dart'; import 'package:api_client/src/api/groups_api.dart'; @@ -34,6 +35,7 @@ import 'package:api_client/src/api/nollning_api.dart'; import 'package:api_client/src/api/nominations_api.dart'; import 'package:api_client/src/api/permissions_api.dart'; import 'package:api_client/src/api/posts_api.dart'; +import 'package:api_client/src/api/prereg_members_api.dart'; import 'package:api_client/src/api/room_booking_api.dart'; import 'package:api_client/src/api/songs_api.dart'; import 'package:api_client/src/api/songs_category_api.dart'; @@ -208,6 +210,12 @@ class ApiClient { return ElectionsApi(dio, serializers); } + /// Get EncloseMooseApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + EncloseMooseApi getEncloseMooseApi() { + return EncloseMooseApi(dio, serializers); + } + /// Get EventSignupApi instance, base route and serializer can be overridden by a given but be careful, /// by doing that all interceptors will not be executed EventSignupApi getEventSignupApi() { @@ -286,6 +294,12 @@ class ApiClient { return PostsApi(dio, serializers); } + /// Get PreregMembersApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + PreregMembersApi getPreregMembersApi() { + return PreregMembersApi(dio, serializers); + } + /// Get RoomBookingApi instance, base route and serializer can be overridden by a given but be careful, /// by doing that all interceptors will not be executed RoomBookingApi getRoomBookingApi() { diff --git a/lib/api_client/lib/src/api/enclose_moose_api.dart b/lib/api_client/lib/src/api/enclose_moose_api.dart new file mode 100644 index 00000000..b6d7277f --- /dev/null +++ b/lib/api_client/lib/src/api/enclose_moose_api.dart @@ -0,0 +1,1021 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:api_client/src/api_util.dart'; +import 'package:api_client/src/model/enclose_moose_level_create.dart'; +import 'package:api_client/src/model/enclose_moose_level_read.dart'; +import 'package:api_client/src/model/enclose_moose_level_update.dart'; +import 'package:api_client/src/model/enclose_moose_submission_create.dart'; +import 'package:api_client/src/model/enclose_moose_submission_read.dart'; +import 'package:api_client/src/model/http_validation_error.dart'; +import 'package:built_collection/built_collection.dart'; + +class EncloseMooseApi { + + final Dio _dio; + + final Serializers _serializers; + + const EncloseMooseApi(this._dio, this._serializers); + + /// Admin Create Level + /// + /// + /// Parameters: + /// * [encloseMooseLevelCreate] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [EncloseMooseLevelRead] as data + /// Throws [DioException] if API call or serialization fails + Future> encloseMooseAdminCreateLevel({ + required EncloseMooseLevelCreate encloseMooseLevelCreate, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/admin/levels'; + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(EncloseMooseLevelCreate); + _bodyData = _serializers.serialize(encloseMooseLevelCreate, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + EncloseMooseLevelRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(EncloseMooseLevelRead), + ) as EncloseMooseLevelRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Admin Delete Level + /// + /// + /// Parameters: + /// * [levelId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [EncloseMooseLevelRead] as data + /// Throws [DioException] if API call or serialization fails + Future> encloseMooseAdminDeleteLevel({ + required int levelId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/admin/levels/{level_id}'.replaceAll('{' r'level_id' '}', encodeQueryParameter(_serializers, levelId, const FullType(int)).toString()); + final _options = Options( + method: r'DELETE', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + EncloseMooseLevelRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(EncloseMooseLevelRead), + ) as EncloseMooseLevelRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Admin Get All Level Submissions + /// + /// + /// Parameters: + /// * [levelId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioException] if API call or serialization fails + Future>> encloseMooseAdminGetAllLevelSubmissions({ + required int levelId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/admin/submissions/{level_id}'.replaceAll('{' r'level_id' '}', encodeQueryParameter(_serializers, levelId, const FullType(int)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(BuiltList, [FullType(EncloseMooseSubmissionRead)]), + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Admin Get All Levels + /// + /// + /// Parameters: + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioException] if API call or serialization fails + Future>> encloseMooseAdminGetAllLevels({ + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/admin/levels'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(BuiltList, [FullType(EncloseMooseLevelRead)]), + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Admin Get Level + /// + /// + /// Parameters: + /// * [levelId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [EncloseMooseLevelRead] as data + /// Throws [DioException] if API call or serialization fails + Future> encloseMooseAdminGetLevel({ + required int levelId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/admin/levels/{level_id}'.replaceAll('{' r'level_id' '}', encodeQueryParameter(_serializers, levelId, const FullType(int)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + EncloseMooseLevelRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(EncloseMooseLevelRead), + ) as EncloseMooseLevelRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Admin Update Level + /// + /// + /// Parameters: + /// * [levelId] + /// * [encloseMooseLevelUpdate] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [EncloseMooseLevelRead] as data + /// Throws [DioException] if API call or serialization fails + Future> encloseMooseAdminUpdateLevel({ + required int levelId, + required EncloseMooseLevelUpdate encloseMooseLevelUpdate, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/admin/levels/{level_id}'.replaceAll('{' r'level_id' '}', encodeQueryParameter(_serializers, levelId, const FullType(int)).toString()); + final _options = Options( + method: r'PATCH', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(EncloseMooseLevelUpdate); + _bodyData = _serializers.serialize(encloseMooseLevelUpdate, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + EncloseMooseLevelRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(EncloseMooseLevelRead), + ) as EncloseMooseLevelRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Get All Levels + /// + /// + /// Parameters: + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioException] if API call or serialization fails + Future>> encloseMooseGetAllLevels({ + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/levels'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(BuiltList, [FullType(EncloseMooseLevelRead)]), + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Get All Submissions + /// + /// + /// Parameters: + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioException] if API call or serialization fails + Future>> encloseMooseGetAllSubmissions({ + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/submissions'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(BuiltList, [FullType(EncloseMooseSubmissionRead)]), + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Get Level + /// + /// + /// Parameters: + /// * [levelId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [EncloseMooseLevelRead] as data + /// Throws [DioException] if API call or serialization fails + Future> encloseMooseGetLevel({ + required int levelId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/levels/{level_id}'.replaceAll('{' r'level_id' '}', encodeQueryParameter(_serializers, levelId, const FullType(int)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + EncloseMooseLevelRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(EncloseMooseLevelRead), + ) as EncloseMooseLevelRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Get Submission + /// + /// + /// Parameters: + /// * [levelId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [EncloseMooseSubmissionRead] as data + /// Throws [DioException] if API call or serialization fails + Future> encloseMooseGetSubmission({ + required int levelId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/submissions/{level_id}'.replaceAll('{' r'level_id' '}', encodeQueryParameter(_serializers, levelId, const FullType(int)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + EncloseMooseSubmissionRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(EncloseMooseSubmissionRead), + ) as EncloseMooseSubmissionRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Submit Solution + /// + /// + /// Parameters: + /// * [levelId] + /// * [encloseMooseSubmissionCreate] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [EncloseMooseLevelRead] as data + /// Throws [DioException] if API call or serialization fails + Future> encloseMooseSubmitSolution({ + required int levelId, + required EncloseMooseSubmissionCreate encloseMooseSubmissionCreate, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/enclose-moose/submissions/{level_id}'.replaceAll('{' r'level_id' '}', encodeQueryParameter(_serializers, levelId, const FullType(int)).toString()); + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(EncloseMooseSubmissionCreate); + _bodyData = _serializers.serialize(encloseMooseSubmissionCreate, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + EncloseMooseLevelRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(EncloseMooseLevelRead), + ) as EncloseMooseLevelRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/lib/api_client/lib/src/api/event_signup_api.dart b/lib/api_client/lib/src/api/event_signup_api.dart index 3d06ec78..493c5f24 100644 --- a/lib/api_client/lib/src/api/event_signup_api.dart +++ b/lib/api_client/lib/src/api/event_signup_api.dart @@ -13,6 +13,7 @@ import 'package:api_client/src/model/event_signup_create.dart'; import 'package:api_client/src/model/event_signup_read.dart'; import 'package:api_client/src/model/event_signup_update.dart'; import 'package:api_client/src/model/http_validation_error.dart'; +import 'package:api_client/src/model/user_for_event_signup_read.dart'; class EventSignupApi { @@ -306,6 +307,91 @@ class EventSignupApi { ); } + /// Get Me For Event Signup + /// + /// + /// Parameters: + /// * [eventId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [UserForEventSignupRead] as data + /// Throws [DioException] if API call or serialization fails + Future> eventSignupGetMeForEventSignup({ + required int eventId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/event-signup/me/{event_id}'.replaceAll('{' r'event_id' '}', encodeQueryParameter(_serializers, eventId, const FullType(int)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + UserForEventSignupRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(UserForEventSignupRead), + ) as UserForEventSignupRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + /// Update Event Signup Route /// /// diff --git a/lib/api_client/lib/src/api/events_api.dart b/lib/api_client/lib/src/api/events_api.dart index 310398e1..9bc38aad 100644 --- a/lib/api_client/lib/src/api/events_api.dart +++ b/lib/api_client/lib/src/api/events_api.dart @@ -269,7 +269,17 @@ class EventsApi { ...?headers, }, extra: { - 'secure': >[], + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], ...?extra, }, validateStatus: validateStatus, diff --git a/lib/api_client/lib/src/api/prereg_members_api.dart b/lib/api_client/lib/src/api/prereg_members_api.dart new file mode 100644 index 00000000..1060f042 --- /dev/null +++ b/lib/api_client/lib/src/api/prereg_members_api.dart @@ -0,0 +1,701 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:api_client/src/api_util.dart'; +import 'package:api_client/src/model/http_validation_error.dart'; +import 'package:api_client/src/model/prereg_member_create.dart'; +import 'package:api_client/src/model/prereg_member_read.dart'; +import 'package:api_client/src/model/prereg_member_update.dart'; +import 'package:built_collection/built_collection.dart'; + +class PreregMembersApi { + + final Dio _dio; + + final Serializers _serializers; + + const PreregMembersApi(this._dio, this._serializers); + + /// Create Multiple Prereg Members + /// + /// + /// Parameters: + /// * [preregMemberCreate] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioException] if API call or serialization fails + Future>> preregMembersCreateMultiplePreregMembers({ + required BuiltList preregMemberCreate, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/prereg-members/multiple'; + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(BuiltList, [FullType(PreregMemberCreate)]); + _bodyData = _serializers.serialize(preregMemberCreate, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(BuiltList, [FullType(PreregMemberRead)]), + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Create Prereg Member + /// + /// + /// Parameters: + /// * [preregMemberCreate] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [PreregMemberRead] as data + /// Throws [DioException] if API call or serialization fails + Future> preregMembersCreatePreregMember({ + required PreregMemberCreate preregMemberCreate, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/prereg-members/'; + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(PreregMemberCreate); + _bodyData = _serializers.serialize(preregMemberCreate, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + PreregMemberRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(PreregMemberRead), + ) as PreregMemberRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Delete Multiple Prereg Members + /// + /// + /// Parameters: + /// * [requestBody] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioException] if API call or serialization fails + Future>> preregMembersDeleteMultiplePreregMembers({ + required BuiltList requestBody, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/prereg-members/multiple'; + final _options = Options( + method: r'DELETE', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(BuiltList, [FullType(int)]); + _bodyData = _serializers.serialize(requestBody, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(BuiltList, [FullType(PreregMemberRead)]), + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Delete Prereg Member + /// + /// + /// Parameters: + /// * [preregMemberId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [PreregMemberRead] as data + /// Throws [DioException] if API call or serialization fails + Future> preregMembersDeletePreregMember({ + required int preregMemberId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/prereg-members/{prereg_member_id}'.replaceAll('{' r'prereg_member_id' '}', encodeQueryParameter(_serializers, preregMemberId, const FullType(int)).toString()); + final _options = Options( + method: r'DELETE', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + PreregMemberRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(PreregMemberRead), + ) as PreregMemberRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Get All Prereg Member Info + /// + /// + /// Parameters: + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioException] if API call or serialization fails + Future>> preregMembersGetAllPreregMemberInfo({ + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/prereg-members/'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(BuiltList, [FullType(PreregMemberRead)]), + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Get Prereg Member Info + /// + /// + /// Parameters: + /// * [preregMemberId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [PreregMemberRead] as data + /// Throws [DioException] if API call or serialization fails + Future> preregMembersGetPreregMemberInfo({ + required int preregMemberId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/prereg-members/{prereg_member_id}'.replaceAll('{' r'prereg_member_id' '}', encodeQueryParameter(_serializers, preregMemberId, const FullType(int)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + PreregMemberRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(PreregMemberRead), + ) as PreregMemberRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Update Prereg Member + /// + /// + /// Parameters: + /// * [preregMemberId] + /// * [preregMemberUpdate] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [PreregMemberRead] as data + /// Throws [DioException] if API call or serialization fails + Future> preregMembersUpdatePreregMember({ + required int preregMemberId, + required PreregMemberUpdate preregMemberUpdate, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/prereg-members/{prereg_member_id}'.replaceAll('{' r'prereg_member_id' '}', encodeQueryParameter(_serializers, preregMemberId, const FullType(int)).toString()); + final _options = Options( + method: r'PATCH', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'oauth2', + 'name': 'OAuth2PasswordBearer', + },{ + 'type': 'apiKey', + 'name': 'APIKeyCookie', + 'keyName': '__Secure-fsek_refresh_token', + 'where': '', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(PreregMemberUpdate); + _bodyData = _serializers.serialize(preregMemberUpdate, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + PreregMemberRead? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(PreregMemberRead), + ) as PreregMemberRead; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/lib/api_client/lib/src/model/adventure_mission_create.dart b/lib/api_client/lib/src/model/adventure_mission_create.dart index 848a7770..539713f5 100644 --- a/lib/api_client/lib/src/model/adventure_mission_create.dart +++ b/lib/api_client/lib/src/model/adventure_mission_create.dart @@ -3,6 +3,7 @@ // // ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; @@ -18,6 +19,10 @@ part 'adventure_mission_create.g.dart'; /// * [maxPoints] /// * [minPoints] /// * [nollningWeek] +/// * [missionCategory] +/// * [unlockCode] +/// * [unlockHintSv] +/// * [unlockHintEn] @BuiltValue() abstract class AdventureMissionCreate implements Built { @BuiltValueField(wireName: r'title_sv') @@ -41,6 +46,19 @@ abstract class AdventureMissionCreate implements Built get serializer => _$adventureMissionCreateMissionCategoryEnumSerializer; + + const AdventureMissionCreateMissionCategoryEnum._(String name): super(name); + + static BuiltSet get values => _$adventureMissionCreateMissionCategoryEnumValues; + static AdventureMissionCreateMissionCategoryEnum valueOf(String name) => _$adventureMissionCreateMissionCategoryEnumValueOf(name); +} + diff --git a/lib/api_client/lib/src/model/adventure_mission_read.dart b/lib/api_client/lib/src/model/adventure_mission_read.dart index 98ee4a4e..4a29c3aa 100644 --- a/lib/api_client/lib/src/model/adventure_mission_read.dart +++ b/lib/api_client/lib/src/model/adventure_mission_read.dart @@ -20,6 +20,10 @@ part 'adventure_mission_read.g.dart'; /// * [minPoints] /// * [nollningId] /// * [nollningWeek] +/// * [missionCategory] +/// * [unlockCode] +/// * [unlockHintSv] +/// * [unlockHintEn] /// * [createdAt] @BuiltValue() abstract class AdventureMissionRead implements Built { @@ -50,6 +54,18 @@ abstract class AdventureMissionRead implements Built { + @BuiltValueField(wireName: r'release_date') + Date? get releaseDate; + + @BuiltValueField(wireName: r'day_index') + int? get dayIndex; + + @BuiltValueField(wireName: r'name_sv') + String get nameSv; + + @BuiltValueField(wireName: r'name_en') + String get nameEn; + + @BuiltValueField(wireName: r'encoded_grid') + String get encodedGrid; + + @BuiltValueField(wireName: r'wall_budget') + int get wallBudget; + + EncloseMooseLevelCreate._(); + + factory EncloseMooseLevelCreate([void updates(EncloseMooseLevelCreateBuilder b)]) = _$EncloseMooseLevelCreate; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(EncloseMooseLevelCreateBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$EncloseMooseLevelCreateSerializer(); +} + +class _$EncloseMooseLevelCreateSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [EncloseMooseLevelCreate, _$EncloseMooseLevelCreate]; + + @override + final String wireName = r'EncloseMooseLevelCreate'; + + Iterable _serializeProperties( + Serializers serializers, + EncloseMooseLevelCreate object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.releaseDate != null) { + yield r'release_date'; + yield serializers.serialize( + object.releaseDate, + specifiedType: const FullType(Date), + ); + } + if (object.dayIndex != null) { + yield r'day_index'; + yield serializers.serialize( + object.dayIndex, + specifiedType: const FullType.nullable(int), + ); + } + yield r'name_sv'; + yield serializers.serialize( + object.nameSv, + specifiedType: const FullType(String), + ); + yield r'name_en'; + yield serializers.serialize( + object.nameEn, + specifiedType: const FullType(String), + ); + yield r'encoded_grid'; + yield serializers.serialize( + object.encodedGrid, + specifiedType: const FullType(String), + ); + yield r'wall_budget'; + yield serializers.serialize( + object.wallBudget, + specifiedType: const FullType(int), + ); + } + + @override + Object serialize( + Serializers serializers, + EncloseMooseLevelCreate object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required EncloseMooseLevelCreateBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'release_date': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Date), + ) as Date; + result.releaseDate = valueDes; + break; + case r'day_index': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(int), + ) as int?; + if (valueDes == null) continue; + result.dayIndex = valueDes; + break; + case r'name_sv': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.nameSv = valueDes; + break; + case r'name_en': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.nameEn = valueDes; + break; + case r'encoded_grid': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.encodedGrid = valueDes; + break; + case r'wall_budget': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.wallBudget = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + EncloseMooseLevelCreate deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = EncloseMooseLevelCreateBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/enclose_moose_level_read.dart b/lib/api_client/lib/src/model/enclose_moose_level_read.dart new file mode 100644 index 00000000..3fff2bd7 --- /dev/null +++ b/lib/api_client/lib/src/model/enclose_moose_level_read.dart @@ -0,0 +1,301 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:api_client/src/model/enclose_moose_submission_read.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:api_client/src/model/date.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'enclose_moose_level_read.g.dart'; + +/// EncloseMooseLevelRead +/// +/// Properties: +/// * [levelId] +/// * [releaseDate] +/// * [dayIndex] +/// * [nameSv] +/// * [nameEn] +/// * [encodedGrid] +/// * [wallBudget] +/// * [optimalScore] +/// * [optimalSolution] +/// * [optimalIsUnique] +/// * [playerSubmission] +/// * [scoreDistribution] +@BuiltValue() +abstract class EncloseMooseLevelRead implements Built { + @BuiltValueField(wireName: r'level_id') + int get levelId; + + @BuiltValueField(wireName: r'release_date') + Date get releaseDate; + + @BuiltValueField(wireName: r'day_index') + int? get dayIndex; + + @BuiltValueField(wireName: r'name_sv') + String get nameSv; + + @BuiltValueField(wireName: r'name_en') + String get nameEn; + + @BuiltValueField(wireName: r'encoded_grid') + String get encodedGrid; + + @BuiltValueField(wireName: r'wall_budget') + int get wallBudget; + + @BuiltValueField(wireName: r'optimal_score') + int? get optimalScore; + + @BuiltValueField(wireName: r'optimal_solution') + BuiltSet? get optimalSolution; + + @BuiltValueField(wireName: r'optimal_is_unique') + bool? get optimalIsUnique; + + @BuiltValueField(wireName: r'player_submission') + EncloseMooseSubmissionRead? get playerSubmission; + + @BuiltValueField(wireName: r'score_distribution') + BuiltMap? get scoreDistribution; + + EncloseMooseLevelRead._(); + + factory EncloseMooseLevelRead([void updates(EncloseMooseLevelReadBuilder b)]) = _$EncloseMooseLevelRead; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(EncloseMooseLevelReadBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$EncloseMooseLevelReadSerializer(); +} + +class _$EncloseMooseLevelReadSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [EncloseMooseLevelRead, _$EncloseMooseLevelRead]; + + @override + final String wireName = r'EncloseMooseLevelRead'; + + Iterable _serializeProperties( + Serializers serializers, + EncloseMooseLevelRead object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'level_id'; + yield serializers.serialize( + object.levelId, + specifiedType: const FullType(int), + ); + yield r'release_date'; + yield serializers.serialize( + object.releaseDate, + specifiedType: const FullType(Date), + ); + yield r'day_index'; + yield object.dayIndex == null ? null : serializers.serialize( + object.dayIndex, + specifiedType: const FullType.nullable(int), + ); + yield r'name_sv'; + yield serializers.serialize( + object.nameSv, + specifiedType: const FullType(String), + ); + yield r'name_en'; + yield serializers.serialize( + object.nameEn, + specifiedType: const FullType(String), + ); + yield r'encoded_grid'; + yield serializers.serialize( + object.encodedGrid, + specifiedType: const FullType(String), + ); + yield r'wall_budget'; + yield serializers.serialize( + object.wallBudget, + specifiedType: const FullType(int), + ); + if (object.optimalScore != null) { + yield r'optimal_score'; + yield serializers.serialize( + object.optimalScore, + specifiedType: const FullType.nullable(int), + ); + } + if (object.optimalSolution != null) { + yield r'optimal_solution'; + yield serializers.serialize( + object.optimalSolution, + specifiedType: const FullType.nullable(BuiltSet, [FullType(int)]), + ); + } + if (object.optimalIsUnique != null) { + yield r'optimal_is_unique'; + yield serializers.serialize( + object.optimalIsUnique, + specifiedType: const FullType.nullable(bool), + ); + } + if (object.playerSubmission != null) { + yield r'player_submission'; + yield serializers.serialize( + object.playerSubmission, + specifiedType: const FullType.nullable(EncloseMooseSubmissionRead), + ); + } + if (object.scoreDistribution != null) { + yield r'score_distribution'; + yield serializers.serialize( + object.scoreDistribution, + specifiedType: const FullType.nullable(BuiltMap, [FullType(String), FullType(int)]), + ); + } + } + + @override + Object serialize( + Serializers serializers, + EncloseMooseLevelRead object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required EncloseMooseLevelReadBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'level_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.levelId = valueDes; + break; + case r'release_date': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Date), + ) as Date; + result.releaseDate = valueDes; + break; + case r'day_index': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(int), + ) as int?; + if (valueDes == null) continue; + result.dayIndex = valueDes; + break; + case r'name_sv': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.nameSv = valueDes; + break; + case r'name_en': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.nameEn = valueDes; + break; + case r'encoded_grid': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.encodedGrid = valueDes; + break; + case r'wall_budget': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.wallBudget = valueDes; + break; + case r'optimal_score': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(int), + ) as int?; + if (valueDes == null) continue; + result.optimalScore = valueDes; + break; + case r'optimal_solution': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(BuiltSet, [FullType(int)]), + ) as BuiltSet?; + if (valueDes == null) continue; + result.optimalSolution.replace(valueDes); + break; + case r'optimal_is_unique': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(bool), + ) as bool?; + if (valueDes == null) continue; + result.optimalIsUnique = valueDes; + break; + case r'player_submission': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(EncloseMooseSubmissionRead), + ) as EncloseMooseSubmissionRead?; + if (valueDes == null) continue; + result.playerSubmission.replace(valueDes); + break; + case r'score_distribution': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(BuiltMap, [FullType(String), FullType(int)]), + ) as BuiltMap?; + if (valueDes == null) continue; + result.scoreDistribution.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + EncloseMooseLevelRead deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = EncloseMooseLevelReadBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/enclose_moose_level_update.dart b/lib/api_client/lib/src/model/enclose_moose_level_update.dart new file mode 100644 index 00000000..7176d640 --- /dev/null +++ b/lib/api_client/lib/src/model/enclose_moose_level_update.dart @@ -0,0 +1,205 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:api_client/src/model/date.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'enclose_moose_level_update.g.dart'; + +/// EncloseMooseLevelUpdate +/// +/// Properties: +/// * [releaseDate] +/// * [dayIndex] +/// * [nameSv] +/// * [nameEn] +/// * [encodedGrid] +/// * [wallBudget] +@BuiltValue() +abstract class EncloseMooseLevelUpdate implements Built { + @BuiltValueField(wireName: r'release_date') + Date? get releaseDate; + + @BuiltValueField(wireName: r'day_index') + int? get dayIndex; + + @BuiltValueField(wireName: r'name_sv') + String? get nameSv; + + @BuiltValueField(wireName: r'name_en') + String? get nameEn; + + @BuiltValueField(wireName: r'encoded_grid') + String? get encodedGrid; + + @BuiltValueField(wireName: r'wall_budget') + int? get wallBudget; + + EncloseMooseLevelUpdate._(); + + factory EncloseMooseLevelUpdate([void updates(EncloseMooseLevelUpdateBuilder b)]) = _$EncloseMooseLevelUpdate; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(EncloseMooseLevelUpdateBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$EncloseMooseLevelUpdateSerializer(); +} + +class _$EncloseMooseLevelUpdateSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [EncloseMooseLevelUpdate, _$EncloseMooseLevelUpdate]; + + @override + final String wireName = r'EncloseMooseLevelUpdate'; + + Iterable _serializeProperties( + Serializers serializers, + EncloseMooseLevelUpdate object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.releaseDate != null) { + yield r'release_date'; + yield serializers.serialize( + object.releaseDate, + specifiedType: const FullType.nullable(Date), + ); + } + if (object.dayIndex != null) { + yield r'day_index'; + yield serializers.serialize( + object.dayIndex, + specifiedType: const FullType.nullable(int), + ); + } + if (object.nameSv != null) { + yield r'name_sv'; + yield serializers.serialize( + object.nameSv, + specifiedType: const FullType.nullable(String), + ); + } + if (object.nameEn != null) { + yield r'name_en'; + yield serializers.serialize( + object.nameEn, + specifiedType: const FullType.nullable(String), + ); + } + if (object.encodedGrid != null) { + yield r'encoded_grid'; + yield serializers.serialize( + object.encodedGrid, + specifiedType: const FullType.nullable(String), + ); + } + if (object.wallBudget != null) { + yield r'wall_budget'; + yield serializers.serialize( + object.wallBudget, + specifiedType: const FullType.nullable(int), + ); + } + } + + @override + Object serialize( + Serializers serializers, + EncloseMooseLevelUpdate object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required EncloseMooseLevelUpdateBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'release_date': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(Date), + ) as Date?; + if (valueDes == null) continue; + result.releaseDate = valueDes; + break; + case r'day_index': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(int), + ) as int?; + if (valueDes == null) continue; + result.dayIndex = valueDes; + break; + case r'name_sv': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.nameSv = valueDes; + break; + case r'name_en': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.nameEn = valueDes; + break; + case r'encoded_grid': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.encodedGrid = valueDes; + break; + case r'wall_budget': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(int), + ) as int?; + if (valueDes == null) continue; + result.wallBudget = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + EncloseMooseLevelUpdate deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = EncloseMooseLevelUpdateBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/enclose_moose_submission_create.dart b/lib/api_client/lib/src/model/enclose_moose_submission_create.dart new file mode 100644 index 00000000..af534dde --- /dev/null +++ b/lib/api_client/lib/src/model/enclose_moose_submission_create.dart @@ -0,0 +1,107 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'enclose_moose_submission_create.g.dart'; + +/// EncloseMooseSubmissionCreate +/// +/// Properties: +/// * [playerSolution] +@BuiltValue() +abstract class EncloseMooseSubmissionCreate implements Built { + @BuiltValueField(wireName: r'player_solution') + BuiltSet get playerSolution; + + EncloseMooseSubmissionCreate._(); + + factory EncloseMooseSubmissionCreate([void updates(EncloseMooseSubmissionCreateBuilder b)]) = _$EncloseMooseSubmissionCreate; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(EncloseMooseSubmissionCreateBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$EncloseMooseSubmissionCreateSerializer(); +} + +class _$EncloseMooseSubmissionCreateSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [EncloseMooseSubmissionCreate, _$EncloseMooseSubmissionCreate]; + + @override + final String wireName = r'EncloseMooseSubmissionCreate'; + + Iterable _serializeProperties( + Serializers serializers, + EncloseMooseSubmissionCreate object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'player_solution'; + yield serializers.serialize( + object.playerSolution, + specifiedType: const FullType(BuiltSet, [FullType(int)]), + ); + } + + @override + Object serialize( + Serializers serializers, + EncloseMooseSubmissionCreate object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required EncloseMooseSubmissionCreateBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'player_solution': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, [FullType(int)]), + ) as BuiltSet; + result.playerSolution.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + EncloseMooseSubmissionCreate deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = EncloseMooseSubmissionCreateBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/enclose_moose_submission_read.dart b/lib/api_client/lib/src/model/enclose_moose_submission_read.dart new file mode 100644 index 00000000..a3fd0ed9 --- /dev/null +++ b/lib/api_client/lib/src/model/enclose_moose_submission_read.dart @@ -0,0 +1,171 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'enclose_moose_submission_read.g.dart'; + +/// EncloseMooseSubmissionRead +/// +/// Properties: +/// * [levelId] +/// * [submissionTime] +/// * [playerId] +/// * [playerScore] +/// * [playerSolution] +@BuiltValue() +abstract class EncloseMooseSubmissionRead implements Built { + @BuiltValueField(wireName: r'level_id') + int get levelId; + + @BuiltValueField(wireName: r'submission_time') + DateTime get submissionTime; + + @BuiltValueField(wireName: r'player_id') + int get playerId; + + @BuiltValueField(wireName: r'player_score') + int get playerScore; + + @BuiltValueField(wireName: r'player_solution') + BuiltSet get playerSolution; + + EncloseMooseSubmissionRead._(); + + factory EncloseMooseSubmissionRead([void updates(EncloseMooseSubmissionReadBuilder b)]) = _$EncloseMooseSubmissionRead; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(EncloseMooseSubmissionReadBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$EncloseMooseSubmissionReadSerializer(); +} + +class _$EncloseMooseSubmissionReadSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [EncloseMooseSubmissionRead, _$EncloseMooseSubmissionRead]; + + @override + final String wireName = r'EncloseMooseSubmissionRead'; + + Iterable _serializeProperties( + Serializers serializers, + EncloseMooseSubmissionRead object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'level_id'; + yield serializers.serialize( + object.levelId, + specifiedType: const FullType(int), + ); + yield r'submission_time'; + yield serializers.serialize( + object.submissionTime, + specifiedType: const FullType(DateTime), + ); + yield r'player_id'; + yield serializers.serialize( + object.playerId, + specifiedType: const FullType(int), + ); + yield r'player_score'; + yield serializers.serialize( + object.playerScore, + specifiedType: const FullType(int), + ); + yield r'player_solution'; + yield serializers.serialize( + object.playerSolution, + specifiedType: const FullType(BuiltSet, [FullType(int)]), + ); + } + + @override + Object serialize( + Serializers serializers, + EncloseMooseSubmissionRead object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required EncloseMooseSubmissionReadBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'level_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.levelId = valueDes; + break; + case r'submission_time': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DateTime), + ) as DateTime; + result.submissionTime = valueDes; + break; + case r'player_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.playerId = valueDes; + break; + case r'player_score': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.playerScore = valueDes; + break; + case r'player_solution': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, [FullType(int)]), + ) as BuiltSet; + result.playerSolution.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + EncloseMooseSubmissionRead deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = EncloseMooseSubmissionReadBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/event_create.dart b/lib/api_client/lib/src/model/event_create.dart index 66401c2c..be1f185c 100644 --- a/lib/api_client/lib/src/model/event_create.dart +++ b/lib/api_client/lib/src/model/event_create.dart @@ -31,6 +31,8 @@ part 'event_create.g.dart'; /// * [canSignup] /// * [drinkPackage] /// * [isNollningEvent] +/// * [mentorGroupTypes] +/// * [allowOtherMentors] /// * [alcoholEventType] /// * [dressCode] /// * [price] @@ -95,6 +97,13 @@ abstract class EventCreate implements Built { @BuiltValueField(wireName: r'is_nollning_event') bool get isNollningEvent; + @BuiltValueField(wireName: r'mentor_group_types') + BuiltList get mentorGroupTypes; + // enum mentorGroupTypesEnum { Mentor, Mission, Default, Committee, }; + + @BuiltValueField(wireName: r'allow_other_mentors') + bool get allowOtherMentors; + @BuiltValueField(wireName: r'alcohol_event_type') EventCreateAlcoholEventTypeEnum get alcoholEventType; // enum alcoholEventTypeEnum { Alcohol, Alcohol-Served, None, }; @@ -230,6 +239,16 @@ class _$EventCreateSerializer implements PrimitiveSerializer { object.isNollningEvent, specifiedType: const FullType(bool), ); + yield r'mentor_group_types'; + yield serializers.serialize( + object.mentorGroupTypes, + specifiedType: const FullType(BuiltList, [FullType(EventCreateMentorGroupTypesEnum)]), + ); + yield r'allow_other_mentors'; + yield serializers.serialize( + object.allowOtherMentors, + specifiedType: const FullType(bool), + ); yield r'alcohol_event_type'; yield serializers.serialize( object.alcoholEventType, @@ -411,6 +430,20 @@ class _$EventCreateSerializer implements PrimitiveSerializer { ) as bool; result.isNollningEvent = valueDes; break; + case r'mentor_group_types': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(EventCreateMentorGroupTypesEnum)]), + ) as BuiltList; + result.mentorGroupTypes.replace(valueDes); + break; + case r'allow_other_mentors': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(bool), + ) as bool; + result.allowOtherMentors = valueDes; + break; case r'alcohol_event_type': final valueDes = serializers.deserialize( value, @@ -475,6 +508,25 @@ class _$EventCreateSerializer implements PrimitiveSerializer { } } +class EventCreateMentorGroupTypesEnum extends EnumClass { + + @BuiltValueEnumConst(wireName: r'Mentor') + static const EventCreateMentorGroupTypesEnum mentor = _$eventCreateMentorGroupTypesEnum_mentor; + @BuiltValueEnumConst(wireName: r'Mission') + static const EventCreateMentorGroupTypesEnum mission = _$eventCreateMentorGroupTypesEnum_mission; + @BuiltValueEnumConst(wireName: r'Default') + static const EventCreateMentorGroupTypesEnum default_ = _$eventCreateMentorGroupTypesEnum_default_; + @BuiltValueEnumConst(wireName: r'Committee') + static const EventCreateMentorGroupTypesEnum committee = _$eventCreateMentorGroupTypesEnum_committee; + + static Serializer get serializer => _$eventCreateMentorGroupTypesEnumSerializer; + + const EventCreateMentorGroupTypesEnum._(String name): super(name); + + static BuiltSet get values => _$eventCreateMentorGroupTypesEnumValues; + static EventCreateMentorGroupTypesEnum valueOf(String name) => _$eventCreateMentorGroupTypesEnumValueOf(name); +} + class EventCreateAlcoholEventTypeEnum extends EnumClass { @BuiltValueEnumConst(wireName: r'Alcohol') diff --git a/lib/api_client/lib/src/model/event_read.dart b/lib/api_client/lib/src/model/event_read.dart index ec949cda..675df488 100644 --- a/lib/api_client/lib/src/model/event_read.dart +++ b/lib/api_client/lib/src/model/event_read.dart @@ -35,6 +35,8 @@ part 'event_read.g.dart'; /// * [canSignup] /// * [drinkPackage] /// * [isNollningEvent] +/// * [mentorGroupTypes] +/// * [allowOtherMentors] /// * [alcoholEventType] /// * [dressCode] /// * [price] @@ -107,6 +109,13 @@ abstract class EventRead implements Built { @BuiltValueField(wireName: r'is_nollning_event') bool get isNollningEvent; + @BuiltValueField(wireName: r'mentor_group_types') + BuiltList get mentorGroupTypes; + // enum mentorGroupTypesEnum { Mentor, Mission, Default, Committee, }; + + @BuiltValueField(wireName: r'allow_other_mentors') + bool get allowOtherMentors; + @BuiltValueField(wireName: r'alcohol_event_type') String get alcoholEventType; @@ -256,6 +265,16 @@ class _$EventReadSerializer implements PrimitiveSerializer { object.isNollningEvent, specifiedType: const FullType(bool), ); + yield r'mentor_group_types'; + yield serializers.serialize( + object.mentorGroupTypes, + specifiedType: const FullType(BuiltList, [FullType(EventReadMentorGroupTypesEnum)]), + ); + yield r'allow_other_mentors'; + yield serializers.serialize( + object.allowOtherMentors, + specifiedType: const FullType(bool), + ); yield r'alcohol_event_type'; yield serializers.serialize( object.alcoholEventType, @@ -461,6 +480,20 @@ class _$EventReadSerializer implements PrimitiveSerializer { ) as bool; result.isNollningEvent = valueDes; break; + case r'mentor_group_types': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(EventReadMentorGroupTypesEnum)]), + ) as BuiltList; + result.mentorGroupTypes.replace(valueDes); + break; + case r'allow_other_mentors': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(bool), + ) as bool; + result.allowOtherMentors = valueDes; + break; case r'alcohol_event_type': final valueDes = serializers.deserialize( value, @@ -539,3 +572,22 @@ class _$EventReadSerializer implements PrimitiveSerializer { } } +class EventReadMentorGroupTypesEnum extends EnumClass { + + @BuiltValueEnumConst(wireName: r'Mentor') + static const EventReadMentorGroupTypesEnum mentor = _$eventReadMentorGroupTypesEnum_mentor; + @BuiltValueEnumConst(wireName: r'Mission') + static const EventReadMentorGroupTypesEnum mission = _$eventReadMentorGroupTypesEnum_mission; + @BuiltValueEnumConst(wireName: r'Default') + static const EventReadMentorGroupTypesEnum default_ = _$eventReadMentorGroupTypesEnum_default_; + @BuiltValueEnumConst(wireName: r'Committee') + static const EventReadMentorGroupTypesEnum committee = _$eventReadMentorGroupTypesEnum_committee; + + static Serializer get serializer => _$eventReadMentorGroupTypesEnumSerializer; + + const EventReadMentorGroupTypesEnum._(String name): super(name); + + static BuiltSet get values => _$eventReadMentorGroupTypesEnumValues; + static EventReadMentorGroupTypesEnum valueOf(String name) => _$eventReadMentorGroupTypesEnumValueOf(name); +} + diff --git a/lib/api_client/lib/src/model/event_signup_update.dart b/lib/api_client/lib/src/model/event_signup_update.dart index 511cf97d..2459e474 100644 --- a/lib/api_client/lib/src/model/event_signup_update.dart +++ b/lib/api_client/lib/src/model/event_signup_update.dart @@ -9,7 +9,7 @@ import 'package:built_value/serializer.dart'; part 'event_signup_update.g.dart'; -/// EventSignupUpdate +/// This schema uses partial updates, any field not sent to backend will be ignored and not updated. /// /// Properties: /// * [userId] diff --git a/lib/api_client/lib/src/model/event_update.dart b/lib/api_client/lib/src/model/event_update.dart index f2f8f61e..ba852718 100644 --- a/lib/api_client/lib/src/model/event_update.dart +++ b/lib/api_client/lib/src/model/event_update.dart @@ -30,11 +30,14 @@ part 'event_update.g.dart'; /// * [canSignup] /// * [drinkPackage] /// * [isNollningEvent] +/// * [mentorGroupTypes] +/// * [allowOtherMentors] /// * [priorities] /// * [alcoholEventType] /// * [dressCode] /// * [price] /// * [dot] +/// * [lottery] @BuiltValue() abstract class EventUpdate implements Built { @BuiltValueField(wireName: r'council_id') @@ -91,6 +94,13 @@ abstract class EventUpdate implements Built { @BuiltValueField(wireName: r'is_nollning_event') bool? get isNollningEvent; + @BuiltValueField(wireName: r'mentor_group_types') + BuiltList? get mentorGroupTypes; + // enum mentorGroupTypesEnum { Mentor, Mission, Default, Committee, }; + + @BuiltValueField(wireName: r'allow_other_mentors') + bool? get allowOtherMentors; + @BuiltValueField(wireName: r'priorities') BuiltList? get priorities; @@ -108,6 +118,9 @@ abstract class EventUpdate implements Built { EventUpdateDotEnum? get dot; // enum dotEnum { None, Single, Double, }; + @BuiltValueField(wireName: r'lottery') + bool? get lottery; + EventUpdate._(); factory EventUpdate([void updates(EventUpdateBuilder b)]) = _$EventUpdate; @@ -257,6 +270,20 @@ class _$EventUpdateSerializer implements PrimitiveSerializer { specifiedType: const FullType.nullable(bool), ); } + if (object.mentorGroupTypes != null) { + yield r'mentor_group_types'; + yield serializers.serialize( + object.mentorGroupTypes, + specifiedType: const FullType.nullable(BuiltList, [FullType(EventUpdateMentorGroupTypesEnum)]), + ); + } + if (object.allowOtherMentors != null) { + yield r'allow_other_mentors'; + yield serializers.serialize( + object.allowOtherMentors, + specifiedType: const FullType.nullable(bool), + ); + } if (object.priorities != null) { yield r'priorities'; yield serializers.serialize( @@ -292,6 +319,13 @@ class _$EventUpdateSerializer implements PrimitiveSerializer { specifiedType: const FullType.nullable(EventUpdateDotEnum), ); } + if (object.lottery != null) { + yield r'lottery'; + yield serializers.serialize( + object.lottery, + specifiedType: const FullType.nullable(bool), + ); + } } @override @@ -459,6 +493,22 @@ class _$EventUpdateSerializer implements PrimitiveSerializer { if (valueDes == null) continue; result.isNollningEvent = valueDes; break; + case r'mentor_group_types': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(BuiltList, [FullType(EventUpdateMentorGroupTypesEnum)]), + ) as BuiltList?; + if (valueDes == null) continue; + result.mentorGroupTypes.replace(valueDes); + break; + case r'allow_other_mentors': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(bool), + ) as bool?; + if (valueDes == null) continue; + result.allowOtherMentors = valueDes; + break; case r'priorities': final valueDes = serializers.deserialize( value, @@ -499,6 +549,14 @@ class _$EventUpdateSerializer implements PrimitiveSerializer { if (valueDes == null) continue; result.dot = valueDes; break; + case r'lottery': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(bool), + ) as bool?; + if (valueDes == null) continue; + result.lottery = valueDes; + break; default: unhandled.add(key); unhandled.add(value); @@ -528,6 +586,25 @@ class _$EventUpdateSerializer implements PrimitiveSerializer { } } +class EventUpdateMentorGroupTypesEnum extends EnumClass { + + @BuiltValueEnumConst(wireName: r'Mentor') + static const EventUpdateMentorGroupTypesEnum mentor = _$eventUpdateMentorGroupTypesEnum_mentor; + @BuiltValueEnumConst(wireName: r'Mission') + static const EventUpdateMentorGroupTypesEnum mission = _$eventUpdateMentorGroupTypesEnum_mission; + @BuiltValueEnumConst(wireName: r'Default') + static const EventUpdateMentorGroupTypesEnum default_ = _$eventUpdateMentorGroupTypesEnum_default_; + @BuiltValueEnumConst(wireName: r'Committee') + static const EventUpdateMentorGroupTypesEnum committee = _$eventUpdateMentorGroupTypesEnum_committee; + + static Serializer get serializer => _$eventUpdateMentorGroupTypesEnumSerializer; + + const EventUpdateMentorGroupTypesEnum._(String name): super(name); + + static BuiltSet get values => _$eventUpdateMentorGroupTypesEnumValues; + static EventUpdateMentorGroupTypesEnum valueOf(String name) => _$eventUpdateMentorGroupTypesEnumValueOf(name); +} + class EventUpdateAlcoholEventTypeEnum extends EnumClass { @BuiltValueEnumConst(wireName: r'Alcohol') diff --git a/lib/api_client/lib/src/model/permission_create.dart b/lib/api_client/lib/src/model/permission_create.dart index 335cb597..b30945ce 100644 --- a/lib/api_client/lib/src/model/permission_create.dart +++ b/lib/api_client/lib/src/model/permission_create.dart @@ -22,7 +22,7 @@ abstract class PermissionCreate implements Built { + @BuiltValueField(wireName: r'telephone_number') + String? get telephoneNumber; + + @BuiltValueField(wireName: r'stil_id') + String? get stilId; + + @BuiltValueField(wireName: r'email') + String? get email; + + PreregMemberCreate._(); + + factory PreregMemberCreate([void updates(PreregMemberCreateBuilder b)]) = _$PreregMemberCreate; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(PreregMemberCreateBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$PreregMemberCreateSerializer(); +} + +class _$PreregMemberCreateSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [PreregMemberCreate, _$PreregMemberCreate]; + + @override + final String wireName = r'PreregMemberCreate'; + + Iterable _serializeProperties( + Serializers serializers, + PreregMemberCreate object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.telephoneNumber != null) { + yield r'telephone_number'; + yield serializers.serialize( + object.telephoneNumber, + specifiedType: const FullType.nullable(String), + ); + } + if (object.stilId != null) { + yield r'stil_id'; + yield serializers.serialize( + object.stilId, + specifiedType: const FullType.nullable(String), + ); + } + if (object.email != null) { + yield r'email'; + yield serializers.serialize( + object.email, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + PreregMemberCreate object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required PreregMemberCreateBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'telephone_number': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.telephoneNumber = valueDes; + break; + case r'stil_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.stilId = valueDes; + break; + case r'email': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.email = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + PreregMemberCreate deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = PreregMemberCreateBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/prereg_member_read.dart b/lib/api_client/lib/src/model/prereg_member_read.dart new file mode 100644 index 00000000..b8ccddf5 --- /dev/null +++ b/lib/api_client/lib/src/model/prereg_member_read.dart @@ -0,0 +1,163 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'prereg_member_read.g.dart'; + +/// PreregMemberRead +/// +/// Properties: +/// * [preregMemberId] +/// * [telephoneNumber] +/// * [stilId] +/// * [email] +@BuiltValue() +abstract class PreregMemberRead implements Built { + @BuiltValueField(wireName: r'prereg_member_id') + int get preregMemberId; + + @BuiltValueField(wireName: r'telephone_number') + String? get telephoneNumber; + + @BuiltValueField(wireName: r'stil_id') + String? get stilId; + + @BuiltValueField(wireName: r'email') + String? get email; + + PreregMemberRead._(); + + factory PreregMemberRead([void updates(PreregMemberReadBuilder b)]) = _$PreregMemberRead; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(PreregMemberReadBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$PreregMemberReadSerializer(); +} + +class _$PreregMemberReadSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [PreregMemberRead, _$PreregMemberRead]; + + @override + final String wireName = r'PreregMemberRead'; + + Iterable _serializeProperties( + Serializers serializers, + PreregMemberRead object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'prereg_member_id'; + yield serializers.serialize( + object.preregMemberId, + specifiedType: const FullType(int), + ); + if (object.telephoneNumber != null) { + yield r'telephone_number'; + yield serializers.serialize( + object.telephoneNumber, + specifiedType: const FullType.nullable(String), + ); + } + if (object.stilId != null) { + yield r'stil_id'; + yield serializers.serialize( + object.stilId, + specifiedType: const FullType.nullable(String), + ); + } + if (object.email != null) { + yield r'email'; + yield serializers.serialize( + object.email, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + PreregMemberRead object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required PreregMemberReadBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'prereg_member_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.preregMemberId = valueDes; + break; + case r'telephone_number': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.telephoneNumber = valueDes; + break; + case r'stil_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.stilId = valueDes; + break; + case r'email': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.email = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + PreregMemberRead deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = PreregMemberReadBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/prereg_member_update.dart b/lib/api_client/lib/src/model/prereg_member_update.dart new file mode 100644 index 00000000..5851897b --- /dev/null +++ b/lib/api_client/lib/src/model/prereg_member_update.dart @@ -0,0 +1,147 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'prereg_member_update.g.dart'; + +/// PreregMemberUpdate +/// +/// Properties: +/// * [telephoneNumber] +/// * [stilId] +/// * [email] +@BuiltValue() +abstract class PreregMemberUpdate implements Built { + @BuiltValueField(wireName: r'telephone_number') + String? get telephoneNumber; + + @BuiltValueField(wireName: r'stil_id') + String? get stilId; + + @BuiltValueField(wireName: r'email') + String? get email; + + PreregMemberUpdate._(); + + factory PreregMemberUpdate([void updates(PreregMemberUpdateBuilder b)]) = _$PreregMemberUpdate; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(PreregMemberUpdateBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$PreregMemberUpdateSerializer(); +} + +class _$PreregMemberUpdateSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [PreregMemberUpdate, _$PreregMemberUpdate]; + + @override + final String wireName = r'PreregMemberUpdate'; + + Iterable _serializeProperties( + Serializers serializers, + PreregMemberUpdate object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.telephoneNumber != null) { + yield r'telephone_number'; + yield serializers.serialize( + object.telephoneNumber, + specifiedType: const FullType.nullable(String), + ); + } + if (object.stilId != null) { + yield r'stil_id'; + yield serializers.serialize( + object.stilId, + specifiedType: const FullType.nullable(String), + ); + } + if (object.email != null) { + yield r'email'; + yield serializers.serialize( + object.email, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + PreregMemberUpdate object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required PreregMemberUpdateBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'telephone_number': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.telephoneNumber = valueDes; + break; + case r'stil_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.stilId = valueDes; + break; + case r'email': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.email = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + PreregMemberUpdate deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = PreregMemberUpdateBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/user_create.dart b/lib/api_client/lib/src/model/user_create.dart index 13d22c92..abff142e 100644 --- a/lib/api_client/lib/src/model/user_create.dart +++ b/lib/api_client/lib/src/model/user_create.dart @@ -16,6 +16,7 @@ part 'user_create.g.dart'; /// * [isActive] /// * [isSuperuser] /// * [isVerified] +/// * [stilId] /// * [firstName] /// * [lastName] /// * [telephoneNumber] @@ -37,6 +38,9 @@ abstract class UserCreate implements Built { @BuiltValueField(wireName: r'is_verified') bool? get isVerified; + @BuiltValueField(wireName: r'stil_id') + String? get stilId; + @BuiltValueField(wireName: r'first_name') String get firstName; @@ -103,6 +107,13 @@ class _$UserCreateSerializer implements PrimitiveSerializer { specifiedType: const FullType.nullable(bool), ); } + if (object.stilId != null) { + yield r'stil_id'; + yield serializers.serialize( + object.stilId, + specifiedType: const FullType.nullable(String), + ); + } yield r'first_name'; yield serializers.serialize( object.firstName, @@ -186,6 +197,14 @@ class _$UserCreateSerializer implements PrimitiveSerializer { if (valueDes == null) continue; result.isVerified = valueDes; break; + case r'stil_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.stilId = valueDes; + break; case r'first_name': final valueDes = serializers.deserialize( value, diff --git a/lib/api_client/lib/src/model/user_for_event_signup_read.dart b/lib/api_client/lib/src/model/user_for_event_signup_read.dart new file mode 100644 index 00000000..770a0172 --- /dev/null +++ b/lib/api_client/lib/src/model/user_for_event_signup_read.dart @@ -0,0 +1,190 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:api_client/src/model/group_read.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'user_for_event_signup_read.g.dart'; + +/// UserForEventSignupRead +/// +/// Properties: +/// * [id] +/// * [firstName] +/// * [lastName] +/// * [groups] +/// * [standardFoodPreferences] +/// * [otherFoodPreferences] +@BuiltValue() +abstract class UserForEventSignupRead implements Built { + @BuiltValueField(wireName: r'id') + int get id; + + @BuiltValueField(wireName: r'first_name') + String get firstName; + + @BuiltValueField(wireName: r'last_name') + String get lastName; + + @BuiltValueField(wireName: r'groups') + BuiltList get groups; + + @BuiltValueField(wireName: r'standard_food_preferences') + BuiltList? get standardFoodPreferences; + + @BuiltValueField(wireName: r'other_food_preferences') + String? get otherFoodPreferences; + + UserForEventSignupRead._(); + + factory UserForEventSignupRead([void updates(UserForEventSignupReadBuilder b)]) = _$UserForEventSignupRead; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(UserForEventSignupReadBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$UserForEventSignupReadSerializer(); +} + +class _$UserForEventSignupReadSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [UserForEventSignupRead, _$UserForEventSignupRead]; + + @override + final String wireName = r'UserForEventSignupRead'; + + Iterable _serializeProperties( + Serializers serializers, + UserForEventSignupRead object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(int), + ); + yield r'first_name'; + yield serializers.serialize( + object.firstName, + specifiedType: const FullType(String), + ); + yield r'last_name'; + yield serializers.serialize( + object.lastName, + specifiedType: const FullType(String), + ); + yield r'groups'; + yield serializers.serialize( + object.groups, + specifiedType: const FullType(BuiltList, [FullType(GroupRead)]), + ); + yield r'standard_food_preferences'; + yield object.standardFoodPreferences == null ? null : serializers.serialize( + object.standardFoodPreferences, + specifiedType: const FullType.nullable(BuiltList, [FullType(String)]), + ); + yield r'other_food_preferences'; + yield object.otherFoodPreferences == null ? null : serializers.serialize( + object.otherFoodPreferences, + specifiedType: const FullType.nullable(String), + ); + } + + @override + Object serialize( + Serializers serializers, + UserForEventSignupRead object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required UserForEventSignupReadBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.id = valueDes; + break; + case r'first_name': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.firstName = valueDes; + break; + case r'last_name': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.lastName = valueDes; + break; + case r'groups': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(GroupRead)]), + ) as BuiltList; + result.groups.replace(valueDes); + break; + case r'standard_food_preferences': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(BuiltList, [FullType(String)]), + ) as BuiltList?; + if (valueDes == null) continue; + result.standardFoodPreferences.replace(valueDes); + break; + case r'other_food_preferences': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.otherFoodPreferences = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + UserForEventSignupRead deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = UserForEventSignupReadBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/lib/api_client/lib/src/model/user_update.dart b/lib/api_client/lib/src/model/user_update.dart index 004f7b2a..b3e7c301 100644 --- a/lib/api_client/lib/src/model/user_update.dart +++ b/lib/api_client/lib/src/model/user_update.dart @@ -12,18 +12,21 @@ part 'user_update.g.dart'; /// UserUpdate /// /// Properties: +/// * [stilId] /// * [firstName] /// * [lastName] /// * [startYear] /// * [program] /// * [notifications] -/// * [stilId] /// * [standardFoodPreferences] /// * [otherFoodPreferences] /// * [telephoneNumber] /// * [mooseGameName] @BuiltValue() abstract class UserUpdate implements Built { + @BuiltValueField(wireName: r'stil_id') + String? get stilId; + @BuiltValueField(wireName: r'first_name') String? get firstName; @@ -40,9 +43,6 @@ abstract class UserUpdate implements Built { @BuiltValueField(wireName: r'notifications') bool? get notifications; - @BuiltValueField(wireName: r'stil_id') - String? get stilId; - @BuiltValueField(wireName: r'standard_food_preferences') BuiltList? get standardFoodPreferences; @@ -78,6 +78,13 @@ class _$UserUpdateSerializer implements PrimitiveSerializer { UserUpdate object, { FullType specifiedType = FullType.unspecified, }) sync* { + if (object.stilId != null) { + yield r'stil_id'; + yield serializers.serialize( + object.stilId, + specifiedType: const FullType.nullable(String), + ); + } if (object.firstName != null) { yield r'first_name'; yield serializers.serialize( @@ -113,13 +120,6 @@ class _$UserUpdateSerializer implements PrimitiveSerializer { specifiedType: const FullType.nullable(bool), ); } - if (object.stilId != null) { - yield r'stil_id'; - yield serializers.serialize( - object.stilId, - specifiedType: const FullType.nullable(String), - ); - } if (object.standardFoodPreferences != null) { yield r'standard_food_preferences'; yield serializers.serialize( @@ -171,6 +171,14 @@ class _$UserUpdateSerializer implements PrimitiveSerializer { final key = serializedList[i] as String; final value = serializedList[i + 1]; switch (key) { + case r'stil_id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.stilId = valueDes; + break; case r'first_name': final valueDes = serializers.deserialize( value, @@ -211,14 +219,6 @@ class _$UserUpdateSerializer implements PrimitiveSerializer { if (valueDes == null) continue; result.notifications = valueDes; break; - case r'stil_id': - final valueDes = serializers.deserialize( - value, - specifiedType: const FullType.nullable(String), - ) as String?; - if (valueDes == null) continue; - result.stilId = valueDes; - break; case r'standard_food_preferences': final valueDes = serializers.deserialize( value, diff --git a/lib/api_client/lib/src/serializers.dart b/lib/api_client/lib/src/serializers.dart index 6cd633d9..5e64a748 100644 --- a/lib/api_client/lib/src/serializers.dart +++ b/lib/api_client/lib/src/serializers.dart @@ -60,6 +60,11 @@ import 'package:api_client/src/model/election_populate.dart'; import 'package:api_client/src/model/election_post_read.dart'; import 'package:api_client/src/model/election_read.dart'; import 'package:api_client/src/model/election_update.dart'; +import 'package:api_client/src/model/enclose_moose_level_create.dart'; +import 'package:api_client/src/model/enclose_moose_level_read.dart'; +import 'package:api_client/src/model/enclose_moose_level_update.dart'; +import 'package:api_client/src/model/enclose_moose_submission_create.dart'; +import 'package:api_client/src/model/enclose_moose_submission_read.dart'; import 'package:api_client/src/model/error_model.dart'; import 'package:api_client/src/model/event_create.dart'; import 'package:api_client/src/model/event_read.dart'; @@ -105,6 +110,9 @@ import 'package:api_client/src/model/post_door_access_read.dart'; import 'package:api_client/src/model/post_permission_read.dart'; import 'package:api_client/src/model/post_read.dart'; import 'package:api_client/src/model/post_update.dart'; +import 'package:api_client/src/model/prereg_member_create.dart'; +import 'package:api_client/src/model/prereg_member_read.dart'; +import 'package:api_client/src/model/prereg_member_update.dart'; import 'package:api_client/src/model/priority_db.dart'; import 'package:api_client/src/model/room_booking_create.dart'; import 'package:api_client/src/model/room_booking_read.dart'; @@ -135,6 +143,7 @@ import 'package:api_client/src/model/user_access_read.dart'; import 'package:api_client/src/model/user_access_update.dart'; import 'package:api_client/src/model/user_create.dart'; import 'package:api_client/src/model/user_event_read.dart'; +import 'package:api_client/src/model/user_for_event_signup_read.dart'; import 'package:api_client/src/model/user_in_event_read.dart'; import 'package:api_client/src/model/user_in_group_read.dart'; import 'package:api_client/src/model/user_post_read.dart'; @@ -191,6 +200,11 @@ part 'serializers.g.dart'; ElectionPostRead, ElectionRead, ElectionUpdate, + EncloseMooseLevelCreate, + EncloseMooseLevelRead, + EncloseMooseLevelUpdate, + EncloseMooseSubmissionCreate, + EncloseMooseSubmissionRead, ErrorModel, EventCreate, EventRead, @@ -236,6 +250,9 @@ part 'serializers.g.dart'; PostPermissionRead, PostRead, PostUpdate, + PreregMemberCreate, + PreregMemberRead, + PreregMemberUpdate, PriorityDB, RoomBookingCreate, RoomBookingRead, @@ -266,6 +283,7 @@ part 'serializers.g.dart'; UserAccessUpdate, UserCreate, UserEventRead, + UserForEventSignupRead, UserInEventRead, UserInGroupRead, UserPostRead, @@ -302,6 +320,10 @@ Serializers serializers = (_$serializers.toBuilder() const FullType(BuiltList, [FullType(UpdateUserMemberMultiple)]), () => ListBuilder(), ) + ..addBuilderFactory( + const FullType(BuiltList, [FullType(EncloseMooseLevelRead)]), + () => ListBuilder(), + ) ..addBuilderFactory( const FullType(BuiltList, [FullType(ElectionMemberRead)]), () => ListBuilder(), @@ -342,6 +364,10 @@ Serializers serializers = (_$serializers.toBuilder() const FullType(BuiltList, [FullType(MooseGameRead)]), () => ListBuilder(), ) + ..addBuilderFactory( + const FullType(BuiltList, [FullType(PreregMemberCreate)]), + () => ListBuilder(), + ) ..addBuilderFactory( const FullType(BuiltList, [FullType(AdRead)]), () => ListBuilder(), @@ -358,6 +384,10 @@ Serializers serializers = (_$serializers.toBuilder() const FullType(BuiltList, [FullType(NollningGroupRead)]), () => ListBuilder(), ) + ..addBuilderFactory( + const FullType(BuiltList, [FullType(PreregMemberRead)]), + () => ListBuilder(), + ) ..addBuilderFactory( const FullType(BuiltList, [FullType(EventSignupRead)]), () => ListBuilder(), @@ -370,6 +400,10 @@ Serializers serializers = (_$serializers.toBuilder() const FullType(BuiltList, [FullType(TagRead)]), () => ListBuilder(), ) + ..addBuilderFactory( + const FullType(BuiltList, [FullType(EncloseMooseSubmissionRead)]), + () => ListBuilder(), + ) ..addBuilderFactory( const FullType(BuiltList, [FullType(AdventureMissionRead)]), () => ListBuilder(), diff --git a/lib/api_client/test/enclose_moose_api_test.dart b/lib/api_client/test/enclose_moose_api_test.dart new file mode 100644 index 00000000..aab05549 --- /dev/null +++ b/lib/api_client/test/enclose_moose_api_test.dart @@ -0,0 +1,88 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + + +/// tests for EncloseMooseApi +void main() { + final instance = ApiClient().getEncloseMooseApi(); + + group(EncloseMooseApi, () { + // Admin Create Level + // + //Future encloseMooseAdminCreateLevel(EncloseMooseLevelCreate encloseMooseLevelCreate) async + test('test encloseMooseAdminCreateLevel', () async { + // TODO + }); + + // Admin Delete Level + // + //Future encloseMooseAdminDeleteLevel(int levelId) async + test('test encloseMooseAdminDeleteLevel', () async { + // TODO + }); + + // Admin Get All Level Submissions + // + //Future> encloseMooseAdminGetAllLevelSubmissions(int levelId) async + test('test encloseMooseAdminGetAllLevelSubmissions', () async { + // TODO + }); + + // Admin Get All Levels + // + //Future> encloseMooseAdminGetAllLevels() async + test('test encloseMooseAdminGetAllLevels', () async { + // TODO + }); + + // Admin Get Level + // + //Future encloseMooseAdminGetLevel(int levelId) async + test('test encloseMooseAdminGetLevel', () async { + // TODO + }); + + // Admin Update Level + // + //Future encloseMooseAdminUpdateLevel(int levelId, EncloseMooseLevelUpdate encloseMooseLevelUpdate) async + test('test encloseMooseAdminUpdateLevel', () async { + // TODO + }); + + // Get All Levels + // + //Future> encloseMooseGetAllLevels() async + test('test encloseMooseGetAllLevels', () async { + // TODO + }); + + // Get All Submissions + // + //Future> encloseMooseGetAllSubmissions() async + test('test encloseMooseGetAllSubmissions', () async { + // TODO + }); + + // Get Level + // + //Future encloseMooseGetLevel(int levelId) async + test('test encloseMooseGetLevel', () async { + // TODO + }); + + // Get Submission + // + //Future encloseMooseGetSubmission(int levelId) async + test('test encloseMooseGetSubmission', () async { + // TODO + }); + + // Submit Solution + // + //Future encloseMooseSubmitSolution(int levelId, EncloseMooseSubmissionCreate encloseMooseSubmissionCreate) async + test('test encloseMooseSubmitSolution', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/enclose_moose_level_create_test.dart b/lib/api_client/test/enclose_moose_level_create_test.dart new file mode 100644 index 00000000..ae940fe8 --- /dev/null +++ b/lib/api_client/test/enclose_moose_level_create_test.dart @@ -0,0 +1,41 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for EncloseMooseLevelCreate +void main() { + final instance = EncloseMooseLevelCreateBuilder(); + // TODO add properties to the builder and call build() + + group(EncloseMooseLevelCreate, () { + // Date releaseDate + test('to test the property `releaseDate`', () async { + // TODO + }); + + // int dayIndex + test('to test the property `dayIndex`', () async { + // TODO + }); + + // String nameSv + test('to test the property `nameSv`', () async { + // TODO + }); + + // String nameEn + test('to test the property `nameEn`', () async { + // TODO + }); + + // String encodedGrid + test('to test the property `encodedGrid`', () async { + // TODO + }); + + // int wallBudget + test('to test the property `wallBudget`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/enclose_moose_level_read_test.dart b/lib/api_client/test/enclose_moose_level_read_test.dart new file mode 100644 index 00000000..44be90dc --- /dev/null +++ b/lib/api_client/test/enclose_moose_level_read_test.dart @@ -0,0 +1,71 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for EncloseMooseLevelRead +void main() { + final instance = EncloseMooseLevelReadBuilder(); + // TODO add properties to the builder and call build() + + group(EncloseMooseLevelRead, () { + // int levelId + test('to test the property `levelId`', () async { + // TODO + }); + + // Date releaseDate + test('to test the property `releaseDate`', () async { + // TODO + }); + + // int dayIndex + test('to test the property `dayIndex`', () async { + // TODO + }); + + // String nameSv + test('to test the property `nameSv`', () async { + // TODO + }); + + // String nameEn + test('to test the property `nameEn`', () async { + // TODO + }); + + // String encodedGrid + test('to test the property `encodedGrid`', () async { + // TODO + }); + + // int wallBudget + test('to test the property `wallBudget`', () async { + // TODO + }); + + // int optimalScore + test('to test the property `optimalScore`', () async { + // TODO + }); + + // BuiltSet optimalSolution + test('to test the property `optimalSolution`', () async { + // TODO + }); + + // bool optimalIsUnique + test('to test the property `optimalIsUnique`', () async { + // TODO + }); + + // EncloseMooseSubmissionRead playerSubmission + test('to test the property `playerSubmission`', () async { + // TODO + }); + + // BuiltMap scoreDistribution + test('to test the property `scoreDistribution`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/enclose_moose_level_update_test.dart b/lib/api_client/test/enclose_moose_level_update_test.dart new file mode 100644 index 00000000..f1eedbab --- /dev/null +++ b/lib/api_client/test/enclose_moose_level_update_test.dart @@ -0,0 +1,41 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for EncloseMooseLevelUpdate +void main() { + final instance = EncloseMooseLevelUpdateBuilder(); + // TODO add properties to the builder and call build() + + group(EncloseMooseLevelUpdate, () { + // Date releaseDate + test('to test the property `releaseDate`', () async { + // TODO + }); + + // int dayIndex + test('to test the property `dayIndex`', () async { + // TODO + }); + + // String nameSv + test('to test the property `nameSv`', () async { + // TODO + }); + + // String nameEn + test('to test the property `nameEn`', () async { + // TODO + }); + + // String encodedGrid + test('to test the property `encodedGrid`', () async { + // TODO + }); + + // int wallBudget + test('to test the property `wallBudget`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/enclose_moose_submission_create_test.dart b/lib/api_client/test/enclose_moose_submission_create_test.dart new file mode 100644 index 00000000..1da1f0e2 --- /dev/null +++ b/lib/api_client/test/enclose_moose_submission_create_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for EncloseMooseSubmissionCreate +void main() { + final instance = EncloseMooseSubmissionCreateBuilder(); + // TODO add properties to the builder and call build() + + group(EncloseMooseSubmissionCreate, () { + // BuiltSet playerSolution + test('to test the property `playerSolution`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/enclose_moose_submission_read_test.dart b/lib/api_client/test/enclose_moose_submission_read_test.dart new file mode 100644 index 00000000..ed6351ab --- /dev/null +++ b/lib/api_client/test/enclose_moose_submission_read_test.dart @@ -0,0 +1,36 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for EncloseMooseSubmissionRead +void main() { + final instance = EncloseMooseSubmissionReadBuilder(); + // TODO add properties to the builder and call build() + + group(EncloseMooseSubmissionRead, () { + // int levelId + test('to test the property `levelId`', () async { + // TODO + }); + + // DateTime submissionTime + test('to test the property `submissionTime`', () async { + // TODO + }); + + // int playerId + test('to test the property `playerId`', () async { + // TODO + }); + + // int playerScore + test('to test the property `playerScore`', () async { + // TODO + }); + + // BuiltSet playerSolution + test('to test the property `playerSolution`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/prereg_member_create_test.dart b/lib/api_client/test/prereg_member_create_test.dart new file mode 100644 index 00000000..db7c5a16 --- /dev/null +++ b/lib/api_client/test/prereg_member_create_test.dart @@ -0,0 +1,26 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for PreregMemberCreate +void main() { + final instance = PreregMemberCreateBuilder(); + // TODO add properties to the builder and call build() + + group(PreregMemberCreate, () { + // String telephoneNumber + test('to test the property `telephoneNumber`', () async { + // TODO + }); + + // String stilId + test('to test the property `stilId`', () async { + // TODO + }); + + // String email + test('to test the property `email`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/prereg_member_read_test.dart b/lib/api_client/test/prereg_member_read_test.dart new file mode 100644 index 00000000..3689cfc7 --- /dev/null +++ b/lib/api_client/test/prereg_member_read_test.dart @@ -0,0 +1,31 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for PreregMemberRead +void main() { + final instance = PreregMemberReadBuilder(); + // TODO add properties to the builder and call build() + + group(PreregMemberRead, () { + // int preregMemberId + test('to test the property `preregMemberId`', () async { + // TODO + }); + + // String telephoneNumber + test('to test the property `telephoneNumber`', () async { + // TODO + }); + + // String stilId + test('to test the property `stilId`', () async { + // TODO + }); + + // String email + test('to test the property `email`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/prereg_member_update_test.dart b/lib/api_client/test/prereg_member_update_test.dart new file mode 100644 index 00000000..3fb5a00c --- /dev/null +++ b/lib/api_client/test/prereg_member_update_test.dart @@ -0,0 +1,26 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for PreregMemberUpdate +void main() { + final instance = PreregMemberUpdateBuilder(); + // TODO add properties to the builder and call build() + + group(PreregMemberUpdate, () { + // String telephoneNumber + test('to test the property `telephoneNumber`', () async { + // TODO + }); + + // String stilId + test('to test the property `stilId`', () async { + // TODO + }); + + // String email + test('to test the property `email`', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/prereg_members_api_test.dart b/lib/api_client/test/prereg_members_api_test.dart new file mode 100644 index 00000000..bf89e6c4 --- /dev/null +++ b/lib/api_client/test/prereg_members_api_test.dart @@ -0,0 +1,60 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + + +/// tests for PreregMembersApi +void main() { + final instance = ApiClient().getPreregMembersApi(); + + group(PreregMembersApi, () { + // Create Multiple Prereg Members + // + //Future> preregMembersCreateMultiplePreregMembers(BuiltList preregMemberCreate) async + test('test preregMembersCreateMultiplePreregMembers', () async { + // TODO + }); + + // Create Prereg Member + // + //Future preregMembersCreatePreregMember(PreregMemberCreate preregMemberCreate) async + test('test preregMembersCreatePreregMember', () async { + // TODO + }); + + // Delete Multiple Prereg Members + // + //Future> preregMembersDeleteMultiplePreregMembers(BuiltList requestBody) async + test('test preregMembersDeleteMultiplePreregMembers', () async { + // TODO + }); + + // Delete Prereg Member + // + //Future preregMembersDeletePreregMember(int preregMemberId) async + test('test preregMembersDeletePreregMember', () async { + // TODO + }); + + // Get All Prereg Member Info + // + //Future> preregMembersGetAllPreregMemberInfo() async + test('test preregMembersGetAllPreregMemberInfo', () async { + // TODO + }); + + // Get Prereg Member Info + // + //Future preregMembersGetPreregMemberInfo(int preregMemberId) async + test('test preregMembersGetPreregMemberInfo', () async { + // TODO + }); + + // Update Prereg Member + // + //Future preregMembersUpdatePreregMember(int preregMemberId, PreregMemberUpdate preregMemberUpdate) async + test('test preregMembersUpdatePreregMember', () async { + // TODO + }); + + }); +} diff --git a/lib/api_client/test/user_for_event_signup_read_test.dart b/lib/api_client/test/user_for_event_signup_read_test.dart new file mode 100644 index 00000000..1f2f0a58 --- /dev/null +++ b/lib/api_client/test/user_for_event_signup_read_test.dart @@ -0,0 +1,41 @@ +import 'package:test/test.dart'; +import 'package:api_client/api_client.dart'; + +// tests for UserForEventSignupRead +void main() { + final instance = UserForEventSignupReadBuilder(); + // TODO add properties to the builder and call build() + + group(UserForEventSignupRead, () { + // int id + test('to test the property `id`', () async { + // TODO + }); + + // String firstName + test('to test the property `firstName`', () async { + // TODO + }); + + // String lastName + test('to test the property `lastName`', () async { + // TODO + }); + + // BuiltList groups + test('to test the property `groups`', () async { + // TODO + }); + + // BuiltList standardFoodPreferences + test('to test the property `standardFoodPreferences`', () async { + // TODO + }); + + // String otherFoodPreferences + test('to test the property `otherFoodPreferences`', () async { + // TODO + }); + + }); +} diff --git a/lib/content_wrapper.dart b/lib/content_wrapper.dart index 4e2233f2..645c7b54 100644 --- a/lib/content_wrapper.dart +++ b/lib/content_wrapper.dart @@ -26,7 +26,7 @@ class _ContentWrapperState extends State with TickerProviderStateMixin { late List _destinationKeys; late List _faders; - int _currentIndex = 0; + int _currentIndex = 2; // We set this to 2 so that the startup page is the home page. int _soundCounter = 0; // Time that the F-logo was first pressed, used to reset counter after a while diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 908c977a..261aa78c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -12,7 +12,7 @@ "calendar" : "Calendar", "notifications" : "Notifications", "other" : "Other", - "introduction" : "Nollning", + "introduction" : "Introduction", "loginRequiredField": "Required field", "loginEmail": "Email", @@ -48,6 +48,11 @@ "eventWebMasters": "the web masters", "eventFoodPreferences": "Food preferences:", "eventSendSignup": "Submit", + "eventSignupErrorTitle": "Signup failed", + "eventSignupErrorInvalidGroup": "You cannot sign up with this group!", + "eventSignupErrorDeadlinePassed": "Signup deadline for this event has passed!", + "eventSignupErrorNoGroupNoPriority": "You are not a member of any group and have not selected a priority, so you cannot sign up for this event. You are probably simply not a part of the introduction, or event admins have not added your priority group.", + "eventSignupErrorClose": "Close", "eventFoodPrefInfo": "You can change these in Settings > Food preferences.", "eventLinkToFoodPrefs": "Shortcut to the settings", "eventDesignup": "Remove sign-up", @@ -73,6 +78,9 @@ "eventAlcoholMayAppear" : "Alcohol may be present", "eventAlcoholFree" : "Alcoholfree", "eventNoAlcohol" : "None", + "eventNollning": "Introduction event", + "eventNollningMentor": "Introduction event (with your mentor group)", + "eventNollningMission": "Introduction event (with your mission group)", "settingsSettings": "Settings", "settingsSave": "Save", @@ -199,7 +207,7 @@ "nolleguide": "The Student Guide", "nolleguideWeAtFsek": "The F-guild", - "nolleguideEtiquette": "All you need to know", + "nolleguideEtiquette": "Etiquette", "nolleguideWordlist": "Glossary", "introductionLocked": "Locked", @@ -371,6 +379,8 @@ "emergencyNumSeven": "+46 77 33 113 13", "emergencyTitleSeven": " - Information in case of accidents and crises", "emergencyContentSeven": "Sweden's national information number. You can call this number to get information in the event of serious accidents and crises in society.", + "emergencyTitleEight": "Föset", + "emergencyContentEight": "If you need to get in touch with a member of the Fös quickly, you can call us on the following numbers. \n\nElina Kazemi-Esfeh\n+46737725955 \n\nEdith Fållsten\n+46768717087 \n\nAda Parén\n+46760470583 \n\nAlice Önnerheim\n+46709221301 \n\nLinnea Becker\n+46761399402 \n\nManne Mönster\n+46709487839 \n\nHarald Barck-Holst\n+46763193169 \n\nYou can find contact information for other parts of the guild on the website contact page: https://fsektionen.se/contact/.", "game": "Moose game", "gameDescription":"Coming soon!", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index e507b816..1de7f910 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -353,9 +353,39 @@ abstract class AppLocalizations { /// No description provided for @eventSendSignup. /// /// In sv, this message translates to: - /// **'Skicka Anmälan'** + /// **'Skicka anmälan'** String get eventSendSignup; + /// No description provided for @eventSignupErrorTitle. + /// + /// In sv, this message translates to: + /// **'Anmälan misslyckades'** + String get eventSignupErrorTitle; + + /// No description provided for @eventSignupErrorInvalidGroup. + /// + /// In sv, this message translates to: + /// **'Du kan inte anmäla dig med den här gruppen!'** + String get eventSignupErrorInvalidGroup; + + /// No description provided for @eventSignupErrorDeadlinePassed. + /// + /// In sv, this message translates to: + /// **'Anmälningsperioden för det här eventet är slut!'** + String get eventSignupErrorDeadlinePassed; + + /// No description provided for @eventSignupErrorNoGroupNoPriority. + /// + /// In sv, this message translates to: + /// **'Du är inte medlem i någon grupp och har inte valt någon prioritet, så du kan inte anmäla dig till det här eventet. Du är troligtvis inte en del av nollningen, eller så har eventansvariga inte lagt till din prioriterade grupp.'** + String get eventSignupErrorNoGroupNoPriority; + + /// No description provided for @eventSignupErrorClose. + /// + /// In sv, this message translates to: + /// **'Stäng'** + String get eventSignupErrorClose; + /// No description provided for @eventFoodPrefInfo. /// /// In sv, this message translates to: @@ -506,6 +536,24 @@ abstract class AppLocalizations { /// **'Inget'** String get eventNoAlcohol; + /// No description provided for @eventNollning. + /// + /// In sv, this message translates to: + /// **'Nollningsevent'** + String get eventNollning; + + /// No description provided for @eventNollningMentor. + /// + /// In sv, this message translates to: + /// **'Nollningsevent (med faddergruppen)'** + String get eventNollningMentor; + + /// No description provided for @eventNollningMission. + /// + /// In sv, this message translates to: + /// **'Nollningsevent (med uppdragsgruppen)'** + String get eventNollningMission; + /// No description provided for @settingsSettings. /// /// In sv, this message translates to: @@ -1175,7 +1223,7 @@ abstract class AppLocalizations { /// No description provided for @nolleguideEtiquette. /// /// In sv, this message translates to: - /// **'Allt du behöver veta'** + /// **'Vett och Etikett'** String get nolleguideEtiquette; /// No description provided for @nolleguideWordlist. @@ -2084,6 +2132,18 @@ abstract class AppLocalizations { /// **'Sveriges nationella informationsnummer. Dit kan du ringa om du vill få information vid allvarliga olyckor och kriser i samhället.'** String get emergencyContentSeven; + /// No description provided for @emergencyTitleEight. + /// + /// In sv, this message translates to: + /// **'Föset'** + String get emergencyTitleEight; + + /// No description provided for @emergencyContentEight. + /// + /// In sv, this message translates to: + /// **'Om du snabbt behöver komma i kontakt med någon av oss i föset så kan du ringa oss på följande nummer. \n\nElina Kazemi-Esfeh\n073 772 5955 \n\nEdith Fållsten\n076 871 7087 \n\nAda Parén\n076 047 0583 \n\nAlice Önnerheim\n070 922 1301 \n\nLinnea Becker\n076 139 9402 \n\nManne Mönster\n070 948 7839 \n\nHarald Barck-Holst\n076 319 3169 \n\nKontaktinformation till andra delar av sektionen kan du hitta på hemsidans kontakt-sida: https://fsektionen.se/contact/.'** + String get emergencyContentEight; + /// No description provided for @game. /// /// In sv, this message translates to: diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 93fe5d13..fc814a4d 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -39,7 +39,7 @@ class AppLocalizationsEn extends AppLocalizations { String get other => 'Other'; @override - String get introduction => 'Nollning'; + String get introduction => 'Introduction'; @override String get loginRequiredField => 'Required field'; @@ -140,6 +140,24 @@ class AppLocalizationsEn extends AppLocalizations { @override String get eventSendSignup => 'Submit'; + @override + String get eventSignupErrorTitle => 'Signup failed'; + + @override + String get eventSignupErrorInvalidGroup => + 'You cannot sign up with this group!'; + + @override + String get eventSignupErrorDeadlinePassed => + 'Signup deadline for this event has passed!'; + + @override + String get eventSignupErrorNoGroupNoPriority => + 'You are not a member of any group and have not selected a priority, so you cannot sign up for this event. You are probably simply not a part of the introduction, or event admins have not added your priority group.'; + + @override + String get eventSignupErrorClose => 'Close'; + @override String get eventFoodPrefInfo => 'You can change these in Settings > Food preferences.'; @@ -218,6 +236,17 @@ class AppLocalizationsEn extends AppLocalizations { @override String get eventNoAlcohol => 'None'; + @override + String get eventNollning => 'Introduction event'; + + @override + String get eventNollningMentor => + 'Introduction event (with your mentor group)'; + + @override + String get eventNollningMission => + 'Introduction event (with your mission group)'; + @override String get settingsSettings => 'Settings'; @@ -569,7 +598,7 @@ class AppLocalizationsEn extends AppLocalizations { String get nolleguideWeAtFsek => 'The F-guild'; @override - String get nolleguideEtiquette => 'All you need to know'; + String get nolleguideEtiquette => 'Etiquette'; @override String get nolleguideWordlist => 'Glossary'; @@ -1080,6 +1109,13 @@ class AppLocalizationsEn extends AppLocalizations { String get emergencyContentSeven => 'Sweden\'s national information number. You can call this number to get information in the event of serious accidents and crises in society.'; + @override + String get emergencyTitleEight => 'Föset'; + + @override + String get emergencyContentEight => + 'If you need to get in touch with a member of the Fös quickly, you can call us on the following numbers. \n\nElina Kazemi-Esfeh\n+46737725955 \n\nEdith Fållsten\n+46768717087 \n\nAda Parén\n+46760470583 \n\nAlice Önnerheim\n+46709221301 \n\nLinnea Becker\n+46761399402 \n\nManne Mönster\n+46709487839 \n\nHarald Barck-Holst\n+46763193169 \n\nYou can find contact information for other parts of the guild on the website contact page: https://fsektionen.se/contact/.'; + @override String get game => 'Moose game'; diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index dfaa768a..feb09ede 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -138,7 +138,25 @@ class AppLocalizationsSv extends AppLocalizations { String get eventFoodPreferences => 'Matpreferenser:'; @override - String get eventSendSignup => 'Skicka Anmälan'; + String get eventSendSignup => 'Skicka anmälan'; + + @override + String get eventSignupErrorTitle => 'Anmälan misslyckades'; + + @override + String get eventSignupErrorInvalidGroup => + 'Du kan inte anmäla dig med den här gruppen!'; + + @override + String get eventSignupErrorDeadlinePassed => + 'Anmälningsperioden för det här eventet är slut!'; + + @override + String get eventSignupErrorNoGroupNoPriority => + 'Du är inte medlem i någon grupp och har inte valt någon prioritet, så du kan inte anmäla dig till det här eventet. Du är troligtvis inte en del av nollningen, eller så har eventansvariga inte lagt till din prioriterade grupp.'; + + @override + String get eventSignupErrorClose => 'Stäng'; @override String get eventFoodPrefInfo => @@ -217,6 +235,15 @@ class AppLocalizationsSv extends AppLocalizations { @override String get eventNoAlcohol => 'Inget'; + @override + String get eventNollning => 'Nollningsevent'; + + @override + String get eventNollningMentor => 'Nollningsevent (med faddergruppen)'; + + @override + String get eventNollningMission => 'Nollningsevent (med uppdragsgruppen)'; + @override String get settingsSettings => 'Inställningar'; @@ -568,7 +595,7 @@ class AppLocalizationsSv extends AppLocalizations { String get nolleguideWeAtFsek => 'F-sektionen'; @override - String get nolleguideEtiquette => 'Allt du behöver veta'; + String get nolleguideEtiquette => 'Vett och Etikett'; @override String get nolleguideWordlist => 'Ordlista'; @@ -1073,6 +1100,13 @@ class AppLocalizationsSv extends AppLocalizations { String get emergencyContentSeven => 'Sveriges nationella informationsnummer. Dit kan du ringa om du vill få information vid allvarliga olyckor och kriser i samhället.'; + @override + String get emergencyTitleEight => 'Föset'; + + @override + String get emergencyContentEight => + 'Om du snabbt behöver komma i kontakt med någon av oss i föset så kan du ringa oss på följande nummer. \n\nElina Kazemi-Esfeh\n073 772 5955 \n\nEdith Fållsten\n076 871 7087 \n\nAda Parén\n076 047 0583 \n\nAlice Önnerheim\n070 922 1301 \n\nLinnea Becker\n076 139 9402 \n\nManne Mönster\n070 948 7839 \n\nHarald Barck-Holst\n076 319 3169 \n\nKontaktinformation till andra delar av sektionen kan du hitta på hemsidans kontakt-sida: https://fsektionen.se/contact/.'; + @override String get game => 'Moose game'; diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index b2ebf01b..f67986e4 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -47,7 +47,12 @@ "eventTechnicalDifficulties": "Vid tekniska problem med anmälan, kontakta ", "eventWebMasters": "spindelmännen", "eventFoodPreferences": "Matpreferenser:", - "eventSendSignup": "Skicka Anmälan", + "eventSendSignup": "Skicka anmälan", + "eventSignupErrorTitle": "Anmälan misslyckades", + "eventSignupErrorInvalidGroup": "Du kan inte anmäla dig med den här gruppen!", + "eventSignupErrorDeadlinePassed": "Anmälningsperioden för det här eventet är slut!", + "eventSignupErrorNoGroupNoPriority": "Du är inte medlem i någon grupp och har inte valt någon prioritet, så du kan inte anmäla dig till det här eventet. Du är troligtvis inte en del av nollningen, eller så har eventansvariga inte lagt till din prioriterade grupp.", + "eventSignupErrorClose": "Stäng", "eventFoodPrefInfo": "Du kan ändra dessa i Inställningar > Matpreferenser.", "eventLinkToFoodPrefs": "Genväg till inställningarna", "eventDesignup": "Avanmäl", @@ -73,6 +78,9 @@ "eventAlcoholMayAppear" : "Alkohol kan förekomma", "eventAlcoholFree" : "Alkoholfritt", "eventNoAlcohol" : "Inget", + "eventNollning": "Nollningsevent", + "eventNollningMentor": "Nollningsevent (med faddergruppen)", + "eventNollningMission": "Nollningsevent (med uppdragsgruppen)", "settingsSettings": "Inställningar", "settingsSave": "Spara", @@ -199,7 +207,7 @@ "nolleguide": "Nolleguiden", "nolleguideWeAtFsek": "F-sektionen", - "nolleguideEtiquette": "Allt du behöver veta", + "nolleguideEtiquette": "Vett och Etikett", "nolleguideWordlist": "Ordlista", "introductionLocked": "Låst", @@ -371,6 +379,8 @@ "emergencyNumSeven": "113 13", "emergencyTitleSeven": " - Krisinformation", "emergencyContentSeven": "Sveriges nationella informationsnummer. Dit kan du ringa om du vill få information vid allvarliga olyckor och kriser i samhället.", + "emergencyTitleEight": "Föset", + "emergencyContentEight": "Om du snabbt behöver komma i kontakt med någon av oss i föset så kan du ringa oss på följande nummer. \n\nElina Kazemi-Esfeh\n073 772 5955 \n\nEdith Fållsten\n076 871 7087 \n\nAda Parén\n076 047 0583 \n\nAlice Önnerheim\n070 922 1301 \n\nLinnea Becker\n076 139 9402 \n\nManne Mönster\n070 948 7839 \n\nHarald Barck-Holst\n076 319 3169 \n\nKontaktinformation till andra delar av sektionen kan du hitta på hemsidans kontakt-sida: https://fsektionen.se/contact/.", "game": "Moose game", "gameDescription":"Kommer snart!", diff --git a/lib/main.dart b/lib/main.dart index cdd47683..ba2dd65c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,17 +4,14 @@ import 'package:fsek_mobile/app.dart'; import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fsek_mobile/screens/home/nollningHome26.dart'; import 'package:fsek_mobile/screens/moose_game/moose_game.dart'; import 'package:fsek_mobile/screens/news/news.dart'; import 'package:fsek_mobile/screens/calendar/calendar.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide/manners.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide/people.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/wordlist.dart'; import 'package:fsek_mobile/screens/other/other.dart'; import 'package:fsek_mobile/models/destination.dart'; import 'package:fsek_mobile/screens/nollning/adventure_missions.dart'; import 'package:fsek_mobile/screens/nollning/emergency_contacts.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide/nolleguide.dart'; import 'package:fsek_mobile/screens/songbook/songbook.dart'; import 'package:fsek_mobile/screens/home/home.dart'; import 'package:fsek_mobile/services/navigation.service.dart'; @@ -42,8 +39,8 @@ void main() async { Destination(0, Icons.feed_outlined, NewsPage()), Destination(1, Icons.calendar_today, Calendar()), // During introduction, modify NollningHomePage() and comment the normal HomePage() - // Destination(2, Icons.home, NollningHomePage()), - Destination(2, Icons.home, HomePage()), + Destination(2, Icons.home, NollningHomePage()), + // Destination(2, Icons.home, HomePage()), Destination(3, CustomIcons.moose, MooseGamePage()), Destination(4, Icons.list, OtherContent()), ]; @@ -53,11 +50,7 @@ void main() async { '/adventure_missions': (context) => AdventureMissionsPage(), '/emergency_contacts': (context) => EmergencyContactsPage(), '/song_book': (context) => SongbookPage(), - '/homepage': (context) => HomePage(), - '/nolleguide': (context) => GuidePage(), - '/manners': (context) => MannersPage(), - '/people': (context) => PeoplePage(), - '/wordlist': (context) => WordListOldPage(), + '/homepage': (context) => HomePage() }; // This captures errors reported by the Flutter framework. FlutterError.onError = (FlutterErrorDetails details) { diff --git a/lib/screens/calendar/calendar.dart b/lib/screens/calendar/calendar.dart index 13689a1b..bf1aa02e 100644 --- a/lib/screens/calendar/calendar.dart +++ b/lib/screens/calendar/calendar.dart @@ -1,10 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:fsek_mobile/api_client/lib/api_client.dart'; -import 'package:fsek_mobile/services/api.service.dart'; import 'package:intl/intl.dart'; import 'package:table_calendar/table_calendar.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:fsek_mobile/api_client/lib/api_client.dart'; +import 'package:fsek_mobile/services/api.service.dart'; import 'package:fsek_mobile/screens/event/event.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; + class Calendar extends StatefulWidget { @override _CalendarState createState() => _CalendarState(); @@ -15,7 +17,10 @@ class _CalendarState extends State { DateTime _selectedDay = DateTime.now().toLocal(); List _selectedEvents = []; List _events = []; + + @override void initState() { + super.initState(); _selectedDay = DateTime.utc(_now.year, _now.month, _now.day); ApiService.apiClient .getEventsApi() @@ -24,226 +29,224 @@ class _CalendarState extends State { this._events = value.data!.toList(); _selectedEvents = _getEventsForDay(_selectedDay); })); - super.initState(); } + void openEventPage(EventRead event) { Navigator.push(context, - MaterialPageRoute(builder: (context) => EventPage(eventId: event.id))); + MaterialPageRoute(builder: (context) => EventPage(event: event, eventId: event.id))); } - List _getEventsForDay(DateTime day) { + List _getEventsForDay(DateTime day) { final events = this._events.where((item) => isSameDay(item.startsAt.toLocal(), day)).toList(); events.sort((a, b) => a.startsAt.compareTo(b.startsAt)); return events; } + Future _onRefresh() async { - ApiService.apiClient + return ApiService.apiClient .getEventsApi() .eventsGetAllEvents() - .then((value) => setState(() { - this._events = value.data!.toList(); - _selectedEvents = _getEventsForDay(_selectedDay); - })); + .then((value) { + if(!mounted) return; // We don't want to do a setstate when the state is no longer active. + setState(() { + this._events = value.data!.toList(); + _selectedEvents = _getEventsForDay(_selectedDay); + }); + }); } - Widget checkAlcoholEventType(String alcType){ - final String alcServed = "assets/data/nollning_25/calendar/alkfullImg.png"; - final String noAlc = "assets/data/nollning_25/calendar/alkfriImg.png"; - final String byob = "assets/data/nollning_25/calendar/byobImg.png"; - + Widget? checkAlcoholEventType(String alcType, {bool isNollning = false}){ switch (alcType) { case "Alcohol-Served": - return Image.asset(alcServed, fit: BoxFit.fill); + if (isNollning) { + return Image.asset("assets/data/nollning_26/calendar/alcfull_icon.png"); + } + + return Icon(Icons.wine_bar_rounded); case "Alcohol": - return Image.asset(byob, fit: BoxFit.fill); + if (isNollning) { + return Image.asset("assets/data/nollning_26/calendar/byob_icon.png"); + } + + return null; default: - return Image.asset(noAlc, fit: BoxFit.fill); + if (isNollning) { + return Image.asset("assets/data/nollning_26/calendar/alcfree_icon.png"); + } + + return null; } } Widget createEventCard(EventRead event) { String locale = Localizations.localeOf(context).toString(); var t = AppLocalizations.of(context)!; - if(event.isNollningEvent) { - return Container( - child: Card( - shadowColor: Colors.transparent, - color: Colors.transparent, - surfaceTintColor: null, - child: InkWell( - onTap: () => openEventPage(event), - child: Container( - margin: EdgeInsets.zero, - child: Stack( - children: [ - Positioned.fill(child: checkAlcoholEventType(event.alcoholEventType)), - Container(child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.only(top: 5)), - Container( - margin: EdgeInsets.only(bottom: 7, left: 30), - child: Text( - t.localeName == "en" ? event.titleEn : event.titleSv, - style: TextStyle( - fontFamily: "MinionPro", - fontWeight: FontWeight.bold, - fontSize: 20, - color: Color(0xFFFCBD1D) - ), - textAlign: TextAlign.left, - ), - ), - Row( - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon( - Icons.access_time_rounded, - size: 20, - ), - Text( - /* better error checking */ - " " + - DateFormat("HH:mm") - .format(event.startsAt.toLocal()) + - " - " + - DateFormat("HH:mm").format(event.endsAt.toLocal()) + - ", " + - DateFormat("MMMMd", locale) - .format(event.startsAt.toLocal()), - style: TextStyle( - fontFamily: "MinionPro", - fontWeight: FontWeight.normal, - fontSize: 15, - ), - textAlign: TextAlign.left, - ), - ], - ), - Row( - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon( - Icons.room, - size: 20, - ), - Text( - " " + - event.location, - style: TextStyle( - fontSize: 14, - color: Theme.of(context).colorScheme.onSurface, - ), - textAlign: TextAlign.left, - ), - ], + + final formattedStartTime = DateFormat("HH:mm").format(event.startsAt.toLocal()); + final formattedEndTime = DateFormat("HH:mm").format(event.endsAt.toLocal()); + final formattedDay = DateFormat("MMMMd", locale).format(event.startsAt.toLocal()); + + final alcPolicyImage = checkAlcoholEventType(event.alcoholEventType, isNollning: event.isNollningEvent); + + return Card( + elevation: 5, + shadowColor: null, + color: null, + margin: const EdgeInsets.all(5), + child: InkWell( + onTap: () => openEventPage(event), + child: LayoutBuilder( + builder: (context, constraints) { + const imageWidth = 940; + // const imageHeight = 280; + + final scale = imageWidth / constraints.maxWidth; + + const horizontalSlice = 70.0; + const verticalSlice = 108.5; + final scaledCenterSlice = Rect.fromLTWH( + horizontalSlice / scale, + verticalSlice / scale, + (imageWidth - 2 * horizontalSlice) / scale, + 1 / scale + ); + + return Container( + padding: event.isNollningEvent ? const EdgeInsets.only(left: 20, top: 20, right: 20, bottom: 40) : const EdgeInsets.all(10), + decoration: !event.isNollningEvent ? null : BoxDecoration( + image: DecorationImage( + image: ResizeImage( // Can not just use scale in DecorationImage because it is prone to floating point errors + AssetImage("assets/data/nollning_26/calendar/event_banner.png"), + width: constraints.maxWidth.toInt() // imageWidth / scale + // height: (constraints.maxWidth * imageHeight / imageWidth).toInt() // imageHeight / scale ), - Padding(padding: EdgeInsets.only(bottom: 10)) - ])) - ], + invertColors: Theme.of(context).brightness == Brightness.dark, // is this the correct way to do this? + centerSlice: scaledCenterSlice // To hide stretching + ) ), - ), - ))); + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 7), + child: Text( + t.localeName == "en" ? event.titleEn : event.titleSv, + style: TextStyle( + fontSize: 20, + color: Theme.of(context).colorScheme.primary, + ), + // overflow: TextOverflow.ellipsis + ) + ), - } else { + Row( + children: [ + const Icon( + Icons.access_time_rounded, + size: 20 + ), - return Container( - child: Card( - shadowColor: null, - color: null, - child: InkWell( - onTap: () => openEventPage(event), - child: Container( - margin: EdgeInsets.zero, - child: Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - margin: EdgeInsets.only(bottom: 7), - child: Text( - t.localeName == "en" ? event.titleEn : event.titleSv, - style: TextStyle( - fontSize: 20, - color: Theme.of(context).colorScheme.primary, - ), - textAlign: TextAlign.left, - ), - ), - Row( - children: [ - Icon( - Icons.access_time_rounded, - size: 20, - ), - Text( - /* better error checking */ - " " + - DateFormat("HH:mm") - .format(event.startsAt.toLocal()) + - " - " + - DateFormat("HH:mm").format(event.endsAt.toLocal()) + - ", " + - DateFormat("MMMMd", locale) - .format(event.startsAt.toLocal()), - style: TextStyle( - fontSize: 14, + Padding( + padding: const EdgeInsets.only(left: 10), + child: Text( + /* better error checking */ + "$formattedStartTime - $formattedEndTime, $formattedDay", + style: const TextStyle( + fontSize: 14, + ) + ) + ), + ] ), - textAlign: TextAlign.left, - ), - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + + Row( children: [ - // Alcohol is served - if (event.alcoholEventType == "Alcohol-Served") - Icon(Icons.wine_bar_rounded, size: 20), + const Icon( + Icons.room, + size: 20, + ), + + Padding( + padding: const EdgeInsets.only(left: 10), + child: Text( + event.location, + style: TextStyle( + fontSize: 14, + color: Theme.of(context).colorScheme.onSurface, + ) + ) + ), ], ), - ) - ], + ], + ) ), - Row( - children: [ - Icon( - Icons.room, - size: 20, - ), - Text( - " " + - event.location, - style: TextStyle( - fontSize: 14, - color: Theme.of(context).colorScheme.onSurface, - ), - textAlign: TextAlign.left, - ), - ], - ), - ], - ), - margin: EdgeInsets.all(10), - ), - ), - ), - // Introduction events background needs access to entire card - margin: EdgeInsets.all(4), - ), + + if (alcPolicyImage != null) + SizedBox( + width: 40, + height: 40, + child: alcPolicyImage + ), + ] + ) + ); + } + ) + ) ); - } } + Widget? _getMarkers(List events) { + if (events.isEmpty) return null; + + return FittedBox( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: events.map((event) { + final alcPolicyImage = checkAlcoholEventType(event.alcoholEventType, isNollning: event.isNollningEvent); + + if (!event.isNollningEvent || alcPolicyImage == null) { + return Container( + width: 10, + height: 10, + margin: const EdgeInsets.symmetric(horizontal: 1), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.inverseSurface, + shape: BoxShape.circle + ) + ); + } + + return Container( + width: 16, + height: 16, + margin: const EdgeInsets.symmetric(horizontal: 1), + child: alcPolicyImage + ); + }).toList() + ) + ); + } + + Future openExportCalendarLink() async { + final uri = Uri.parse("https://fsektionen.se/calendar#subscribe"); + + await launchUrl( + uri, + mode: LaunchMode.externalApplication // for some reason it gives a PlatformError when not having this + ); +} + @override Widget build(BuildContext context) { String locale = Localizations.localeOf(context).toString(); - if (locale == "sv") { - DateFormat("MMMMEEEEd", "sv_SE").format(_selectedDay); - } else { - DateFormat("MMMMEEEEd", "en_US").format(_selectedDay); - } + return Container( height: MediaQuery.of(context).size.height, color: Theme.of(context).colorScheme.surface, @@ -284,6 +287,39 @@ class _CalendarState extends State { eventLoader: (day) { return _getEventsForDay(day); }, + headerStyle: HeaderStyle( + leftChevronIcon: Icon( + color: Theme.of(context).primaryColor, + Icons.chevron_left, + size: 25 + ), + + rightChevronIcon: Icon( + color: Theme.of(context).primaryColor, + Icons.chevron_right, + size: 25 + ) + ), + calendarBuilders: CalendarBuilders( + markerBuilder: (context, day, events) => _getMarkers(events), + headerTitleBuilder: (context, day) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + DateFormat("MMMM yyyy", locale).format(day), + style: const TextStyle( + fontSize: 18 + ) + ), + + IconButton( + icon: const Icon(Icons.open_in_browser_rounded), + color: Theme.of(context).primaryColor, + onPressed: openExportCalendarLink + ), + ] + ) + ) ), Container( alignment: Alignment.centerLeft, diff --git a/lib/screens/event/event.dart b/lib/screens/event/event.dart index fde70c6c..d1784a33 100644 --- a/lib/screens/event/event.dart +++ b/lib/screens/event/event.dart @@ -11,15 +11,22 @@ import 'package:fsek_mobile/api_client/lib/api_client.dart'; import 'package:flutter_markdown_plus/flutter_markdown_plus.dart'; class EventPage extends StatefulWidget { - final int eventId; - EventPage({Key? key, required this.eventId}) : super(key: key); + final EventRead? event; + final int? eventId; + + EventPage({ + super.key, + this.eventId, + this.event + }); + @override _EventPageState createState() => _EventPageState(); } class _EventPageState extends State { - EventRead? event; - AdminUserRead? user; + late EventRead? event = widget.event; + UserForEventSignupRead? user; String? userType; GroupRead? group; // String? answer; @@ -30,14 +37,15 @@ class _EventPageState extends State { String? drinkPackageAnswer; GroupRead? defaultGroup; EventSignupRead? eventSignup; - List? priorites = []; + List? priorities = []; final Map _htmlStyle = { "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero), "p": Style( - padding: HtmlPaddings.zero, - margin: Margins.zero, - lineHeight: LineHeight(1.2)), + padding: HtmlPaddings.zero, + margin: Margins.zero, + lineHeight: LineHeight(1.2), + ), }; static const foodPrefsDisplay = { @@ -60,28 +68,35 @@ class _EventPageState extends State { static const String drinkPackageAlcoholFree = "AlcoholFree"; static const Map - drinkPackageToEnum = { + drinkPackageToEnum = { "None": EventSignupCreateDrinkPackageEnum.none, "Alcohol": EventSignupCreateDrinkPackageEnum.alcohol, - "AlcoholFree": EventSignupCreateDrinkPackageEnum.alcoholFree + "AlcoholFree": EventSignupCreateDrinkPackageEnum.alcoholFree, }; + @override void initState() { super.initState(); _loadInitData(); } Future _loadInitData() async { + // Loads/reloads event + try { + final usedEventId = widget.eventId ?? this.event?.id; + if (usedEventId == null) return; + final eventResponse = await ApiService.apiClient .getEventsApi() - .eventsGetSingleEvent(eventId: widget.eventId); + .eventsGetSingleEvent(eventId: usedEventId); final event = eventResponse.data; if (event == null) return; - final userResponse = - await ApiService.apiClient.getUsersApi().usersGetMe(); + final userResponse = await ApiService.apiClient + .getEventSignupApi() + .eventSignupGetMeForEventSignup(eventId: event.id); final user = userResponse.data; if (user == null) return; @@ -102,15 +117,16 @@ class _EventPageState extends State { } } - final prioritesResponse = - await ApiService.apiClient.getUsersApi().usersGetMyPriorities(); + final prioritiesResponse = await ApiService.apiClient + .getUsersApi() + .usersGetMyPriorities(); setState(() { this.event = event; this.user = user; this.eventSignup = eventSignup; this.drinkPackageAnswer = drinkPackageAlcohol; - this.priorites = prioritesResponse.data!.toList(); + this.priorities = prioritiesResponse.data!.toList().cast(); if (user.groups.isNotEmpty) { this.defaultGroup = user.groups.first; this.group = defaultGroup; @@ -141,24 +157,54 @@ class _EventPageState extends State { Widget alcoholEventRow(EventRead event, BuildContext context) { var t = AppLocalizations.of(context)!; if (event.alcoholEventType == "Alcohol-Served") { - return Row(children: [ - Icon(Icons.wine_bar_rounded), - Text(" " + t.eventAlcoholServed) - ]); + return Row( + children: [ + Icon(Icons.wine_bar_rounded), + Text(" " + t.eventAlcoholServed), + ], + ); } if (event.isNollningEvent && event.alcoholEventType == "Alcohol") { - return Row(children: [ - Icon(Icons.local_drink_rounded), - Text(" " + t.eventAlcoholMayAppear) - ]); + return Row( + children: [ + Icon(Icons.local_drink_rounded), + Text(" " + t.eventAlcoholMayAppear), + ], + ); } if (event.isNollningEvent && event.alcoholEventType == "None") { - return Row(children: [ - Icon(Icons.no_drinks_rounded), - Text(" " + t.eventAlcoholFree) - ]); + return Row( + children: [ + Icon(Icons.no_drinks_rounded), + Text(" " + t.eventAlcoholFree), + ], + ); + } + + return SizedBox.shrink(); + } + + Widget nollningEventRow(EventRead event, BuildContext context) { + var t = AppLocalizations.of(context)!; + + if (event.isNollningEvent) { + final mentor = event.mentorGroupTypes.contains( + EventReadMentorGroupTypesEnum.mentor, + ); + final mission = event.mentorGroupTypes.contains( + EventReadMentorGroupTypesEnum.mission, + ); + + var text = t.eventNollning; + if (mentor && !mission) { + text = t.eventNollningMentor; + } else if (mission && !mentor) { + text = t.eventNollningMission; + } + + return Row(children: [Icon(Icons.star_border), Text(" " + text)]); } return SizedBox.shrink(); @@ -177,207 +223,223 @@ class _EventPageState extends State { locale = "en"; } if (event == null) { - return Scaffold( - appBar: AppBar( - title: Text(t.eventTitle), - ), - ); + return Scaffold(appBar: AppBar(title: Text(t.eventTitle))); } return Scaffold( - appBar: AppBar( - title: Text(t.eventTitle), - ), - body: Container( - width: double.infinity, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: RefreshIndicator( - onRefresh: () => _onRefresh(), - child: ListView( - children: [ - Text(locale == "sv" ? event!.titleSv : event!.titleEn, - style: Theme.of(context).textTheme.headlineMedium!.copyWith( - fontSize: 30, - )), - Divider( - color: null, + appBar: AppBar(title: Text(t.eventTitle)), + body: RefreshIndicator( + onRefresh: () => _onRefresh(), + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: LayoutBuilder( + builder: (context, constraints) { + const imageWidth = 579; + const imageHeight = 1000; + + final scale = imageWidth / constraints.maxWidth; + + const horizontalSlice = 50.0; + const verticalSlice = 50.0; + final scaledCenterSlice = Rect.fromLTWH( + horizontalSlice / scale, + verticalSlice / scale, + (imageWidth - 2 * horizontalSlice) / scale, + (imageHeight - 2 * verticalSlice) / scale + ); + + return Container( + padding: const EdgeInsets.all(16.0), + constraints: BoxConstraints( + minHeight: MediaQuery.of(context).size.height - kToolbarHeight - MediaQuery.of(context).padding.top, ), - Row( - children: [ - Icon( - Icons.access_time_rounded, - ), - Text( - /* better error checking */ - " " + - DateFormat("HH:mm").format( - event?.startsAt.toLocal() ?? DateTime.now()) + - getDots() + - " - " + - DateFormat("HH:mm").format( - event?.endsAt.toLocal() ?? DateTime.now()) + - ", " + - DateFormat("MMMMd", locale).format( - event?.startsAt.toLocal() ?? DateTime.now()), - style: TextStyle( - fontSize: 14, - color: Theme.of(context).textTheme.bodyMedium!.color), + decoration: !event!.isNollningEvent ? null : BoxDecoration( + image: DecorationImage( + image: ResizeImage( // Can not just use scale in DecorationImage because it is prone to floating point errors + AssetImage("assets/data/nollning_26/calendar/event_background.png"), + width: constraints.maxWidth.toInt() // imageWidth / scale ), - ], + invertColors: Theme.of(context).brightness == Brightness.dark, // is this the correct way to do this? + centerSlice: scaledCenterSlice, // To hide stretching + ), ), - Row( + child: Column( + crossAxisAlignment: event!.isNollningEvent ? CrossAxisAlignment.center : CrossAxisAlignment.start, children: [ - Icon( - Icons.room, + Padding( + padding: event!.isNollningEvent ? EdgeInsets.symmetric(horizontal: 25) : EdgeInsets.zero, // padding is not actually constant (depends on scale) but not too important + child: Text( + locale == "sv" ? event!.titleSv : event!.titleEn, + style: Theme.of( + context, + ).textTheme.headlineMedium!.copyWith(fontSize: 30), + textAlign: event!.isNollningEvent ? TextAlign.center : TextAlign.start + ) ), - Text( - " " + (event?.location ?? "intigheten"), - style: TextStyle( - fontSize: 14, - color: Theme.of(context).textTheme.bodyMedium!.color), + Divider(color: null), + Row( + children: [ + Icon(Icons.access_time_rounded), + Text( + /* better error checking */ + " " + + DateFormat("HH:mm").format( + event?.startsAt.toLocal() ?? DateTime.now(), + ) + + getDots() + + " - " + + DateFormat( + "HH:mm", + ).format(event?.endsAt.toLocal() ?? DateTime.now()) + + ", " + + DateFormat( + "MMMMd", + locale, + ).format(event?.startsAt.toLocal() ?? DateTime.now()), + style: TextStyle( + fontSize: 14, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + ), + ], ), - ], - ), - Divider( - color: null, - ), - Container( - margin: EdgeInsets.fromLTRB(0, 0, 0, 0), - width: double.infinity, - /* should be parsed html */ - child: Markdown( - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - data: (locale == "sv" - ? event!.descriptionSv - : event!.descriptionEn) - .replaceAll("
", ""), - onTapLink: (text, href, title) { - if (href != null) { - launchUrl(Uri.parse(href)); - } - }, - styleSheet: - MarkdownStyleSheet.fromTheme(Theme.of(context)) - .copyWith( - p: Theme.of(context) - .textTheme - .bodyMedium - ?.copyWith(height: 1.2), - ), - )), - Divider( - color: null, - ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 5, 0, 5), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row(children: [ - Text(t.eventDressCode + event!.dressCode) - ]), - Visibility( - visible: event!.price <= 0 ? false : true, - child: Text(t.eventPrice + - (event?.price.toString() ?? "") + - " kr")), - ], - ), - ), - Divider( - color: null, - ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 5, 0, 5), - child: Column( - children: [ - Visibility( - visible: event!.price <= 0 ? false : true, - child: Row( - children: [ - Icon(Icons.attach_money_rounded), - Text(t.eventCostsMoney) - ], + Row( + children: [ + Icon(Icons.room), + Text( + " " + (event?.location ?? "intigheten"), + style: TextStyle( + fontSize: 14, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), ), + ], + ), + Divider(color: null), + Container( + margin: EdgeInsets.fromLTRB(0, 0, 0, 0), + width: double.infinity, + /* should be parsed html */ + child: Markdown( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + data: + (locale == "sv" + ? event!.descriptionSv + : event!.descriptionEn) + .replaceAll("
", ""), + onTapLink: (text, href, title) { + if (href != null) { + launchUrl(Uri.parse(href)); + } + }, + styleSheet: MarkdownStyleSheet.fromTheme(Theme.of(context)) + .copyWith( + p: Theme.of( + context, + ).textTheme.bodyMedium?.copyWith(height: 1.2), + ), ), - Visibility( - visible: event!.food, - child: Row( - children: [ - Icon( - Icons.restaurant_rounded, + ), + Divider(color: null), + Padding( + padding: const EdgeInsets.fromLTRB(0, 5, 0, 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Text(t.eventDressCode + event!.dressCode)], + ), + Visibility( + visible: event!.price <= 0 ? false : true, + child: Text( + t.eventPrice + + (event?.price.toString() ?? "") + + " kr", ), - Text(t.eventFoodServed) - ], - ), + ), + ], ), - alcoholEventRow(event!, context), - Visibility( - visible: event!.canSignup, - child: Row( - children: [ - Icon( - Icons.event_rounded, + ), + Divider(color: null), + Padding( + padding: const EdgeInsets.fromLTRB(0, 5, 0, 5), + child: Column( + children: [ + Visibility( + visible: event!.price <= 0 ? false : true, + child: Row( + children: [ + Icon(Icons.attach_money_rounded), + Text(t.eventCostsMoney), + ], ), - Text(t.eventHasSignup) - ], - ), + ), + Visibility( + visible: event!.food, + child: Row( + children: [ + Icon(Icons.restaurant_rounded), + Text(t.eventFoodServed), + ], + ), + ), + nollningEventRow(event!, context), + alcoholEventRow(event!, context), + Visibility( + visible: event!.canSignup, + child: Row( + children: [ + Icon(Icons.event_rounded), + Text(t.eventHasSignup), + ], + ), + ), + Visibility( + visible: event!.lottery, + child: Row( + children: [ + Icon(Icons.casino_outlined), + Text(" " + t.eventHasLottery), + ], + ), + ), + ], ), - Visibility( - visible: event!.lottery, - child: Row( + ), + Visibility( + visible: event!.canSignup, + child: Divider(color: null), + ), + Visibility( + visible: (!(event!.council == null)), + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon( - Icons.casino_outlined, + Text(t.eventInCaseOfQuestions), + InkWell( + child: new Text( + t.localeName == "sv" + ? event!.council.nameSv + : event!.council.nameEn, + style: TextStyle(color: Colors.blue[300]), + ), + onTap: () => _goToPostContact(event!.council.nameSv), ), - Text(" " + t.eventHasLottery) + Divider(color: null), ], ), ), - ], - ), - ), - Visibility( - visible: event!.canSignup, - child: Divider( - color: null, - ), - ), - Visibility( - visible: (!(event!.council == null)), - child: Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - t.eventInCaseOfQuestions, - ), - InkWell( - child: new Text( - t.localeName == "sv" - ? event!.council.nameSv - : event!.council.nameEn, - style: TextStyle( - color: Colors.blue[300], - ), - ), - onTap: () => _goToPostContact(event!.council.nameSv), - ), - Divider( - color: null, - ), - ], ), - ), + signupInfoWidget(), + ], ), - signupInfoWidget(), - ], - ), - ), - ), - ), + ); + } + ) + ) + ) ); } @@ -388,14 +450,29 @@ class _EventPageState extends State { }); } - final eventSignupCreate = EventSignupCreate((b) => b - ..userId = user!.id - ..priority = userType - ..groupName = group?.name ?? customGroup - ..drinkPackage = drinkPackageToEnum[drinkPackageAnswer]); + final eventSignupCreate = EventSignupCreate( + (b) => b + ..userId = user!.id + ..priority = userType + ..groupName = group?.name ?? customGroup + ..drinkPackage = drinkPackageToEnum[drinkPackageAnswer], + ); - await ApiService.apiClient.getEventSignupApi().eventSignupEventSignupRoute( - eventId: event!.id, eventSignupCreate: eventSignupCreate); + try { + await ApiService.apiClient + .getEventSignupApi() + .eventSignupEventSignupRoute( + eventId: event!.id, + eventSignupCreate: eventSignupCreate, + ); + } catch (e) { + final int? statusCode = e is DioException ? e.response?.statusCode : null; + if (statusCode != null && statusCode >= 400 && statusCode < 500) { + String? detail = (e as DioException).response!.data["detail"]; + return showSignupError(detail); + } + throw e; + } update(); } @@ -404,17 +481,67 @@ class _EventPageState extends State { int userId = user?.id ?? -1; int eventId = event?.id ?? -1; - await ApiService.apiClient - .getEventSignupApi() - .eventSignupEventSignoffRoute(eventId: eventId, userId: userId); + await ApiService.apiClient.getEventSignupApi().eventSignupEventSignoffRoute( + eventId: eventId, + userId: userId, + ); update(); } + Future showSignupError(String? detail) async { + if (!mounted) return; + var t = AppLocalizations.of(context)!; + + String? detailText; + + // Reject users with no priority and no group with more helpful error message + final bool hasNoGroup = + (user?.groups.isEmpty ?? true) && + (customGroup == null || customGroup!.isEmpty); + final bool hasNoPriority = userType == null || userType!.isEmpty; + + if (hasNoGroup && hasNoPriority) { + detailText = t.eventSignupErrorNoGroupNoPriority; + } else if (detail != null) { + switch (detail.toLowerCase()) { + // TODO: this could probably be improved if all response details came as an enum + case "user cannot sign up with this group": + detailText = t.eventSignupErrorInvalidGroup; + break; + case "event signup deadline is passed": + detailText = t.eventSignupErrorDeadlinePassed; + break; + default: + detailText = detail; + break; + } + } + + return showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(t.eventSignupErrorTitle), + content: detailText != null ? Text(detailText) : SizedBox.shrink(), + actions: [ + TextButton( + child: Text(t.eventSignupErrorClose), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ); + }, + ); + } + //Bör denna vara async som de andra funktionerna? void goToSettings() { Navigator.push( - context, MaterialPageRoute(builder: (context) => SettingsPage())) - .then((_) { + context, + MaterialPageRoute(builder: (context) => SettingsPage()), + ).then((_) { //uppdaterar sidan så man ser sin ändring update(); }); @@ -441,18 +568,19 @@ class _EventPageState extends State { items: [ if (event!.priorities.toList().isNotEmpty) ...event!.priorities - .where((prio) => priorites!.contains(prio.priority)) - .map((prio) => DropdownMenuItem( - value: prio.priority, - child: Text(t.localeName == "en" + .where((prio) => priorities!.contains(prio.priority)) + .map( + (prio) => DropdownMenuItem( + value: prio.priority, + child: Text( + t.localeName == "en" ? (prioritiesSvToEn[prio.priority] ?? - prio.priority) - : prio.priority), - )), - DropdownMenuItem( - value: null, - child: Text(t.eventOther), - ) + prio.priority) + : prio.priority, + ), + ), + ), + DropdownMenuItem(value: null, child: Text(t.eventOther)), ], ), ], @@ -472,46 +600,58 @@ class _EventPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(t.eventChooseGroup), - DropdownButton( - iconEnabledColor: Theme.of(context).colorScheme.onSurface, - isExpanded: true, - menuMaxHeight: MediaQuery.of(context).size.height / 2, - value: group, - onChanged: (GroupRead? newValue) { - setState(() { - group = newValue; - if (newValue == null) { - displayGroupInput = true; - } else { - displayGroupInput = false; - } - }); - }, - items: [ - if (user!.groups.toList().isNotEmpty) - ...user!.groups.map(((GroupRead? g) { - return DropdownMenuItem( - value: g, child: Text(g!.name)); - })), - DropdownMenuItem( - value: null, - child: Text(t.eventOtherDifferent), - ), - ], + Visibility( + visible: !(event!.isNollningEvent && user!.groups.toList().isEmpty), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(t.eventChooseGroup), + DropdownButton( + iconEnabledColor: Theme.of(context).colorScheme.onSurface, + isExpanded: true, + menuMaxHeight: MediaQuery.of(context).size.height / 2, + value: group, + onChanged: (GroupRead? newValue) { + setState(() { + group = newValue; + if (newValue == null) { + displayGroupInput = true; + } else { + displayGroupInput = false; + } + }); + }, + items: [ + if (user!.groups.toList().isNotEmpty) + ...user!.groups.map(((GroupRead? g) { + return DropdownMenuItem( + value: g, + child: Text(g!.name), + ); + })), + if (!event!.isNollningEvent) + DropdownMenuItem( + value: null, + child: Text(t.eventOtherDifferent), + ), + ], + ), + ], + ), ), Visibility( - visible: displayGroupInput, + visible: displayGroupInput && !event!.isNollningEvent, child: TextField( - onChanged: (String? newValue) { - setState(() { - customGroup = newValue; - }); - }, - decoration: InputDecoration( - border: OutlineInputBorder(), - hintText: t.eventCustomGroupName, - )), + onChanged: (String? newValue) { + setState(() { + customGroup = newValue; + }); + }, + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: t.eventCustomGroupName, + ), + ), ), ], ), @@ -544,15 +684,11 @@ class _EventPageState extends State { InkWell( child: new Text( t.eventWebMasters, - style: TextStyle( - color: Colors.blue[300], - ), + style: TextStyle(color: Colors.blue[300]), ), onTap: () => _goToPostContact("Spindelman"), ), - Divider( - color: null, - ), + Divider(color: null), ], ), ); @@ -569,9 +705,7 @@ class _EventPageState extends State { Text(" " + t.eventNoSignup), ], ), - Divider( - color: null, - ), + Divider(color: null), Container( margin: EdgeInsets.all(10), child: Column( @@ -581,18 +715,14 @@ class _EventPageState extends State { InkWell( child: new Text( t.eventWebMasters, - style: TextStyle( - color: Colors.blue[300], - ), + style: TextStyle(color: Colors.blue[300]), ), onTap: () => _goToPostContact("Spindelman"), ), - Divider( - color: null, - ), + Divider(color: null), ], ), - ) + ), ], ), ); @@ -607,14 +737,12 @@ class _EventPageState extends State { children: [ Icon( Icons.info_outline_rounded, - color: Colors.red[ - 300], // I don't like it, but this hardcoding kinda just works + color: Colors + .red[300], // I don't like it, but this hardcoding kinda just works ), Text( t.eventNotSignedUp, - style: TextStyle( - color: Colors.red[300], - ), + style: TextStyle(color: Colors.red[300]), ), ], ); @@ -628,21 +756,14 @@ class _EventPageState extends State { children: [ Row( children: [ - Icon( - Icons.cancel, - color: Colors.red[300], - ), + Icon(Icons.cancel, color: Colors.red[300]), Text( t.eventNoSpot, - style: TextStyle( - color: Colors.red[300], - ), + style: TextStyle(color: Colors.red[300]), ), ], ), - Divider( - color: null, - ), + Divider(color: null), ..._signupDetails(groupName, userType), ], ); @@ -652,21 +773,14 @@ class _EventPageState extends State { children: [ Row( children: [ - Icon( - Icons.check_circle, - color: Colors.green[300], - ), + Icon(Icons.check_circle, color: Colors.green[300]), Text( t.eventGotSpot, - style: TextStyle( - color: Colors.green[300], - ), + style: TextStyle(color: Colors.green[300]), ), ], ), - Divider( - color: null, - ), + Divider(color: null), ..._signupDetails(groupName, userType), ], ); @@ -689,9 +803,7 @@ class _EventPageState extends State { ), ], ), - Divider( - color: null, - ), + Divider(color: null), ..._signupDetails(groupName, userType), ], ); @@ -714,28 +826,20 @@ class _EventPageState extends State { t.eventSignUp, style: Theme.of(context).textTheme.headlineMedium, ), - Divider( - color: null, - ), + Divider(color: null), Padding( padding: const EdgeInsets.fromLTRB(0, 5, 0, 5), child: Column( children: [ Row( children: [ - Icon( - Icons.person, - ), - Text( - t.eventNbrSignUps + event!.signupCount.toString(), - ), + Icon(Icons.person), + Text(t.eventNbrSignUps + event!.signupCount.toString()), ], ), Row( children: [ - Icon( - Icons.people, - ), + Icon(Icons.people), Text( t.eventNbrSpots + (event!.maxEventUsers == 0 @@ -746,43 +850,40 @@ class _EventPageState extends State { ), Row( children: [ - Icon( - Icons.event_available_rounded, - ), + Icon(Icons.event_available_rounded), Text( t.eventSignUpOpens + - DateFormat("d/M") - .format(event!.signupStart.toLocal()) + + DateFormat( + "d/M", + ).format(event!.signupStart.toLocal()) + " " + - DateFormat("jm", locale) - .format(event!.signupStart.toLocal()), + DateFormat( + "jm", + locale, + ).format(event!.signupStart.toLocal()), ), ], ), Row( children: [ - Icon( - Icons.event_busy_rounded, - ), + Icon(Icons.event_busy_rounded), Text( t.eventSignUpCloses + DateFormat("d/M").format(event!.signupEnd.toLocal()) + " " + - DateFormat("jm", locale) - .format(event!.signupEnd.toLocal()), + DateFormat( + "jm", + locale, + ).format(event!.signupEnd.toLocal()), ), ], ), ], ), ), - Divider( - color: null, - ), + Divider(color: null), signup, - Divider( - color: null, - ), + Divider(color: null), Container( margin: EdgeInsets.all(10), child: Column( @@ -792,15 +893,11 @@ class _EventPageState extends State { InkWell( child: new Text( t.eventWebMasters, - style: TextStyle( - color: Colors.blue[300], - ), + style: TextStyle(color: Colors.blue[300]), ), onTap: () => _goToPostContact("Spindelman"), ), - Divider( - color: null, - ), + Divider(color: null), ], ), ), @@ -850,80 +947,88 @@ class _EventPageState extends State { DropdownMenuItem( value: drinkPackageNone, child: Text(t.eventNoAlcohol), - ) + ), ], - ) + ), ), ], - ) + ), ); } if (eventSignup == null) { return Container( - padding: EdgeInsets.fromLTRB(0, 5, 0, 5), - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - groupDropdown(), - userTypeDropDown(), - // questionInput(), - drinkPackageInput, - Wrap( - children: [ - Text(t.eventFoodPreferences + " ", - style: TextStyle( - fontWeight: FontWeight.bold, - color: - Theme.of(context).textTheme.bodyMedium!.color)), - ...?foodPreferences[locale] - ?.where((element) => element.isNotEmpty) - .map((foodPreference) => Text(foodPreference + " ")), - Text(" " + (foodCustom ?? "")), - ], - ), - Wrap(children: [ + padding: EdgeInsets.fromLTRB(0, 5, 0, 5), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + groupDropdown(), + userTypeDropDown(), + // questionInput(), + drinkPackageInput, + Wrap( + children: [ + Text( + t.eventFoodPreferences + " ", + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + ), + ...?foodPreferences[locale] + ?.where((element) => element.isNotEmpty) + .map((foodPreference) => Text(foodPreference + " ")), + Text(" " + (foodCustom ?? "")), + ], + ), + Wrap( + children: [ Text( t.eventFoodPrefInfo, style: TextStyle( - fontStyle: FontStyle.italic, - color: Theme.of(context).textTheme.bodyMedium!.color), + fontStyle: FontStyle.italic, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), ), GestureDetector( - child: Text(t.eventLinkToFoodPrefs, - style: TextStyle( - decoration: TextDecoration.underline, - color: Theme.of(context).colorScheme.primary)), + child: Text( + t.eventLinkToFoodPrefs, + style: TextStyle( + decoration: TextDecoration.underline, + color: Theme.of(context).colorScheme.primary, + ), + ), onTap: () => goToSettings(), ), - ]), - SizedBox( - height: 16, - ), - Align( - alignment: Alignment.center, - child: SizedBox( - height: 50, - width: 200, - child: InkWell( - onTap: () => sendSignup(), - child: Card( - color: Theme.of(context).colorScheme.primary, - child: Align( - alignment: Alignment.center, - child: Text( - t.eventSendSignup, - style: TextStyle( - fontSize: 20, - color: Theme.of(context).colorScheme.onPrimary), + ], + ), + SizedBox(height: 16), + Align( + alignment: Alignment.center, + child: SizedBox( + height: 50, + width: 200, + child: InkWell( + onTap: () => sendSignup(), + child: Card( + color: Theme.of(context).colorScheme.primary, + child: Align( + alignment: Alignment.center, + child: Text( + t.eventSendSignup, + style: TextStyle( + fontSize: 20, + color: Theme.of(context).colorScheme.onPrimary, ), ), ), ), ), ), - ], - )); + ), + ], + ), + ); } else { String? groupName = eventSignup!.groupName; String userType = eventSignup!.priority; @@ -931,9 +1036,7 @@ class _EventPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ ..._signupDetails(groupName, userType), - SizedBox( - height: 16, - ), + SizedBox(height: 16), Align( alignment: Alignment.center, child: SizedBox( @@ -951,14 +1054,15 @@ class _EventPageState extends State { child: Text( t.eventDesignup, style: TextStyle( - fontSize: 20, - color: Theme.of(context).colorScheme.onError), + fontSize: 20, + color: Theme.of(context).colorScheme.onError, + ), ), ), ), ), ), - ) + ), ], ); } @@ -967,26 +1071,27 @@ class _EventPageState extends State { Future _confirmUnenroll(BuildContext context) { var t = AppLocalizations.of(context)!; return showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(t.eventConfirmCancel), - actions: [ - TextButton( - child: Text(t.eventCancel), - onPressed: () { - Navigator.pop(context, false); - }, - ), - TextButton( - child: Text(t.eventConfirmRemoveSignUp), - onPressed: () { - Navigator.pop(context, true); - }, - ), - ], - ); - }); + context: context, + builder: (context) { + return AlertDialog( + title: Text(t.eventConfirmCancel), + actions: [ + TextButton( + child: Text(t.eventCancel), + onPressed: () { + Navigator.pop(context, false); + }, + ), + TextButton( + child: Text(t.eventConfirmRemoveSignUp), + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ); + }, + ); } List _signupDetails(String? groupName, String? userType) { @@ -1000,55 +1105,71 @@ class _EventPageState extends State { if (event!.drinkPackage) { switch (eventSignup!.drinkPackage.name) { case "alcohol": // Had to hard code this cuz the openapi generator lowered all enums... TODO maybe change this later... - drinkPackage = - _drinkPackageWidget(t.eventDrinkPackage, " ${t.eventAlcohol}"); + drinkPackage = _drinkPackageWidget( + t.eventDrinkPackage, + " ${t.eventAlcohol}", + ); break; case "alcoholFree": drinkPackage = _drinkPackageWidget( - t.eventDrinkPackage, " ${t.eventAlcoholFree}"); + t.eventDrinkPackage, + " ${t.eventAlcoholFree}", + ); break; case "none": - drinkPackage = - _drinkPackageWidget(t.eventDrinkPackage, " ${t.eventNoAlcohol}"); + drinkPackage = _drinkPackageWidget( + t.eventDrinkPackage, + " ${t.eventNoAlcohol}", + ); break; default: this.drinkPackageAnswer = drinkPackageNone; - drinkPackage = - _drinkPackageWidget(t.eventDrinkPackage, " ${t.eventNoAlcohol}"); + drinkPackage = _drinkPackageWidget( + t.eventDrinkPackage, + " ${t.eventNoAlcohol}", + ); break; } } return [ RichText( - text: TextSpan( - text: t.eventGroup, - style: TextStyle( + text: TextSpan( + text: t.eventGroup, + style: TextStyle( fontWeight: FontWeight.bold, - color: Theme.of(context).textTheme.bodyMedium!.color), - children: [ - TextSpan( + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + children: [ + TextSpan( text: " $groupName", style: TextStyle( - fontWeight: FontWeight.normal, - color: Theme.of(context).textTheme.bodyMedium!.color)) - ], - )), + fontWeight: FontWeight.normal, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + ), + ], + ), + ), RichText( - text: TextSpan( - text: t.eventPriority2, - style: TextStyle( + text: TextSpan( + text: t.eventPriority2, + style: TextStyle( fontWeight: FontWeight.bold, - color: Theme.of(context).textTheme.bodyMedium!.color), - children: [ - TextSpan( + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + children: [ + TextSpan( text: t.localeName == "en" ? (prioritiesSvToEn[userType] ?? userType) : userType, style: TextStyle( - fontWeight: FontWeight.normal, - color: Theme.of(context).textTheme.bodyMedium!.color)) - ], - )), + fontWeight: FontWeight.normal, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + ), + ], + ), + ), // event!.event_signup!.question != "" // ? RichText( // text: TextSpan( @@ -1065,33 +1186,41 @@ class _EventPageState extends State { Wrap( children: [ RichText( - text: TextSpan( - text: t.eventFoodPreferences + " ", - style: TextStyle( + text: TextSpan( + text: t.eventFoodPreferences + " ", + style: TextStyle( fontWeight: FontWeight.bold, - color: Theme.of(context).textTheme.bodyMedium!.color), - )), + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + ), + ), ...?foodPreferences[locale] ?.where((element) => element.isNotEmpty) .map((foodPreferences) => Text(foodPreferences + " ")), Text(foodCustom ?? ""), ], ), - Wrap(children: [ - Text( - t.eventFoodPrefInfo, - style: TextStyle( + Wrap( + children: [ + Text( + t.eventFoodPrefInfo, + style: TextStyle( fontStyle: FontStyle.italic, - color: Theme.of(context).textTheme.bodyMedium!.color), - ), - GestureDetector( - child: Text(t.eventLinkToFoodPrefs, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + ), + GestureDetector( + child: Text( + t.eventLinkToFoodPrefs, style: TextStyle( - decoration: TextDecoration.underline, - color: Theme.of(context).colorScheme.primary)), - onTap: () => goToSettings(), - ), - ]), + decoration: TextDecoration.underline, + color: Theme.of(context).colorScheme.primary, + ), + ), + onTap: () => goToSettings(), + ), + ], + ), ]; } @@ -1100,14 +1229,17 @@ class _EventPageState extends State { text: TextSpan( text: drinkPackageText, style: TextStyle( - fontWeight: FontWeight.bold, - color: Theme.of(context).textTheme.bodyMedium!.color), + fontWeight: FontWeight.bold, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), children: [ TextSpan( - text: choice, - style: TextStyle( - fontWeight: FontWeight.normal, - color: Theme.of(context).textTheme.bodyMedium!.color)) + text: choice, + style: TextStyle( + fontWeight: FontWeight.normal, + color: Theme.of(context).textTheme.bodyMedium!.color, + ), + ), ], ), ); @@ -1143,8 +1275,10 @@ class _EventPageState extends State { void _goToPostContact(String nameSv) { String finalname = _councilPostMap[nameSv] ?? "Spindelman"; Navigator.push( - context, - MaterialPageRoute( - builder: ((context) => ContactPage(initPostNameSv: finalname)))); + context, + MaterialPageRoute( + builder: ((context) => ContactPage(initPostNameSv: finalname)), + ), + ); } } diff --git a/lib/screens/home/home.dart b/lib/screens/home/home.dart index f84ac89c..e822bdb6 100644 --- a/lib/screens/home/home.dart +++ b/lib/screens/home/home.dart @@ -27,7 +27,7 @@ class HomePage extends StatefulWidget { _HomePageState createState() => _HomePageState(); } -// During introduciton, please don't modify this file. +// During introduction, please don't modify this file. // Instead, create a new file in the home folder, for example nollningHome25.dart // And change the destination in main.dart @@ -62,7 +62,7 @@ class _HomePageState extends State { String defaultBackground = "assets/img/default_background.png"; return Stack(children: [ - // If we couldnt get a background image for whatever reason make it the default + // If we couldn't get a background image for whatever reason make it the default backgroundUrl != null ? CachedNetworkImage( fit: BoxFit.cover, diff --git a/lib/screens/home/nollningHome26.dart b/lib/screens/home/nollningHome26.dart new file mode 100644 index 00000000..bc064db7 --- /dev/null +++ b/lib/screens/home/nollningHome26.dart @@ -0,0 +1,164 @@ +import 'package:flutter/material.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/emergency_contacts.dart'; +import 'package:fsek_mobile/screens/nollning/map_page.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/nolleguide_home.dart'; +import 'package:fsek_mobile/screens/nollning/questscreen_26/quest_home.dart'; +import 'package:fsek_mobile/screens/nollning/schedule.dart'; +import 'package:fsek_mobile/screens/songbook/songbook.dart'; +import 'package:fsek_mobile/util/app_exception.dart'; +import 'package:fsek_mobile/util/nollning/week_tracker.dart'; + +class NollningHomePage extends StatefulWidget { + static const routeName = '/homepage'; + + @override + _NollningHomePageState createState() => _NollningHomePageState(); +} + +class _NollningHomePageState extends State { + @override + void initState() { + super.initState(); + } + + Widget build(BuildContext context) { + var t = AppLocalizations.of(context)!; + var week = WeekTracker.determineWeek(); + + final double screenWidth = MediaQuery.of(context).size.width; + + final double buttonSize; // The higher the number the smaller the button because yes + final double buttonSpace; // The space between the buttons + final double bottomMargin; // The margin from the navbar + + switch(week){ + case 0: + case 1: + buttonSize = 4; + buttonSpace = 40; + bottomMargin = 30; + case 2: + buttonSize = 3.2; + buttonSpace = 15; + bottomMargin = 30; + case 3: + buttonSize = 3.5; + buttonSpace = 25; + bottomMargin = 35; + case 4: + buttonSize = 4; + buttonSpace = 30; + bottomMargin = 30; + default: + throw new InvalidInputException("Unexpected week: ${week}"); + } + + var filePath = 'assets/data/nollning_26/homescreen/lvl_${week}'; + + var backgroundImage = '${filePath}/background.png'; + var contactButton = '${filePath}/button_contact_${t.localeName}.png'; + var mapButton = '${filePath}/button_map_${t.localeName}.png'; + var guideButton = '${filePath}/button_guide_${t.localeName}.png'; + var scheduleButton = '${filePath}/button_schedule_${t.localeName}.png'; + var questButton = '${filePath}/button_quest.png'; + var songButton = '${filePath}/button_song_${t.localeName}.png'; + + return Container( + child: Stack(children: [ + Positioned.fill(child: Image.asset(backgroundImage, fit: BoxFit.fill, cacheWidth: 1000, cacheHeight: 1000)), + Align(alignment: Alignment.bottomCenter, child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Padding(padding: EdgeInsets.only(bottom: bottomMargin), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + width: screenWidth / buttonSize, + child: InkWell( + onTap: () => (Navigator.push(context, MaterialPageRoute(builder: (context) => NolleGuideHomePage()))), + child: Image.asset(guideButton) + ), + ), + SizedBox( + height: buttonSpace, + ), + Container( + width: screenWidth / buttonSize, + child: InkWell( + onTap: () => (Navigator.push(context, MaterialPageRoute(builder: (context) => ScheduleScreenPage()))), + child: Image.asset(scheduleButton) + ), + ) + ], + ), + ), + Padding(padding: EdgeInsets.only(bottom: bottomMargin), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + width: screenWidth / buttonSize, + child: InkWell( + onTap: () => (Navigator.push(context, MaterialPageRoute(builder: (context) => EmergencyContactsPage()))), + child: Image.asset(contactButton) + ), + ), + SizedBox( + height: buttonSpace, + ), + Container( + width: screenWidth / buttonSize, + child: InkWell( + //onTap: () => (Navigator.push(context, MaterialPageRoute(builder: (context) => QuestHomeScreen()))), + onTap: () => showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(t.localeName == "sv" ? "Stopp!" : "Stop!"), + content: Text(t.localeName == "sv" + ? "Uppdragen kommer att släppas snart! (men inte än)" + : "The quests will be released soon! (but not yet)"), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: Text("OK")) + ], + )), + child: Image.asset(questButton) + ), + ) + ], + ), + ), + Padding(padding: EdgeInsets.only(bottom: bottomMargin), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + width: screenWidth / buttonSize, + child: InkWell( + onTap: () => (Navigator.push(context, MaterialPageRoute(builder: (context) => SongbookPage()))), + child: Image.asset(songButton) + ), + ), + SizedBox( + height: buttonSpace, + ), + Container( + width: screenWidth / buttonSize, + child: InkWell( + onTap: () => (Navigator.push(context, MaterialPageRoute(builder: (context) => MapView()))), + child: Image.asset(mapButton) + ), + ) + ], + ), + ), + ], + ),) + ],), + ); + } +} \ No newline at end of file diff --git a/lib/screens/moose_game/game_theme.dart b/lib/screens/moose_game/game_theme.dart new file mode 100644 index 00000000..e1a9bc06 --- /dev/null +++ b/lib/screens/moose_game/game_theme.dart @@ -0,0 +1,169 @@ +import 'package:flutter/material.dart'; +import 'package:fsek_mobile/services/service_locator.dart'; +import 'package:fsek_mobile/services/theme.service.dart'; +import 'package:fsek_mobile/themes.dart'; + +import 'obstacle_def.dart'; +import 'sprite.dart'; + +/// Simple toggle to switch between space and regular theme. +const bool spaceTheme = true; + +const String _dir = "assets/img/moose_game/"; + +String _themed(String light, String dark) => + locator().theme.brightness == Brightness.light ? light : dark; + +Color? get backgroundColor => + spaceTheme ? const Color.fromARGB(255, 55, 44, 117) : null; + +/// Force a specific theme for the game text in space theme, +/// since we use a custom background color. +Color gameTextColor(BuildContext context) => spaceTheme + ? themeFdark.colorScheme.onSurface + : Theme.of(context).colorScheme.onSurface; + +/// How high above the ground the flying obstacles (the UFOs) hover. +/// Very specific number to give a tiny window for a jump to pass over the UFO. +const double flyingObstacleHeight = 1.89; + +/// Wall guard protects against a stack of a ground obstacle and a flying obstacle +/// this double is the smallest arrival time difference between the two which is allowed +const double wallGuardSeconds = 0.4; + +/// Native pixel size of each space moose frame. These have to match the actual +/// PNGs; see [_spaceMoose] for why they can't all just be 24x24. +const Map> _spaceMooseFrames = { + "hilbert_space_run_1": [27, 25], + "hilbert_space_run_2": [27, 24], + "hilbert_space_run_3": [27, 24], + "hilbert_space_run_4": [27, 25], + "hilbert_space_jump": [28, 32], + "hilbert_space_fall": [27, 23], +}; + +/// The moose is drawn with BoxFit.scaleDown, which fits the whole image inside +/// the sprite box. Since frames have different pixel widths and heights, we +/// have to scale the image properly so that the moose doesn't shrink or grow between +/// frames or jump and fall. +const double _mooseFrameScale = 24 / 27; // the run frames are 27px wide + +/// Nudge in pixelart pixels, centers the moose head and body when jumping +const Map _spaceMooseNudge = {"hilbert_space_jump": 2}; + +Sprite _spaceMoose(String name) { + final List size = _spaceMooseFrames[name]!; + return Sprite( + "$_dir$name.png", + size[0] * _mooseFrameScale, + size[1] * _mooseFrameScale, + (_spaceMooseNudge[name] ?? 0) * _mooseFrameScale, + ); +} + +/// 4 frames, from 1..4 +Sprite mooseRunSprite(int frame) => spaceTheme + ? _spaceMoose("hilbert_space_run_$frame") + : Sprite( + _themed( + "${_dir}hilbert_pixel_run_$frame.png", + "${_dir}hilbert_pixel_run_${frame}_d.png", + ), + 24, + 24, + ); + +Sprite get mooseJumpSprite => spaceTheme + ? _spaceMoose("hilbert_space_jump") + : Sprite( + _themed( + "${_dir}hilbert_pixel_jump.png", + "${_dir}hilbert_pixel_jump_d.png", + ), + 24, + 24, + ); + +Sprite get mooseFallSprite => spaceTheme + ? _spaceMoose("hilbert_space_fall") + : Sprite( + _themed( + "${_dir}hilbert_pixel_fall.png", + "${_dir}hilbert_pixel_fall_d.png", + ), + 24, + 24, + ); + +Sprite get pickupSprite => spaceTheme + ? Sprite("${_dir}o2_bottle.png", 10, 24) + : Sprite( + _themed("${_dir}hilbert_sandwich.png", "${_dir}hilbert_sandwich_d.png"), + 24, + 24, + ); + +Sprite get groundSprite => spaceTheme + ? Sprite("${_dir}ground_d.png", 240, 48) + : Sprite(_themed("${_dir}ground.png", "${_dir}ground_d.png"), 240, 48); + +List buildObstacles() => spaceTheme + ? [ + ObstacleDef(Sprite("${_dir}galaxy.png", 19, 18, 2), 1.0), + ObstacleDef(Sprite("${_dir}rocket.png", 21, 24), 1.0), + ObstacleDef(Sprite("${_dir}antenna.png", 24, 24), 1.0), + ObstacleDef(Sprite("${_dir}alien_voi_l.png", 15, 24), 0.4, 1.0, 2.0), + ObstacleDef(Sprite("${_dir}alien_voi_r.png", 15, 24), 0.2, -1.0, -2.0), + ObstacleDef(Sprite("${_dir}ufo_l.png", 24, 24), 0.2, 2.0, 4.0, true), + ObstacleDef(Sprite("${_dir}ufo_r.png", 24, 24), 0.1, -2.0, -4.0, true), + ] + : [ + ObstacleDef( + Sprite(_themed("${_dir}kiosk.png", "${_dir}kiosk_d.png"), 24, 24), + 1.0, + ), + ObstacleDef( + Sprite(_themed("${_dir}v_nails.png", "${_dir}v_nails_d.png"), 24, 24), + 1.0, + ), + ObstacleDef( + Sprite( + _themed("${_dir}f_rubik_2.png", "${_dir}f_rubik_2_d.png"), + 24, + 24, + ), + 1.0, + ), + ObstacleDef( + Sprite(_themed("${_dir}bike_l.png", "${_dir}bike_l_d.png"), 24, 24), + 0.4, + 1.0, + 2.0, + ), + ObstacleDef( + Sprite(_themed("${_dir}bike_r.png", "${_dir}bike_r_d.png"), 24, 24), + 0.2, + -1.0, + -2.0, + ), + ObstacleDef( + Sprite( + _themed("${_dir}scooter_l.png", "${_dir}scooter_l_d.png"), + 24, + 24, + ), + 0.4, + 1.0, + 2.0, + ), + ObstacleDef( + Sprite( + _themed("${_dir}scooter_r.png", "${_dir}scooter_r_d.png"), + 24, + 24, + ), + 0.2, + -1.0, + -2.0, + ), + ]; diff --git a/lib/screens/moose_game/ground.dart b/lib/screens/moose_game/ground.dart index eb799c13..726e0722 100644 --- a/lib/screens/moose_game/ground.dart +++ b/lib/screens/moose_game/ground.dart @@ -1,24 +1,13 @@ import 'package:vector_math/vector_math.dart'; -import 'package:flutter/material.dart'; - import 'package:fsek_mobile/screens/moose_game/game_object.dart'; -import 'package:fsek_mobile/services/service_locator.dart'; -import 'package:fsek_mobile/services/theme.service.dart'; - -import 'sprite.dart'; +import 'package:fsek_mobile/screens/moose_game/game_theme.dart'; class Ground extends GameObject { - Sprite groundSprite = Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/ground.png" : - "assets/img/moose_game/ground_d.png", 240, 48); - static const int groundWidth = 10; - Ground(double xPosition, double floorY) : super(Vector2(xPosition, floorY)) { sprite = groundSprite; } + static const int groundWidth = 10; @override - void update(double deltaTime) { - - } -} \ No newline at end of file + void update(double deltaTime) {} +} diff --git a/lib/screens/moose_game/moose.dart b/lib/screens/moose_game/moose.dart index f8fc6953..d4731c9d 100644 --- a/lib/screens/moose_game/moose.dart +++ b/lib/screens/moose_game/moose.dart @@ -1,40 +1,19 @@ import 'dart:ui'; import 'package:fsek_mobile/screens/moose_game/game_object.dart'; +import 'package:fsek_mobile/screens/moose_game/game_theme.dart'; import 'package:fsek_mobile/screens/moose_game/sprite.dart'; import 'package:vector_math/vector_math.dart'; -import 'package:fsek_mobile/services/service_locator.dart'; -import 'package:fsek_mobile/services/theme.service.dart'; enum MooseState { running, jumping, ducking, falling } class Moose extends GameObject { - // Big lazy conditional, sorry. - Sprite mooseRun1 = Sprite( - locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/hilbert_pixel_run_1.png" : - "assets/img/moose_game/hilbert_pixel_run_1_d.png", 24, 24); - Sprite mooseRun2 = Sprite( - locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/hilbert_pixel_run_2.png" : - "assets/img/moose_game/hilbert_pixel_run_2_d.png", 24, 24); - Sprite mooseRun3 = Sprite( - locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/hilbert_pixel_run_3.png" : - "assets/img/moose_game/hilbert_pixel_run_3_d.png", 24, 24); - Sprite mooseRun4 = Sprite( - locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/hilbert_pixel_run_4.png" : - "assets/img/moose_game/hilbert_pixel_run_4_d.png", 24, 24); - Sprite mooseJump = Sprite( - locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/hilbert_pixel_jump.png" : - "assets/img/moose_game/hilbert_pixel_jump_d.png", 24, 24); - Sprite mooseFall = Sprite( - locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/hilbert_pixel_fall.png" : - "assets/img/moose_game/hilbert_pixel_fall_d.png", 24, 24); - + Sprite get mooseRun1 => mooseRunSprite(1); + Sprite get mooseRun2 => mooseRunSprite(2); + Sprite get mooseRun3 => mooseRunSprite(3); + Sprite get mooseRun4 => mooseRunSprite(4); + Sprite get mooseJump => mooseJumpSprite; + Sprite get mooseFall => mooseFallSprite; double yVelocity = 0; final double jumpForce = 20; diff --git a/lib/screens/moose_game/moose_game.dart b/lib/screens/moose_game/moose_game.dart index 89c98c5d..4d07da94 100644 --- a/lib/screens/moose_game/moose_game.dart +++ b/lib/screens/moose_game/moose_game.dart @@ -3,6 +3,7 @@ import 'dart:core'; import 'package:flutter/material.dart'; import 'package:fsek_mobile/screens/moose_game/game_object.dart'; +import 'package:fsek_mobile/screens/moose_game/game_theme.dart'; import 'package:fsek_mobile/screens/moose_game/ground.dart'; import 'package:fsek_mobile/screens/moose_game/highscore.dart'; import 'package:fsek_mobile/screens/moose_game/obstacle.dart'; @@ -122,6 +123,7 @@ class _MooseGamePageState extends State } void initializeGame() { + gameSpeed = startGameSpeed.toDouble(); obstacles.add(Obstacle(gameViewportWidth, floorY)); double previousPos = gameViewportWidth; for (int i = 1; i < obstacleCount; i++) { @@ -129,6 +131,7 @@ class _MooseGamePageState extends State Random().nextDouble() * (maxObstacleDistance - minObstacleDistance) + minObstacleDistance; obstacles.add(Obstacle(previousPos, floorY)); + separateFromWall(obstacles.last); } leftmostObstacleIdx = 0; sandwich = Sandwich(0.0, 1.0); @@ -196,6 +199,7 @@ class _MooseGamePageState extends State minObstacleDistance); obst.randomize(); + separateFromWall(obst); leftmostObstacleIdx = (leftmostObstacleIdx + 1) % obstacleCount; }); } @@ -226,6 +230,45 @@ class _MooseGamePageState extends State lastUpdateTime = gameAnimController.lastElapsedDuration!; } + /// Seconds until an obstacle reaches the moose + double? timeToMoose(Obstacle obst) { + double closingSpeed = gameSpeed + obst.speed; + if (closingSpeed <= 0) return null; + return (obst.position.x - moose.position.x) / closingSpeed; + } + + /// Called for each new obstacle, and checks if they could form a wall with + /// another obstacle which is impossible to both jump over (regular obstacle) + /// and run under (ufo). If so, push it out of the way. + void separateFromWall(Obstacle obst) { + double closingSpeed = gameSpeed + obst.speed; + if (closingSpeed <= 0) return; + for (int pass = 0; pass < 4; pass++) { // 4 tries at pushing it out of the way + bool moved = false; + for (Obstacle other in obstacles) { + if (identical(other, obst) || other.flying == obst.flying) continue; + double? arrival = timeToMoose(obst); + double? otherArrival = timeToMoose(other); + if (arrival == null || otherArrival == null) continue; // Already passed + if ((arrival - otherArrival).abs() >= wallGuardSeconds) continue; + obst.position.x = + moose.position.x + (otherArrival + wallGuardSeconds) * closingSpeed; + moved = true; + } + if (!moved) break; // No more walls, we're done + } + + // Overlap check. We don't want overlapping obstacles, so pop it off the + // left edge. update() recycles anything past there, so it gets a + // fresh position and type on one of the next frames. + for (Obstacle other in obstacles) { + if (identical(other, obst) || other.flying != obst.flying) continue; + if ((other.position.x - obst.position.x).abs() < minObstacleDistance) { + obst.position.x = -gameViewportWidth - 1; + } + } + } + void updateSandwich() { setState(() { sandwich.position.x = sandwich.position.x + @@ -287,7 +330,9 @@ class _MooseGamePageState extends State screenSize.width / 2 + (gameObject.position.x - cameraPos.x) * worldScale * 24, screenSize.height / 2 - - (gameObject.position.y + cameraPos.y) * worldScale * 24), + (gameObject.position.y + cameraPos.y) * worldScale * 24 + + // Screen y grows downwards, so a positive nudge is added here. + gameObject.sprite.yOffset * worldScale), width: gameObject.sprite.imageWidth * worldScale * deflation, height: gameObject.sprite.imageHeight * worldScale * deflation, ); @@ -348,7 +393,10 @@ class _MooseGamePageState extends State alignment: Alignment.center, child: Text( score.toInt().toString(), - style: const TextStyle(fontFamily: "NF-Pixels", fontSize: 60), + style: TextStyle( + fontFamily: "NF-Pixels", + fontSize: 60, + color: gameTextColor(context)), )))); // Sandwhich bonus popup @@ -358,12 +406,10 @@ class _MooseGamePageState extends State alignment: Alignment.center, child: Text( "+" + lastSandwichBonus.toInt().toString(), - style: new TextStyle( + style: TextStyle( fontFamily: "NF-Pixels", fontSize: 50, - color: Theme.of(context) - .colorScheme - .onSurface + color: gameTextColor(context) .withAlpha(sandwichBonusPopupFadeout)), )))); @@ -374,7 +420,10 @@ class _MooseGamePageState extends State alignment: Alignment.center, child: Text( "Highscore: " + highscore.toInt().toString(), - style: const TextStyle(fontFamily: "NF-Pixels", fontSize: 40), + style: TextStyle( + fontFamily: "NF-Pixels", + fontSize: 40, + color: gameTextColor(context)), )))); // "Try again" text @@ -385,7 +434,10 @@ class _MooseGamePageState extends State alignment: Alignment.center, child: Text( "Touch to try again", - style: const TextStyle(fontFamily: "NF-Pixels", fontSize: 40), + style: TextStyle( + fontFamily: "NF-Pixels", + fontSize: 40, + color: gameTextColor(context)), )))); if (newHighscore) { @@ -395,7 +447,10 @@ class _MooseGamePageState extends State alignment: Alignment.center, child: Text( "New Highscore", - style: const TextStyle(fontFamily: "NF-Pixels", fontSize: 50), + style: TextStyle( + fontFamily: "NF-Pixels", + fontSize: 50, + color: gameTextColor(context)), )))); } } @@ -454,10 +509,15 @@ class _MooseGamePageState extends State moose.triggerFall(); } }, - child: Stack( - alignment: Alignment.center, - children: children, - ), + child: Container( + color: backgroundColor, + width: double.infinity, + height: double.infinity, + child: Stack( + alignment: Alignment.center, + children: children, + ), + ) ), ); } diff --git a/lib/screens/moose_game/obstacle.dart b/lib/screens/moose_game/obstacle.dart index 59155f2a..7fa57744 100644 --- a/lib/screens/moose_game/obstacle.dart +++ b/lib/screens/moose_game/obstacle.dart @@ -3,82 +3,31 @@ import 'dart:ui'; import 'package:vector_math/vector_math.dart'; import 'package:fsek_mobile/screens/moose_game/game_object.dart'; +import 'package:fsek_mobile/screens/moose_game/game_theme.dart'; import 'package:fsek_mobile/services/service_locator.dart'; import 'package:fsek_mobile/services/theme.service.dart'; import 'package:fsek_mobile/screens/moose_game/obstacle_def.dart'; -import 'sprite.dart'; - -List obstacles = [ - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/kiosk.png" : - "assets/img/moose_game/kiosk_d.png", 24, 24), 1.0), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/v_nails.png" : - "assets/img/moose_game/v_nails_d.png", 24, 24), 1.0), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/f_rubik_2.png" : - "assets/img/moose_game/f_rubik_2_d.png", 24, 24), 1.0), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/bike_l.png" : - "assets/img/moose_game/bike_l_d.png", 24, 24), 0.4, 1.0, 2.0, - ), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/bike_r.png" : - "assets/img/moose_game/bike_r_d.png", 24, 24), 0.2, -1.0, -2.0, - ), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/scooter_l.png" : - "assets/img/moose_game/scooter_l_d.png", 24, 24), 0.4, 1.0, 2.0, - ), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/scooter_r.png" : - "assets/img/moose_game/scooter_r_d.png", 24, 24), 0.2, -1.0, -2.0, - ), -]; +List obstacles = buildObstacles(); Brightness savedBrightness = locator().theme.brightness; class Obstacle extends GameObject { double movementSpeed = 0.0; + bool flying = false; + final double floorY; double get speed { return movementSpeed; } - Obstacle(double xPosition, double floorY) + Obstacle(double xPosition, this.floorY) : super(Vector2(xPosition, floorY)) { randomize(); } void reloadSprites() { - obstacles = [ - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/kiosk.png" : - "assets/img/moose_game/kiosk_d.png", 24, 24), 1.0), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/v_nails.png" : - "assets/img/moose_game/v_nails_d.png", 24, 24), 1.0), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/f_rubik_2.png" : - "assets/img/moose_game/f_rubik_2_d.png", 24, 24), 1.0), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/bike_l.png" : - "assets/img/moose_game/bike_l_d.png", 24, 24), 0.4, 1.0, 2.0, - ), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/bike_r.png" : - "assets/img/moose_game/bike_r_d.png", 24, 24), 0.2, -1.0, -2.0, - ), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/scooter_l.png" : - "assets/img/moose_game/scooter_l_d.png", 24, 24), 0.4, 1.0, 2.0, - ), - ObstacleDef(Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/scooter_r.png" : - "assets/img/moose_game/scooter_r_d.png", 24, 24), 0.2, -1.0, -2.0, - ), - ]; + obstacles = buildObstacles(); } void randomize() { @@ -104,6 +53,9 @@ class Obstacle extends GameObject { } } sprite = def.sprite; + flying = def.flying; + // Flying obstacles hover just above the running moose + position.y = def.flying ? flyingObstacleHeight : floorY; movementSpeed = lerpDouble(def.minSpeed, def.maxSpeed, Random().nextDouble())!; } diff --git a/lib/screens/moose_game/obstacle_def.dart b/lib/screens/moose_game/obstacle_def.dart index 98801c7c..d43f6e66 100644 --- a/lib/screens/moose_game/obstacle_def.dart +++ b/lib/screens/moose_game/obstacle_def.dart @@ -5,11 +5,19 @@ class ObstacleDef { late double spawnWeight; late double minSpeed; late double maxSpeed; + late bool flying; - ObstacleDef(sprite, [spawnWeight = 1.0, minSpeed = 0.0, maxSpeed = 0.0]) { + ObstacleDef( + sprite, [ + spawnWeight = 1.0, + minSpeed = 0.0, + maxSpeed = 0.0, + flying = false, + ]) { this.sprite = sprite; this.spawnWeight = spawnWeight; this.minSpeed = minSpeed; this.maxSpeed = maxSpeed; + this.flying = flying; } } diff --git a/lib/screens/moose_game/sandwich.dart b/lib/screens/moose_game/sandwich.dart index 3313ac10..cdde9b95 100644 --- a/lib/screens/moose_game/sandwich.dart +++ b/lib/screens/moose_game/sandwich.dart @@ -1,17 +1,11 @@ import 'package:vector_math/vector_math.dart'; -import 'package:flutter/material.dart'; -import 'package:fsek_mobile/services/service_locator.dart'; -import 'package:fsek_mobile/services/theme.service.dart'; import 'package:fsek_mobile/screens/moose_game/game_object.dart'; - -import 'sprite.dart'; +import 'package:fsek_mobile/screens/moose_game/game_theme.dart'; class Sandwich extends GameObject { Sandwich(double xPosition, double floorY) : super(Vector2(xPosition, floorY)) { - sprite = Sprite(locator().theme.brightness == Brightness.light ? - "assets/img/moose_game/hilbert_sandwich.png" : - "assets/img/moose_game/hilbert_sandwich_d.png", 24, 24); + sprite = pickupSprite; } @override diff --git a/lib/screens/moose_game/sprite.dart b/lib/screens/moose_game/sprite.dart index 18b575bc..35ffe128 100644 --- a/lib/screens/moose_game/sprite.dart +++ b/lib/screens/moose_game/sprite.dart @@ -1,7 +1,11 @@ class Sprite { final String imagePath; - final int imageWidth; - final int imageHeight; + // Allow fractional sizes so we can scale graphics to exactly line up on a pixel level + final double imageWidth; + final double imageHeight; + // Nudge the sprite. Positive is down. + final double yOffset; - const Sprite(this.imagePath, this.imageWidth, this.imageHeight); -} \ No newline at end of file + const Sprite(this.imagePath, this.imageWidth, this.imageHeight, + [this.yOffset = 0]); +} diff --git a/lib/screens/nollning/adventure_missions_new.dart b/lib/screens/nollning/adventure_missions_new.dart index d76d6997..cd2c07d7 100644 --- a/lib/screens/nollning/adventure_missions_new.dart +++ b/lib/screens/nollning/adventure_missions_new.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fsek_mobile/screens/nollning/adventure_missions_tab_new.dart'; import 'package:fsek_mobile/screens/nollning/highscore_tab_new.dart'; -import 'package:fsek_mobile/screens/nollning/questscreen/quests.dart'; +import 'package:fsek_mobile/screens/nollning/questscreen_24/quests.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; class AdventureMissionsPageNew extends StatefulWidget { diff --git a/lib/screens/nollning/emergency_contacts.dart b/lib/screens/nollning/emergency_contacts.dart index 3b9c28ba..c4aadb6d 100644 --- a/lib/screens/nollning/emergency_contacts.dart +++ b/lib/screens/nollning/emergency_contacts.dart @@ -72,6 +72,12 @@ class _EmergencyContactsPageState extends State { headerPhoneNumber: t.emergencyNumSeven, headerText: t.emergencyTitleSeven, bodyText: t.emergencyContentSeven, + ), + _EmergencyText( + // Dummy number because this title is different + headerPhoneNumber: "", + headerText: t.emergencyTitleEight, + bodyText: t.emergencyContentEight, ) ], ), diff --git a/lib/screens/nollning/englishSchedule.dart b/lib/screens/nollning/englishSchedule.dart new file mode 100644 index 00000000..e12cf002 --- /dev/null +++ b/lib/screens/nollning/englishSchedule.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class EnglishSchedulePage extends StatefulWidget { + @override + _englishSchedulePageState createState() => _englishSchedulePageState(); +} + +class _englishSchedulePageState extends State { + final ScrollController scrollController = ScrollController(); + final Color bottomColor = new Color.fromRGBO(113, 197, 208, 1); + final Color topColor = new Color.fromRGBO(42, 23, 17, 1); + + late Color currentBackgroundColor; + + @override + void initState() { + super.initState(); + currentBackgroundColor = bottomColor; + scrollController.addListener(_onScroll); + } + + void _onScroll(){ + if(!scrollController.hasClients) return; + + final maxScroll = scrollController.position.maxScrollExtent; + final currentScroll = scrollController.offset; + + if(maxScroll == 0) return; + final progress = (currentScroll / maxScroll).clamp(0.0, 1.0); + + if(progress >= 0.5 && currentBackgroundColor != topColor) { + setState(() { + currentBackgroundColor = topColor; + }); + } else if(progress < 0.5 && currentBackgroundColor != bottomColor) { + setState(() { + currentBackgroundColor = bottomColor; + }); + } + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final schema_path = "assets/data/nollning_26/schema/schema_en.png"; + + return Scaffold( + backgroundColor: currentBackgroundColor, + extendBodyBehindAppBar: true, + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + ), + body: SingleChildScrollView( + controller: scrollController, + reverse: true, + child: Image.asset( + schema_path, + width: double.infinity, + fit: BoxFit.fitWidth, + cacheHeight: 5000, + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/map_page.dart b/lib/screens/nollning/map_page.dart index 75d690f8..4aa5dbbc 100644 --- a/lib/screens/nollning/map_page.dart +++ b/lib/screens/nollning/map_page.dart @@ -1,48 +1,41 @@ +import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:photo_view/photo_view.dart'; +import 'package:flutter/services.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; class PlaceInfo { - // final String title; - // final String description_en; - // final String description_sv; - // final int top; - // final int left; + final String titleSv; + final String titleEn; + final String descriptionSv; + final String descriptionEn; + final List descriptionAssets; + final List boxes; // final String asset; - // final String? extraAsset; - - // PlaceInfo({ - // required this.title, - // required this.description_en, - // required this.description_sv, - // required this.top, - // required this.left, - // required this.asset, - // required this.extraAsset, - // }); - - // factory PlaceInfo.fromJson(Map json) { - // return PlaceInfo( - // title: json['title'], - // description_en: json['description']['en'], - // description_sv: json['description']['sv'], - // top: json['top'], - // left: json['left'], - // asset: json['asset'], - // extraAsset: json['extraAsset'], - // ); - // } -} -// Future> loadJson() async { -// String jsonString = -// await rootBundle.loadString('assets/data/nollning-24/map_info.json'); -// final jsonResponse = json.decode(jsonString); + const PlaceInfo({ + required this.titleSv, + required this.titleEn, + required this.descriptionSv, + required this.descriptionEn, + required this.descriptionAssets, + required this.boxes, + // required this.asset, + }); -// return (jsonResponse as List) -// .map((place) => PlaceInfo.fromJson(place)) -// .toList(); -// } + factory PlaceInfo.fromJson(Map json) { + return PlaceInfo( + titleSv: json["title"]["sv"], + titleEn: json["title"]["en"], + descriptionSv: json["description"]["sv"], + descriptionEn: json["description"]["en"], + descriptionAssets: List.from(json["descriptionAssets"]), + boxes: (json["boxes"] as List).map((box) => Rect.fromLTWH( + box["left"], box["top"], box["width"], box["height"] + )).toList(), + // asset: json["asset"], + ); + } +} class MapView extends StatefulWidget { @override @@ -50,118 +43,221 @@ class MapView extends StatefulWidget { } class _MapViewState extends State { - // String baseAssetPath = "assets/img/nollning-24/karta/"; - // String imagePath = "assets/data/nollning_25/nolleguide/karta.png"; - final String imagePath = "assets/data/nollning_25/karta.png"; - // final double pinWidth = 17.0; - // final double pinHeight = 17.0; - // final int imageWidth = 2900; - // final int imageHeight = 2480; - - List? pins; - - void initState() { - super.initState(); + final _imagePath = "assets/data/nollning_26/map/map.png"; + final _imageWidth = 3050; + final _imageHeight = 4062; + + double get _bodyHeight => MediaQuery.of(context).size.height - (MediaQuery.of(context).padding.top + kToolbarHeight); // Remove height of AppBar + double get _bodyWidth => MediaQuery.of(context).size.width; + double get _displayHeight => _bodyWidth * _imageHeight / _imageWidth; + + final _transformationController = TransformationController(); + + List? pins; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + _applyInitialZoom(); + _placePins(context); + } + + @override + void dispose() { + _transformationController.dispose(); + + super.dispose(); + } + + void _applyInitialZoom() { + final zoomFactor = _bodyHeight / _displayHeight; + + _transformationController.value.setEntry(0, 0, zoomFactor); + _transformationController.value.setEntry(1, 1, zoomFactor); + _transformationController.value.setEntry(2, 2, zoomFactor); + + final xOffset = _bodyWidth * (1 - zoomFactor) / 2; + final yOffset = _bodyHeight * (1 - zoomFactor) / 2; + _transformationController.value.setEntry(0, 3, xOffset); + _transformationController.value.setEntry(1, 3, yOffset); + } + + Future> loadJson() async { + const mapInfoPath = "assets/data/nollning_26/map/map_info.json"; + final jsonString = await rootBundle.loadString(mapInfoPath); + final jsonResponse = json.decode(jsonString); + + return (jsonResponse as List) + .map((place) => PlaceInfo.fromJson(place)); + } + + Future _placePins(BuildContext context) async { + final placeInfos = await loadJson(); + for (final placeInfo in placeInfos) { + for (final asset in placeInfo.descriptionAssets) { + precacheImage(AssetImage(asset), context); + } + } + + final locale = Localizations.localeOf(context).toString(); + + final scale = _bodyWidth / _imageWidth; + final yOffset = (_bodyHeight - _displayHeight) / 2; + + List pinList = []; + for (final placeInfo in placeInfos) { + for (final box in placeInfo.boxes) { + pinList.add(Positioned.fromRect( + rect: Rect.fromLTWH(box.left * scale, box.top * scale, box.width * scale, box.height * scale).translate(0, yOffset), // boxes are in (image-)absolute coordinates + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => showDialog( + context: context, + builder: _buildPOIDialog( + locale == "sv" ? placeInfo.titleSv : placeInfo.titleEn, + locale == "sv" ? placeInfo.descriptionSv : placeInfo.descriptionEn, + placeInfo.descriptionAssets, + ) + ), + child: Container( + color: Colors.transparent + // decoration: BoxDecoration( + // color: Colors.red.withAlpha(128), + // border: Border.all(color: Colors.red), + // ) + ) + ), + )); + } + } + + setState(() { + pins = pinList; + }); + } + + Widget Function(BuildContext) _buildPOIDialog(String title, String description, + List? descriptionAssets) { + return (BuildContext context) => AlertDialog( + // constraints: BoxConstraints( + // minWidth: MediaQuery.of(context).size.width + // ), + backgroundColor: const Color(0xFFFF00FF), + contentPadding: const EdgeInsets.all(20), + content: Container( + padding: const EdgeInsets.all(0), + decoration: const BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.all(Radius.circular(10)) + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + spacing: 10, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: FittedBox( + // fit: BoxFit.contain, + child: Text( + title, + style: const TextStyle( + color: Colors.white, + fontFamily: "NF-Pixels", + fontSize: 30 + ) + ) + ) + ), + + IconButton( + onPressed: () { + Navigator.of(context).pop(); + }, + icon: const Icon(Icons.close), + color: Colors.white + ) + ] + ), + + if (descriptionAssets != null) + ...descriptionAssets.map((asset) => InteractiveViewer( + minScale: 1, + maxScale: 5, + child: Image.asset( + asset, + fit: BoxFit.contain + ) + )), + + Text( + description, + style: const TextStyle( + color: Colors.white, + fontFamily: "NF-Pixels", + fontSize: 20 + ), + ) + ] + ) + ) + ) + ); } @override Widget build(BuildContext context) { - double bodyHeight = MediaQuery.of(context).size.height - - (MediaQuery.of(context).padding.top + - kToolbarHeight); // Remove height of AppBar - double bodyWidth = MediaQuery.of(context).size.width; - - // _placePins(context, bodyHeight, bodyWidth).then((value) { - // pins = value; - // setState(() {}); - // }); return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context)!.introductionMap), ), + // body: PhotoView.customChild( + // backgroundDecoration: BoxDecoration(color: Color(0xff2c2724)), + // childSize: Size( + // _imageWidth.toDouble(), + // _imageHeight.toDouble(), + // ), + // initialScale: PhotoViewComputedScale.covered, + // // minScale: PhotoViewComputedScale.contained, + // // maxScale: PhotoViewComputedScale.covered * 6, + // gestureDetectorBehavior: HitTestBehavior.translucent, + // child: SizedBox( // Probably not neded but + // width: _imageWidth.toDouble(), + // height: _imageHeight.toDouble(), + // child: Stack( + // alignment: Alignment.center, + // children: [ + // Image.asset(_imagePath), + // ...?pins, + // ], + // ) + // ) + // ) + body: Container( - child: PhotoView.customChild( - initialScale: 2.0, - backgroundDecoration: BoxDecoration(color: Color(0xff2c2724)), - child: Stack( - alignment: Alignment.center, - children: [ - Image.asset(imagePath), // Your map image - // ...?pins, - ], - ), + color: const Color(0xff2c2724), + child: InteractiveViewer( + transformationController: _transformationController, minScale: 1.0, maxScale: 6.0, - ), - ), + child: SizedBox( + width: _imageWidth.toDouble(), + height: _imageHeight.toDouble(), + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset(_imagePath), + + ...?pins, + ] + ) + ) + ) + ) ); } - - // Future> _placePins( - // BuildContext context, double bodyHeight, double bodyWidth) async { - // List placeInfos = await loadJson(); - // String locale = Localizations.localeOf(context).toString(); - // var pinList = placeInfos - // .map((data) => Positioned( - // top: bodyHeight / 2 + - // (data.top - 0.5 * imageHeight) * bodyWidth / imageWidth - - // pinHeight / 2, - // left: bodyWidth * data.left / imageWidth - pinWidth / 2, - // child: GestureDetector( - // onTap: () => _showPOIDialog( - // context, - // data.title, - // (locale == "sv") ? data.description_sv : data.description_en, - // data.extraAsset, - // ), - // child: Image.asset( - // baseAssetPath + data.asset, - // height: pinHeight, - // width: pinWidth, - // ), - // ), - // )) - // .toList(); - // return pinList; - // } - - // void _showPOIDialog(BuildContext context, String title, String description, - // String? extraAsset) { - // showDialog( - // context: context, - // builder: (BuildContext context) { - // return AlertDialog( - // backgroundColor: const Color(0xffdcc394), - // title: Text( - // title, - // style: TextStyle(fontFamily: 'Testament'), - // ), - // content: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // Text( - // description, - // style: TextStyle(fontFamily: 'Testament'), - // ), - // (extraAsset != null) - // ? Image.asset(baseAssetPath + "extraAssets/" + extraAsset) - // : SizedBox.shrink(), - // ], - // ), - // actions: [ - // TextButton( - // style: TextButton.styleFrom(backgroundColor: Color(0xff630b0b)), - // onPressed: () { - // Navigator.of(context).pop(); - // }, - // child: Text( - // AppLocalizations.of(context)!.introductionMapClose, - // style: TextStyle(fontFamily: 'Testament'), - // ), - // ), - // ], - // ); - // }, - // ); - // } } diff --git a/lib/screens/nollning/nolleguide/manners.dart b/lib/screens/nollning/nolleguide_23/manners.dart similarity index 100% rename from lib/screens/nollning/nolleguide/manners.dart rename to lib/screens/nollning/nolleguide_23/manners.dart diff --git a/lib/screens/nollning/nolleguide/nolleguide.dart b/lib/screens/nollning/nolleguide_23/nolleguide.dart similarity index 100% rename from lib/screens/nollning/nolleguide/nolleguide.dart rename to lib/screens/nollning/nolleguide_23/nolleguide.dart diff --git a/lib/screens/nollning/nolleguide/people.dart b/lib/screens/nollning/nolleguide_23/people.dart similarity index 100% rename from lib/screens/nollning/nolleguide/people.dart rename to lib/screens/nollning/nolleguide_23/people.dart diff --git a/lib/screens/nollning/nolleguide-24/kladguide.dart b/lib/screens/nollning/nolleguide_24/kladguide.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/kladguide.dart rename to lib/screens/nollning/nolleguide_24/kladguide.dart diff --git a/lib/screens/nollning/nolleguide-24/nolleguidescreen.dart b/lib/screens/nollning/nolleguide_24/nolleguidescreen.dart similarity index 96% rename from lib/screens/nollning/nolleguide-24/nolleguidescreen.dart rename to lib/screens/nollning/nolleguide_24/nolleguidescreen.dart index 5654e08e..6599535d 100644 --- a/lib/screens/nollning/nolleguide-24/nolleguidescreen.dart +++ b/lib/screens/nollning/nolleguide_24/nolleguidescreen.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/kladguide.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/stodfunktioner.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/wordlist.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/orgscreen/org_screen.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/studentvett.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/kladguide.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/stodfunktioner.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/wordlist.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/orgscreen/org_screen.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/studentvett.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; import 'package:fsek_mobile/services/preload_asset.service.dart'; diff --git a/lib/screens/nollning/nolleguide-24/orgscreen/committee_page.dart b/lib/screens/nollning/nolleguide_24/orgscreen/committee_page.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/orgscreen/committee_page.dart rename to lib/screens/nollning/nolleguide_24/orgscreen/committee_page.dart diff --git a/lib/screens/nollning/nolleguide-24/orgscreen/guilds.dart b/lib/screens/nollning/nolleguide_24/orgscreen/guilds.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/orgscreen/guilds.dart rename to lib/screens/nollning/nolleguide_24/orgscreen/guilds.dart diff --git a/lib/screens/nollning/nolleguide-24/orgscreen/nations.dart b/lib/screens/nollning/nolleguide_24/orgscreen/nations.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/orgscreen/nations.dart rename to lib/screens/nollning/nolleguide_24/orgscreen/nations.dart diff --git a/lib/screens/nollning/nolleguide-24/orgscreen/org_screen.dart b/lib/screens/nollning/nolleguide_24/orgscreen/org_screen.dart similarity index 96% rename from lib/screens/nollning/nolleguide-24/orgscreen/org_screen.dart rename to lib/screens/nollning/nolleguide_24/orgscreen/org_screen.dart index 3ab1c257..7bb5c690 100644 --- a/lib/screens/nollning/nolleguide-24/orgscreen/org_screen.dart +++ b/lib/screens/nollning/nolleguide_24/orgscreen/org_screen.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/orgscreen/nations.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/orgscreen/committee_page.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/orgscreen/spex.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/orgscreen/others.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/orgscreen/nations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/orgscreen/committee_page.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/orgscreen/spex.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/orgscreen/others.dart'; import 'package:fsek_mobile/services/preload_asset.service.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide-24/orgscreen/guilds.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_24/orgscreen/guilds.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; class OrganizationScreenPage extends StatefulWidget { diff --git a/lib/screens/nollning/nolleguide-24/orgscreen/others.dart b/lib/screens/nollning/nolleguide_24/orgscreen/others.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/orgscreen/others.dart rename to lib/screens/nollning/nolleguide_24/orgscreen/others.dart diff --git a/lib/screens/nollning/nolleguide-24/orgscreen/spex.dart b/lib/screens/nollning/nolleguide_24/orgscreen/spex.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/orgscreen/spex.dart rename to lib/screens/nollning/nolleguide_24/orgscreen/spex.dart diff --git a/lib/screens/nollning/nolleguide-24/stodfunktioner.dart b/lib/screens/nollning/nolleguide_24/stodfunktioner.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/stodfunktioner.dart rename to lib/screens/nollning/nolleguide_24/stodfunktioner.dart diff --git a/lib/screens/nollning/nolleguide-24/studentvett.dart b/lib/screens/nollning/nolleguide_24/studentvett.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/studentvett.dart rename to lib/screens/nollning/nolleguide_24/studentvett.dart diff --git a/lib/screens/nollning/nolleguide-24/wordlist.dart b/lib/screens/nollning/nolleguide_24/wordlist.dart similarity index 100% rename from lib/screens/nollning/nolleguide-24/wordlist.dart rename to lib/screens/nollning/nolleguide_24/wordlist.dart diff --git a/lib/screens/nollning/nolleguide25/fsek.dart b/lib/screens/nollning/nolleguide_25/fsek.dart similarity index 100% rename from lib/screens/nollning/nolleguide25/fsek.dart rename to lib/screens/nollning/nolleguide_25/fsek.dart diff --git a/lib/screens/nollning/nolleguide25/karen.dart b/lib/screens/nollning/nolleguide_25/karen.dart similarity index 100% rename from lib/screens/nollning/nolleguide25/karen.dart rename to lib/screens/nollning/nolleguide_25/karen.dart diff --git a/lib/screens/nollning/nolleguide25/kladguide.dart b/lib/screens/nollning/nolleguide_25/kladguide.dart similarity index 100% rename from lib/screens/nollning/nolleguide25/kladguide.dart rename to lib/screens/nollning/nolleguide_25/kladguide.dart diff --git a/lib/screens/nollning/nolleguide25/lund.dart b/lib/screens/nollning/nolleguide_25/lund.dart similarity index 100% rename from lib/screens/nollning/nolleguide25/lund.dart rename to lib/screens/nollning/nolleguide_25/lund.dart diff --git a/lib/screens/nollning/nolleguide25/nolleguide_home.dart b/lib/screens/nollning/nolleguide_25/nolleguide_home.dart similarity index 97% rename from lib/screens/nollning/nolleguide25/nolleguide_home.dart rename to lib/screens/nollning/nolleguide_25/nolleguide_home.dart index 14d0f394..e1e97d2a 100644 --- a/lib/screens/nollning/nolleguide25/nolleguide_home.dart +++ b/lib/screens/nollning/nolleguide_25/nolleguide_home.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/kladguide.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/stod.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/studentlivet_home.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/vettoetikett.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/wordlist.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/kladguide.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/stod.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/studentlivet_home.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/vettoetikett.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/wordlist.dart'; class NolleGuideHomePage extends StatefulWidget { @override diff --git a/lib/screens/nollning/nolleguide25/stod.dart b/lib/screens/nollning/nolleguide_25/stod.dart similarity index 100% rename from lib/screens/nollning/nolleguide25/stod.dart rename to lib/screens/nollning/nolleguide_25/stod.dart diff --git a/lib/screens/nollning/nolleguide25/studentlivet_home.dart b/lib/screens/nollning/nolleguide_25/studentlivet_home.dart similarity index 97% rename from lib/screens/nollning/nolleguide25/studentlivet_home.dart rename to lib/screens/nollning/nolleguide_25/studentlivet_home.dart index 7136a4aa..dfc53411 100644 --- a/lib/screens/nollning/nolleguide25/studentlivet_home.dart +++ b/lib/screens/nollning/nolleguide_25/studentlivet_home.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/fsek.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/karen.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/lund.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/fsek.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/karen.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_25/lund.dart'; class StudentlivetHome extends StatefulWidget { @override diff --git a/lib/screens/nollning/nolleguide25/vettoetikett.dart b/lib/screens/nollning/nolleguide_25/vettoetikett.dart similarity index 100% rename from lib/screens/nollning/nolleguide25/vettoetikett.dart rename to lib/screens/nollning/nolleguide_25/vettoetikett.dart diff --git a/lib/screens/nollning/nolleguide25/wordlist.dart b/lib/screens/nollning/nolleguide_25/wordlist.dart similarity index 100% rename from lib/screens/nollning/nolleguide25/wordlist.dart rename to lib/screens/nollning/nolleguide_25/wordlist.dart diff --git a/lib/screens/nollning/nolleguide_26/dressCode.dart b/lib/screens/nollning/nolleguide_26/dressCode.dart new file mode 100644 index 00000000..a3c48f5a --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/dressCode.dart @@ -0,0 +1,94 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoContent.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoScreen.dart'; + +class DressCodePage extends StatefulWidget { + @override + _DressCodePageState createState() => _DressCodePageState(); +} + +class _DressCodePageState extends State { + static const path = "assets/data/nollning_26/nolleguide/dresscode"; + String? jsonString; + + @override + void initState() { + super.initState(); + _loadJson(); + } + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data_klad.json"); + setState(() { + this.jsonString = jsonString; + }); +} + + @override + Widget build(BuildContext context) { + if(this.jsonString == null) { + return Center( + child: CircularProgressIndicator(), + ); + } + final Map data = jsonDecode(jsonString!); + final t = AppLocalizations.of(context)!.localeName; + String imagePath(String image) => "$path/$image.png"; + + final sections = data["sections"]; + + return InfoScreen(blocks: [ + ContentBlock.title(data["title"][t]), + + ContentBlock.text(data["content"][t]), + + ContentBlock.title(sections[0]["title"][t]), + + ContentBlock.subheading(sections[0]["subsections"][0]["title"][t]), //Frack + ContentBlock.clickableText(sections[0]["subsections"][0]["content"][t]), + ContentBlock.image(imagePath(sections[0]["subsections"][0]["image"])), + + ContentBlock.subheading(sections[0]["subsections"][1]["title"][t]), // Full dress + ContentBlock.text(sections[0]["subsections"][1]["content"][t]), + + ContentBlock.subheading(sections[0]["subsections"][2]["title"][t]), // Accessories + ContentBlock.text(sections[0]["subsections"][2]["content"][t]), + + ContentBlock.title(sections[1]["title"][t]), //Formal + ContentBlock.subheading(sections[1]["subsections"][0]["title"][t]), + ContentBlock.text(sections[1]["subsections"][0]["content"][t]), + ContentBlock.subheading(sections[1]["subsections"][1]["title"][t]), + ContentBlock.text(sections[1]["subsections"][1]["content"][t]), + ContentBlock.image(imagePath(sections[1]["image"])), + + ContentBlock.title(sections[2]["title"][t]), // Smart Casual + ContentBlock.text(sections[2]["content"][t]), + ContentBlock.image(imagePath(sections[2]["image"])), + + ContentBlock.title(sections[3]["title"][t]), // Ovve + ContentBlock.text(sections[3]["content"][t]), + ContentBlock.image(imagePath(sections[3]["image"])), + + ContentBlock.title(sections[4]["title"][t]), // Ovve+Theme + ContentBlock.text(sections[4]["content"][t]), + + ContentBlock.title(sections[5]["title"][t]), // Technologist cap + ContentBlock.text(sections[5]["content"][t]), + ContentBlock.image(imagePath(sections[5]["image"])), + + ContentBlock.title(sections[6]["title"][t]), // Tassel + ContentBlock.text(sections[6]["content"][t]), + + ContentBlock.title(sections[7]["title"][t]), // Medal + ContentBlock.text(sections[7]["content"][t]), + ContentBlock.image(imagePath(sections[7]["image"])), + + ContentBlock.title(sections[8]["title"][t]), + ContentBlock.text(sections[8]["content"][t]) + ]); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/etiquette.dart b/lib/screens/nollning/nolleguide_26/etiquette.dart new file mode 100644 index 00000000..90636ef7 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/etiquette.dart @@ -0,0 +1,57 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoContent.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoScreen.dart'; + +class EtiquettePage extends StatefulWidget{ + @override + _EtiquettePageState createState() => _EtiquettePageState(); +} + +class _EtiquettePageState extends State { + static const path = "assets/data/nollning_26/nolleguide"; + String? jsonString; + + @override + void initState() { + super.initState(); + _loadJson(); + } + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data_etiquette.json"); + setState(() { + this.jsonString = jsonString; + }); + } + + @override + Widget build(BuildContext context) { + if(this.jsonString == null) { + return Center(child: const CircularProgressIndicator()); + } + + final t = AppLocalizations.of(context)!; + final List data = jsonDecode(jsonString!); + + return InfoScreen(blocks: [ + ContentBlock.title(t.nolleguideEtiquette), + for(final item in data) ..._generateContent(item, t.localeName) + ]); + } + + List _generateContent(dynamic item, String locale) { + final result = []; + result.add(ContentBlock.subheading(item["title"][locale])); + final content = item["content"][locale]; + for(final subItem in content) { + if(subItem["heading"] != "") result.add(ContentBlock.subheading(subItem["heading"])); + result.add(ContentBlock.text(subItem["paragraph"])); + } + + return result; + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/faculty.dart b/lib/screens/nollning/nolleguide_26/faculty.dart new file mode 100644 index 00000000..6fe448fb --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/faculty.dart @@ -0,0 +1,99 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/portraitSpacing.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/overlay.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/portraitBuilder.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/wallFactory.dart'; + +class FacultyPage extends StatefulWidget { + @override + _FacultyPageState createState() => _FacultyPageState(); +} + +class _FacultyPageState extends State { + static const path = "assets/data/nollning_26/nolleguide/studentlife/faculty"; + + String? jsonString; + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data_faculty.json"); + setState(() { + this.jsonString = jsonString; + }); + } + + @override + void initState(){ + super.initState(); + _loadJson(); + } + + @override + Widget build(BuildContext context) { + var t = AppLocalizations.of(context)!; + + if(this.jsonString == null){ + return Center( + child: CircularProgressIndicator(), + ); + } + + final double screenHeight = MediaQuery.of(context).size.height; + final Map data = jsonDecode(this.jsonString!); + + return Scaffold( + extendBodyBehindAppBar: true, + backgroundColor: new Color.fromRGBO(41, 171, 226, 1), + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + ), + body: InteractiveViewer(panEnabled: true, + child: WallFactory.generateWall( + children: generateWallContent(locale: t.localeName, data: data), + screenHeight: screenHeight)) + ); + } + + List generateWallContent({ + required String locale, + required Map data + }) { + final String title = "$path/title_${locale}.png"; + final String president = "$path/president_${locale}.png"; + final String general = "$path/general_${locale}.png"; + final String officers = "$path/officers_${locale}.png"; + final String nollu = "$path/nollu.png"; + + void pushNavigator({required int index, required String imagePath}) => + Navigator.push(context, TextOverlayRoute( + portrait: imagePath, + text: data["people"][index]["text"][locale])); + + return [ + Image.asset(title), + PortraitRow(portraits: [ + PortraitData(imagePath: president, flex: 5, + onTap: () => pushNavigator(index: 0, imagePath: president)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: officers, flex: 2, + onTap: () => pushNavigator(index: 1, imagePath: officers)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: general, flex: 5, + onTap: () => pushNavigator(index: 2, imagePath: general)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: nollu, flex: 2, + onTap: () => pushNavigator(index: 3, imagePath: nollu)), + ]), + ].withSpacing(24) + ..add(SizedBox(height: MediaQuery.viewPaddingOf(context).bottom + 24)); + + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/guild.dart b/lib/screens/nollning/nolleguide_26/guild.dart new file mode 100644 index 00000000..487ad46e --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/guild.dart @@ -0,0 +1,278 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/portraitSpacing.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/portraitBuilder.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/wallFactory.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/overlay.dart'; + + +class GuildPage extends StatefulWidget { + @override + _GuildPageState createState() => _GuildPageState(); +} + +class _GuildPageState extends State { + static const path = "assets/data/nollning_26/nolleguide/studentlife/guild"; + bool isTextOverlayVisible = false; + + String? jsonString; + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data_guild.json"); + setState(() { + this.jsonString = jsonString; + }); + } + + @override + void initState(){ + super.initState(); + _loadJson(); + } + + @override + Widget build(BuildContext context) { + var t = AppLocalizations.of(context)!; + + if(this.jsonString == null){ + return Center( + child: CircularProgressIndicator(), + ); + } + + final Map data = jsonDecode(this.jsonString!); + + final double screenHeight = MediaQuery.of(context).size.height; + + return Scaffold( + extendBodyBehindAppBar: true, + backgroundColor: new Color.fromRGBO(41, 171, 226, 1), + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + ), + body: InteractiveViewer(panEnabled: true, + child: WallFactory.generateWall( + children: generateWallContent(locale: t.localeName, data: data), + screenHeight: screenHeight) + ) + ); + } + + List generateWallContent({ + required String locale, + required Map data + }) { + String title(String name, {bool isLocale = true}) { + if(!isLocale) return "$path/title_${name}.png"; + return "$path/title_${name}_$locale.png"; + } + + final String accountingTitle = title("accounting"); + final String boardTitle = title("board"); + final String cafeTitle = title("cafe"); + final String cultureTitle = title("culture"); + final String facilitiesTitle = title("facilities"); + final String crTitle = title("fnu"); + final String fosetTitle = title("foset"); + final String frejaTitle = title("freja", isLocale: false); + final String jubileeTitle = title("jubilee"); + final String libuTitle = title("libu"); + final String organisationTitle = title("organisation", isLocale: false); + final String processionTitle = title("procession"); + final String samvetetTitle = title("samvetet"); + final String serviceTitle = title("service"); + final String sexTitle = title("sex"); + final String studentcouncilTitle = title("studentcouncil"); + final String tavernTitle = title("tavern"); + final String truthTitle = title("truth"); + + String portrait(String name, {bool isLocale = true}) { + if(!isLocale) return "$path/portrait_${name}.png"; + return "$path/portrait_${name}_$locale.png"; + } + + final String boardPortrait = portrait("board"); + final String boardmemberPortrait = portrait("boardmember"); + final String bookPortrait = portrait("book"); + final String bookfosPortrait = portrait("bookfos"); + final String cafePortrait = portrait("cafe"); + final String crPortrait = portrait("cr"); + final String culturePortrait = portrait("culture"); + final String eventfosPortrait = portrait("eventfos"); + final String eduPortrait = portrait("edu"); + final String fadderfosPortrait = portrait("fadderfos"); + final String faradPortrait = portrait("farad"); + final String frejaPortrait = portrait("freja"); + final String heraldPortrait = portrait("herald"); + final String infofosPortrait = portrait("infofos"); + final String jubileePortrait = portrait("jubilee"); + final String libuPortrait = portrait("libu", isLocale: false); + final String overfosPortrait = portrait("overfos"); + final String presidentPortrait = portrait("president"); + final String prylPortrait = portrait("pryl"); + final String reisemeisterPortrait = portrait("reisemeister", isLocale: false); + final String samvetetPortrait = portrait("samvetet"); + final String secretaryPortrait = portrait("secretary"); + final String sexPortrait = portrait("sex"); + final String sigmafosPortrait = portrait("sigmafos"); + final String spiderPortrait = portrait("spider"); + final String sponsfosPortrait = portrait("sponsfos"); + final String sportPortrait = portrait("sport"); + final String tavernPortrait = portrait("tavern"); + final String treasurerPortrait = portrait("treasurer"); + final String truthPortrait = portrait("truth"); + final String vpPortrait = portrait("vp"); + + const largePortraitFlex = 5; + const smallPortraitFlex = 2; + const doublePortraitFlex = 10; + + void pushNavigator({required int index, required String imagePath}) => + Navigator.push(context, TextOverlayRoute( + portrait: imagePath, + text: data["people"][index]["text"][locale])); + + return [ + Image.asset(fosetTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: overfosPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 0, imagePath: overfosPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: bookfosPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 1, imagePath: bookfosPortrait)), + PortraitData(imagePath: infofosPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 2, imagePath: infofosPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: sponsfosPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 3, imagePath: sponsfosPortrait)), + PortraitData(imagePath: fadderfosPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 4, imagePath: fadderfosPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: sigmafosPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 5, imagePath: sigmafosPortrait)), + PortraitData(imagePath: eventfosPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 6, imagePath: eventfosPortrait)), + ]), + Image.asset(organisationTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: presidentPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 7, imagePath: presidentPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: vpPortrait, flex: smallPortraitFlex, + onTap: () => pushNavigator(index: 8, imagePath: vpPortrait)), + ]), + Image.asset(boardTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: boardPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 9, imagePath: boardPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: boardmemberPortrait, flex: smallPortraitFlex, + onTap: () => pushNavigator(index: 10, imagePath: boardmemberPortrait)), + ]), + Image.asset(studentcouncilTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: eduPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 11, imagePath: eduPortrait)), + ]), + Image.asset(sexTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: sexPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 12, imagePath: sexPortrait)), + ]), + Image.asset(tavernTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: tavernPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 13, imagePath: tavernPortrait)), + ]), + Image.asset(jubileeTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: jubileePortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 14, imagePath: jubileePortrait)), + ]), + Image.asset(serviceTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: secretaryPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 15, imagePath: secretaryPortrait)), + ]), + Image.asset(truthTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: truthPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 16, imagePath: truthPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: spiderPortrait, flex: smallPortraitFlex, + onTap: () => pushNavigator(index: 17, imagePath: spiderPortrait)), + ]), + Image.asset(samvetetTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: samvetetPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 18, imagePath: samvetetPortrait)), + ]), + Image.asset(libuTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: libuPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 19, imagePath: libuPortrait)), + ]), + Image.asset(facilitiesTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: prylPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 20, imagePath: prylPortrait)), + ]), + Image.asset(crTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: crPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 21, imagePath: crPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: faradPortrait, flex: smallPortraitFlex, + onTap: () => pushNavigator(index: 22, imagePath: faradPortrait)), + ]), + Image.asset(cultureTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: culturePortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 23, imagePath: culturePortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: reisemeisterPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 24, imagePath: reisemeisterPortrait)), + PortraitData(imagePath: sportPortrait, flex: doublePortraitFlex, + onTap: () => pushNavigator(index: 25, imagePath: sportPortrait)), + ]), + Image.asset(frejaTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: frejaPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 26, imagePath: frejaPortrait)), + ]), + Image.asset(accountingTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: treasurerPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 27, imagePath: treasurerPortrait)), + ]), + PortraitRow(portraits: [ + PortraitData(imagePath: bookPortrait, flex: smallPortraitFlex, + onTap: () => pushNavigator(index: 28, imagePath: bookPortrait)), + ]), + Image.asset(cafeTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: cafePortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 29, imagePath: cafePortrait)), + ]), + Image.asset(processionTitle), + PortraitRow(portraits: [ + PortraitData(imagePath: heraldPortrait, flex: largePortraitFlex, + onTap: () => pushNavigator(index: 30, imagePath: heraldPortrait)), + ]), + ].withSpacing(24) + ..add(SizedBox(height: MediaQuery.viewPaddingOf(context).bottom + 24)); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/infoContent.dart b/lib/screens/nollning/nolleguide_26/infoContent.dart new file mode 100644 index 00000000..e695973f --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/infoContent.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:linkify/linkify.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class ContentBlock { + final Widget Function(BuildContext) build; + const ContentBlock._(this.build); + + factory ContentBlock.title(String text) => ContentBlock._( + (context) => Center(child: + Text( + text, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 30, + fontFamily: "Consolas", + fontWeight: FontWeight.bold, + color: Colors.green, + ), + ),) + ); + + factory ContentBlock.subheading(String text) => ContentBlock._( + (context) => Center(child: + Text( + text, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 20, + fontFamily: "Consolas", + fontWeight: FontWeight.w600, + color: Colors.green + ), + ),) + ); + + factory ContentBlock.uncenteredSubheading(String text) => ContentBlock._( + (context) => Text( + text, + style: const TextStyle( + fontSize: 20, + fontFamily: "Consolas", + fontWeight: FontWeight.w600, + color: Colors.green + ), + ), + ); + + factory ContentBlock.text(String text) => ContentBlock._( + (context) => Text( + text, + style: const TextStyle( + fontSize: 14, + fontFamily: "Consolas", + color: Colors.green + ), + ) + ); + + factory ContentBlock.clickableText(String text) => ContentBlock._( + (context) => Linkify( + text: text, + linkifiers: [UrlLinkifier(), PhoneNumberLinkifier(), EmailLinkifier()], + onOpen: (link) async { + if(link is EmailElement) { + _launchMail(link.url); + } else if (link is PhoneNumberElement) { + _launchPhone(link.url); + } else if (link is UrlElement) { + _launchUrl(link.url); + } + }, + style: const TextStyle( + fontSize: 14, + fontFamily: "Consolas", + color: Colors.green + ), + linkStyle: const TextStyle( + color: Colors.blue, + fontFamily: "Consolas", + fontSize: 14, + decoration: TextDecoration.underline, + decorationColor: Colors.blue), + ) + ); + + factory ContentBlock.image(String path) => ContentBlock._( + (context) => ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.asset( + path, + fit: BoxFit.cover, + width: double.infinity, + ), + ) + ); + + factory ContentBlock.spacer({double height = 16}) => ContentBlock._( + (context) => SizedBox(height: height) + ); + + static Future _launchMail(String mail) async { + final Uri launchUri = Uri( + scheme: 'mailto', + path: mail + ); + await launchUrl(launchUri); + } + + static Future _launchPhone(String number) async { + final sanitizedNbr = number.replaceAll(RegExp(r'[^\d+]'), ''); + final Uri launchUri = Uri( + scheme: 'tel', + path: sanitizedNbr + ); + await launchUrl(launchUri); + } + + static Future _launchUrl(String url) async { + await launchUrl(Uri.parse(url)); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/infoScreen.dart b/lib/screens/nollning/nolleguide_26/infoScreen.dart new file mode 100644 index 00000000..65594684 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/infoScreen.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoContent.dart'; + +class InfoScreen extends StatelessWidget { + static const backgroundPath = "assets/data/nollning_26/nolleguide/infobg.png"; + + final List blocks; + final double boxWidthFrac; + final double boxHeightFrac; + + const InfoScreen({ + super.key, + required this.blocks, + this.boxWidthFrac = 0.7, + this.boxHeightFrac = 0.55 +}); + + @override + Widget build(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; + final screenHeight = MediaQuery.of(context).size.height; + + final boxWidth = screenWidth * this.boxWidthFrac; + final boxHeight = screenHeight * this.boxHeightFrac; + return Scaffold( + extendBodyBehindAppBar: true, + backgroundColor: new Color.fromRGBO(255, 255, 255, 1), + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + ), + body: Stack( + children: [ + Positioned.fill( + child: Transform.scale(scale: 1.2, child:Image.asset(backgroundPath, fit: BoxFit.cover)) + ), + + SafeArea( + child: Align( + alignment: const Alignment(0.0, -0.3), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: boxWidth, + height: boxHeight, + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: Container( + //color: Colors.white, + child: ListView.builder( + padding: const EdgeInsets.all(16), + itemCount: blocks.length, + itemBuilder: (context, index){ + return Padding( + padding: const EdgeInsets.only(bottom: 20), + child: blocks[index].build(context), + ); + }, + ), + ), + ), + ) + ], + ) + ) + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/lund.dart b/lib/screens/nollning/nolleguide_26/lund.dart new file mode 100644 index 00000000..8dd256ad --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/lund.dart @@ -0,0 +1,61 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoContent.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoScreen.dart'; + +class LundPage extends StatefulWidget { + @override + _LundPageState createState() => _LundPageState(); +} + +class _LundPageState extends State { + static const path = "assets/data/nollning_26/nolleguide/studentlife/lund"; + static const spex1 = "$path/spexbild1.jpg"; + static const spex2 = "$path/spexbild2.jpg"; + + String? jsonString; + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data_lund.json"); + setState(() { + this.jsonString = jsonString; + }); + } + + @override + void initState() { + super.initState(); + _loadJson(); + } + + @override + Widget build(BuildContext context) { + final locale = AppLocalizations.of(context)!.localeName; + + if(this.jsonString == null) { + return Center( + child: CircularProgressIndicator(), + ); + } + + final Map data = jsonDecode(this.jsonString!); + + return InfoScreen(blocks: [ + ContentBlock.title("Lund"), + ContentBlock.subheading(data["spex"]["title"][locale]), + ContentBlock.text(data["spex"]["text"][locale]), + ContentBlock.image(spex1), + ContentBlock.image(spex2), + ContentBlock.spacer(), + ContentBlock.subheading(data["sektion"]["title"][locale]), + ContentBlock.text(data["sektion"]["text"][locale]), + ContentBlock.spacer(), + ContentBlock.subheading(data["nation"]["title"][locale]), + ContentBlock.clickableText(data["nation"]["text"][locale]) + ] + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/nolleguide_home.dart b/lib/screens/nollning/nolleguide_26/nolleguide_home.dart new file mode 100644 index 00000000..5a65df58 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/nolleguide_home.dart @@ -0,0 +1,280 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/etiquette.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/poweredBy.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/sandwich.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/wordList.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/dressCode.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/lund.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/faculty.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/guild.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/stod.dart'; + +class NolleGuideHomePage extends StatefulWidget { + @override + _NolleGuideHomeState createState() => _NolleGuideHomeState(); +} + +enum HomePageState {home, studentLife} + +class _NolleGuideHomeState extends State { + HomePageState currentState = HomePageState.home; + + static const String path = "assets/data/nollning_26/nolleguide"; + + Widget generateItem({ + required double screenWidth, + required double top, + required double left, + required String asset, + required double width, + VoidCallback? onTap, + double? rotation +}) { + return Positioned( + top: top, + left: left, + child: Center( + child: Transform.rotate(angle: rotation ?? 0, child: InkWell( + onTap: onTap, + child: Image.asset(asset, width: screenWidth * width), + ), + ) + ) + ); + } + + List generateHomePage({ + required double screenWidth, + required double screenHeight, + required bool isSwedish, + required String titleAsset, + required String studentlivetAsset, + required String stodAsset, + required String kladkodAsset, + required String ordlistaAsset, + required String etiquetteAsset, + required String poweredByAsset, + required String sandwichAsset +}){ + return [ + Positioned( + top: screenHeight * 0.15, + left: isSwedish ? screenWidth * 0.05 : screenWidth * 0.015, + child: Center( + child: Image.asset( + titleAsset, + width: isSwedish ? screenWidth * 0.9 : screenWidth, + ), + ), + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.23, + left: screenWidth * -0.08, + asset: studentlivetAsset, + width: 0.9, + onTap: () => setState(() { + this.currentState = HomePageState.studentLife; + }) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.3, + left: isSwedish ? screenWidth * 0.31 : screenWidth * 0.26, + asset: stodAsset, + width: 0.9, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => StodPage())) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.37, + left: isSwedish ? screenWidth * -0.14 : screenWidth * -0.13, + asset: kladkodAsset, + width: 0.9, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => DressCodePage())) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.44, + left: isSwedish ? screenWidth * 0.25 : screenWidth * 0.22, + asset: ordlistaAsset, + width: 0.9, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => WordListPage())) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.51, + left: isSwedish ? screenWidth * -0.09 : screenWidth * -0.13, + asset: etiquetteAsset, + width: 0.9, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => EtiquettePage())) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.59, + left: screenWidth * 0.46, + asset: poweredByAsset, + width: 0.4, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => PoweredByPage())) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.6, + left: screenWidth * 0.1, + asset: sandwichAsset, + width: 0.3, + rotation: pi / 8, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => SandwichPage())) + ) + ]; + } + + List generateStudentLifePage({ + required double screenWidth, + required double screenHeight, + required bool isSwedish, + required String titleAsset, + required String backAsset, + required String karenAsset, + required String sektionenAsset, + required String lundAsset +}) { + return [ + Positioned( + top: screenHeight * 0.15, + left: isSwedish ? screenWidth * 0.08 : screenWidth * 0.1, + child: Center( + child: Image.asset( + titleAsset, + width: screenWidth * 0.9, + ), + ), + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.23, + left: 0, + asset: sektionenAsset, + width: 0.75, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => GuildPage())) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.36, + left: isSwedish ? screenWidth * 0.23 : screenWidth * 0.35, + asset: karenAsset, + width: isSwedish ? 0.75 : 0.6, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => FacultyPage())) + ), + generateItem( + screenWidth: screenWidth, + top: isSwedish ? screenHeight * 0.49 : screenHeight * 0.47, + left: isSwedish ? screenWidth * 0.05 : screenWidth * 0.04, + asset: lundAsset, + width: 0.75, + onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) => LundPage())) + ), + generateItem( + screenWidth: screenWidth, + top: screenHeight * 0.6, + left: isSwedish ? screenWidth * 0.5 : screenWidth * 0.6, + asset: backAsset, + width: isSwedish ? 0.4 : 0.3, + onTap: () => setState(() { + this.currentState = HomePageState.home; + }) + ) + ]; +} + + static const Color backButtonColor = Color.fromRGBO(222, 43, 131, 1.0); + static const double zoomX = 2.2; // We need to do this terribleness to make the arcade machine + static const double zoomY = 3; // fit the screen... + + Widget build(BuildContext context) { + final t = AppLocalizations.of(context)!; + final isSwedish = t.localeName == "sv";; + + final screenWidth = MediaQuery.of(context).size.width; + final screenHeight = MediaQuery.of(context).size.height; + final background = "${path}/background.png"; + + // Home page + final homePageTitle = "${path}/homescreen/title_${t.localeName}.png"; + final studentlivet = "${path}/homescreen/studentlivet_${t.localeName}.png"; + final stod = "${path}/homescreen/stod_${t.localeName}.png"; + final kladkod = "${path}/homescreen/kladkod_${t.localeName}.png"; + final ordlista = "${path}/homescreen/ordlista_${t.localeName}.png"; + final etiquette = "${path}/homescreen/etiquette_${t.localeName}.png"; + final poweredBy = "${path}/homescreen/powered_by.png"; + final sandwich = "${path}/homescreen/sandwich_${t.localeName}.png"; + + // Student life page + final studentLifeTitle = "${path}/studentlife/title_${t.localeName}.png"; + final sektionen = "${path}/studentlife/sektionen_${t.localeName}.png"; + final karen = "${path}/studentlife/karen_${t.localeName}.png"; + final lund = "${path}/studentlife/lund.png"; + final back = "${path}/studentlife/back_${t.localeName}.png"; + + return Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + iconTheme: const IconThemeData(color: backButtonColor), + ), + body: InteractiveViewer( + panEnabled: true, + child: FittedBox( + fit: BoxFit.cover, // scales the whole fixed canvas to fill the real screen + child: SizedBox( + width: screenWidth, + height: screenHeight, + child: Stack( + fit: StackFit.expand, + clipBehavior: Clip.hardEdge, + children: [ + Transform.translate( + offset: Offset(screenWidth * 0.02, screenHeight * 0.18), + child: Transform.scale( + scaleX: zoomX, + scaleY: zoomY, + child: Image.asset(background, fit: BoxFit.cover), + ), + ), + ...switch(currentState){ + HomePageState.home => generateHomePage( + screenWidth: screenWidth, + screenHeight: screenHeight, + isSwedish: isSwedish, + titleAsset: homePageTitle, + studentlivetAsset: studentlivet, + stodAsset: stod, + kladkodAsset: kladkod, + ordlistaAsset: ordlista, + etiquetteAsset: etiquette, + poweredByAsset: poweredBy, + sandwichAsset: sandwich + ), + HomePageState.studentLife => generateStudentLifePage( + screenWidth: screenWidth, + screenHeight: screenHeight, + isSwedish: isSwedish, + titleAsset: studentLifeTitle, + backAsset: back, + karenAsset: karen, + sektionenAsset: sektionen, + lundAsset: lund), + }, + ], + ), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/overlay.dart b/lib/screens/nollning/nolleguide_26/overlay.dart new file mode 100644 index 00000000..4615c731 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/overlay.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +class TextOverlayRoute extends PageRouteBuilder { + TextOverlayRoute({ + required this.portrait, + required this.text, + }) : super( + opaque: false, + barrierDismissible: true, + barrierColor: Colors.black.withValues(alpha: 0.45), + transitionDuration: const Duration(milliseconds: 250), + pageBuilder: (context, animation, secondaryAnimation) => + _OverlayContent(portrait: portrait, text: text), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + return FadeTransition(opacity: animation, child: child); + }, + ); + + final String portrait; + final String text; +} + +class _OverlayContent extends StatelessWidget { + const _OverlayContent({ + required this.portrait, + required this.text, + }); + + final String portrait; + final String text; + + static const backgroundPath = + "assets/data/nollning_26/nolleguide/studentlife/building_blocks/textbox.png"; + + @override + Widget build(BuildContext context) { + final double screenWidth = MediaQuery.of(context).size.width; + final double screenHeight = MediaQuery.of(context).size.height; + final cardWidth = screenWidth * 0.8; + final heroHeight = screenHeight * 0.25; + final textBoxHeight = screenHeight * 0.62; + + return Material( + type: MaterialType.transparency, + child: Center( + child: SizedBox( + width: cardWidth, + height: heroHeight + textBoxHeight, + child: InteractiveViewer( + panEnabled: true, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset( + this.portrait, + width: cardWidth, + height: heroHeight, + ), + ClipRRect( + borderRadius: BorderRadius.circular(16), + child: SizedBox( + width: cardWidth, + height: textBoxHeight, + child: LayoutBuilder( + builder: (context, constraints) { + final textFontSize = constraints.maxWidth * 0.04; + + return Stack( + fit: StackFit.expand, + children: [ + Image.asset( + backgroundPath, + fit: BoxFit.cover, + ), + + Positioned( + left: constraints.maxWidth * 0.05, + right: constraints.maxWidth * 0.05, + top: constraints.maxHeight * 0.05, + bottom: constraints.maxHeight * 0.05, + child: SingleChildScrollView( + child: Text( + this.text, + style: TextStyle( + color: Colors.black, + fontSize: textFontSize, + ), + ), + ), + ), + ], + ); + }, + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/portraitBuilder.dart b/lib/screens/nollning/nolleguide_26/portraitBuilder.dart new file mode 100644 index 00000000..7863984a --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/portraitBuilder.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; + +class PortraitData { + final String imagePath; + final int flex; + final VoidCallback? onTap; + + const PortraitData({ + required this.imagePath, + this.flex = 1, + this.onTap + }); +} + +class PortraitRow extends StatelessWidget { + final List portraits; + final int sideFlex; + final int gapFlex; + + const PortraitRow({ + super.key, + required this.portraits, + this.sideFlex = 1, + this.gapFlex = 1, + }); + + @override + Widget build(BuildContext context) { + final children = [ + Expanded(flex: sideFlex, child: const SizedBox()), + ]; + + for (var i = 0; i < portraits.length; i++) { + final p = portraits[i]; + children.add( + Expanded( + flex: p.flex, + child: InkWell( + onTap: p.onTap, + child: Image.asset( + p.imagePath, + fit: BoxFit.fitWidth, + errorBuilder: (context, error, stackTrace) => const Icon(Icons.broken_image), + ), + ), + ), + ); + if (i != portraits.length - 1) { + children.add(Expanded(flex: gapFlex, child: const SizedBox())); + } + } + children.add(Expanded(flex: sideFlex, child: const SizedBox())); + + return Row(children: children); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/portraitSpacing.dart b/lib/screens/nollning/nolleguide_26/portraitSpacing.dart new file mode 100644 index 00000000..1d60d8f1 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/portraitSpacing.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +extension PortraitSpacing on List { + List withSpacing(double space) { + final result = []; + for (var i = 0; i < length; i++) { + result.add(this[i]); + if (i != length - 1) { + result.add(SizedBox(height: space)); + } + } + return result; + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/poweredBy.dart b/lib/screens/nollning/nolleguide_26/poweredBy.dart new file mode 100644 index 00000000..7d231d32 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/poweredBy.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class PoweredByPage extends StatefulWidget { + @override + _PoweredByPageState createState() => _PoweredByPageState(); +} + +class _PoweredByPageState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + final image = "assets/data/nollning_26/nolleguide/poweredby.png"; + return Scaffold( + extendBodyBehindAppBar: true, + backgroundColor: Color.fromRGBO(9, 72, 123, 1), + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + ), + body: InteractiveViewer( + panEnabled: true, + child: SingleChildScrollView(child: Image.asset( + image, + cacheHeight: 2000, + width: MediaQuery.of(context).size.width, + fit: BoxFit.fitWidth, + )) + ) + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/sandwich.dart b/lib/screens/nollning/nolleguide_26/sandwich.dart new file mode 100644 index 00000000..1089e66c --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/sandwich.dart @@ -0,0 +1,206 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; + +class SandwichPage extends StatefulWidget { + @override + _SandwichPageState createState() => _SandwichPageState(); +} + +class _SandwichPageState extends State { + static const path = "assets/data/nollning_26/nolleguide/sandwich"; + + String? jsonString; + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data.json"); + setState(() { + this.jsonString = jsonString; + }); + } + + @override + void initState() { + super.initState(); + _loadJson(); + } + + @override + Widget build(BuildContext context) { + final t = AppLocalizations.of(context)!.localeName; + if (jsonString == null) { + return Center(child: CircularProgressIndicator()); + } + + final List data = jsonDecode(jsonString!); + + final topBackground = "$path/bg_top_$t.png"; + final endBackground = "$path/bg_end.png"; + final middleBackground = "$path/bg.png"; + // Find screen width in pixels for caching the image + final cacheWidth = + (MediaQuery.of(context).size.width * + MediaQuery.of(context).devicePixelRatio) + .round(); + return Scaffold( + extendBodyBehindAppBar: true, + backgroundColor: new Color.fromRGBO(236, 112, 38, 1), + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + ), + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox(height: 40), + Image.asset(topBackground, fit: BoxFit.fitWidth), + for (final item in data) + Stack( + children: [ + Image.asset(middleBackground, fit: BoxFit.fitWidth), + Align( + alignment: Alignment.center, + child: InkWell( + child: Image.asset( + "$path/${item["asset"]}_$t.png", + cacheWidth: cacheWidth, + fit: BoxFit.fitWidth, + alignment: Alignment.center, + ), + onTap: () { + Navigator.push( + context, + SandwichOverlayRoute(data: item, locale: t), + ); + }, + ), + ), + ], + ), + Image.asset(endBackground, fit: BoxFit.fitWidth), + ], + ), + ) + ); + } +} + +class SandwichOverlayRoute extends PageRouteBuilder { + SandwichOverlayRoute({required this.data, required this.locale}) + : super( + opaque: false, + barrierDismissible: true, + barrierColor: Colors.black.withValues(alpha: 0.45), + transitionDuration: const Duration(milliseconds: 250), + pageBuilder: (context, animation, secondaryAnimation) => + _SandwichOverlayContent(data: data, locale: locale), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + return FadeTransition(opacity: animation, child: child); + }, + ); + + final dynamic data; + final String locale; +} + +class _SandwichOverlayContent extends StatelessWidget { + const _SandwichOverlayContent({required this.data, required this.locale}); + + final dynamic data; + final String locale; + + static const path = "assets/data/nollning_26/nolleguide/sandwich"; + static const backgroundPath = "$path/bg_sandwich.png"; + + @override + Widget build(BuildContext context) { + final double screenWidth = MediaQuery.of(context).size.width; + final double screenHeight = MediaQuery.of(context).size.height; + final cardWidth = screenWidth; + final textBoxHeight = screenHeight * 0.62; + + return Material( + type: MaterialType.transparency, + child: Center( + child: SizedBox( + width: cardWidth, + height: textBoxHeight, + child: InteractiveViewer( + panEnabled: true, + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: SizedBox( + width: cardWidth, + height: textBoxHeight, + child: LayoutBuilder( + builder: (context, constraints) { + final textFontSize = constraints.maxWidth * 0.03; + final titleFontSize = constraints.maxWidth * 0.05; + final priceFontSize = constraints.maxWidth * 0.04; + + return Stack( + fit: StackFit.expand, + children: [ + Image.asset( + backgroundPath, + width: constraints.maxWidth, + ), + + Positioned( + left: constraints.maxWidth * 0.2, + right: constraints.maxWidth * 0.2, + top: constraints.maxHeight * 0.4, + bottom: constraints.maxHeight * 0.2, + child: SingleChildScrollView( + child: Column( + children: [ + Text( + this.data["title"][locale], + style: TextStyle( + color: Colors.black, + fontSize: titleFontSize, + fontWeight: FontWeight.bold, + fontFamily: "Consolas", + ), + ), + Text( + this.data["price"], + style: TextStyle( + color: Colors.black, + fontSize: priceFontSize, + fontWeight: FontWeight.bold, + fontFamily: "Consolas", + ), + ), + Text( + this.data["description"][locale], + style: TextStyle( + color: Colors.black, + fontSize: textFontSize, + fontFamily: "Consolas", + ), + ), + if (this.data["additional"] != "") + Image.asset( + "$path/${this.data["additional"]}", + ), + ], + ), + ), + ), + ], + ); + }, + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/screens/nollning/nolleguide_26/stod.dart b/lib/screens/nollning/nolleguide_26/stod.dart new file mode 100644 index 00000000..877b05eb --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/stod.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoContent.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoScreen.dart'; + +class StodPage extends StatefulWidget { + @override + _StodPageState createState() => _StodPageState(); +} + +class _StodPageState extends State { + static const path = "assets/data/nollning_26/nolleguide"; + static const stud_karin = "$path/stud_karin.jpg"; + static const stud_freja = "$path/stud_freja.jpeg"; + static const stud_petra = "$path/stud_petra.png"; + + String? jsonString; + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data_stod.json"); + setState(() { + this.jsonString = jsonString; + }); + } + + @override + void initState() { + super.initState(); + _loadJson(); + } + + @override + Widget build(BuildContext context) { + final t = AppLocalizations.of(context)!.localeName; + if (jsonString == null) { + return Center( + child: CircularProgressIndicator(), + ); + } + + final List data = jsonDecode(jsonString!); + + return InfoScreen(blocks: [ + for(final item in data) ..._buildItemWidgets(item, t) + ]); + } + + static List _buildItemWidgets(dynamic item, String locale) { + final result = []; + if(item["type"] == "title") { + result.add(ContentBlock.title(item["title"][locale])); + }else if(item["type"] == "subheading"){ + result.add(ContentBlock.subheading(item["title"][locale])); + }else if(item["type"] == "stud") { + // I am sorry for this, but I cannot be arsed to code a proper parser for image embed in json + result.add(ContentBlock.subheading(item["title"][locale])); + result.add(ContentBlock.clickableText(item["texts"][locale][0])); + result.add(ContentBlock.image(stud_petra)); + result.add(ContentBlock.clickableText(item["texts"][locale][1])); + result.add(ContentBlock.image(stud_freja)); + result.add(ContentBlock.clickableText(item["texts"][locale][2])); + result.add(ContentBlock.image(stud_karin)); + return result; + } + + if(item["text"] != ""){ + result.add(ContentBlock.clickableText(item["text"][locale])); + } + return result; + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/wallFactory.dart b/lib/screens/nollning/nolleguide_26/wallFactory.dart new file mode 100644 index 00000000..cb4fd8a2 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/wallFactory.dart @@ -0,0 +1,102 @@ +import 'package:flutter/cupertino.dart'; + +class WallFactory { + static const path = "assets/data/nollning_26/nolleguide/studentlife/building_blocks"; + + static const wallEdge = "$path/wall_edge.png"; + static const wallBackground = "$path/wall_background.png"; + static const background = "$path/background.png"; + static const edgeWidth = 40.0; // Magic number is the width of the pillars. + + static Widget generateWall({ + required List children, + required double screenHeight + }){ + return SingleChildScrollView( + child: Stack( + children: [ + Positioned.fill( + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(background), + repeat: ImageRepeat.repeat, + ), + ), + ), + ), + + ConstrainedBox(constraints: BoxConstraints(minHeight: screenHeight), + child: IntrinsicHeight( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Expanded(flex: 1, child: SizedBox()), + Expanded( + flex: 3, + child: Stack( + children: [ + Positioned.fill( + child: IntrinsicHeight( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox( + width: edgeWidth, + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage(wallEdge), + repeat: ImageRepeat.repeatY, + ), + ), + ), + ), + Expanded( + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage(wallBackground), + repeat: ImageRepeat.repeat, + ), + ), + ), + ), + SizedBox( + width: edgeWidth, + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage(wallEdge), + repeat: ImageRepeat.repeatY, + ), + ), + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.only( + top: 100, + left: edgeWidth, + right: edgeWidth, + ), + child: Column( + children: children + ), + ), + ], + ), + ), + const Expanded(flex: 1, child: SizedBox()), + ], + ), + ), + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/nolleguide_26/wordList.dart b/lib/screens/nollning/nolleguide_26/wordList.dart new file mode 100644 index 00000000..0609cd22 --- /dev/null +++ b/lib/screens/nollning/nolleguide_26/wordList.dart @@ -0,0 +1,48 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoContent.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/infoScreen.dart'; + +class WordListPage extends StatefulWidget{ + @override + _WordListState createState() => _WordListState(); +} + +class _WordListState extends State { + static const path = "assets/data/nollning_26/nolleguide"; + String? jsonString; + @override + void initState() { + super.initState(); + _loadJson(); + } + + Future _loadJson() async { + final jsonString = await rootBundle.loadString("$path/data_wordlist.json"); + setState(() { + this.jsonString = jsonString; + }); + } + + @override + Widget build(BuildContext context) { + if(this.jsonString == null){ + return Center( + child: CircularProgressIndicator(), + ); + } + + final t = AppLocalizations.of(context)!; + final List data = jsonDecode(this.jsonString!); + return InfoScreen(blocks: [ + ContentBlock.title(t.nolleguideWordlist), + for(final item in data) ...[ + ContentBlock.uncenteredSubheading(item["key"][t.localeName]), + ContentBlock.text(item["value"][t.localeName]) + ] + ]); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/questscreen/finishedMissions.dart b/lib/screens/nollning/questscreen_24/finishedMissions.dart similarity index 100% rename from lib/screens/nollning/questscreen/finishedMissions.dart rename to lib/screens/nollning/questscreen_24/finishedMissions.dart diff --git a/lib/screens/nollning/questscreen/goodbyePaperPage.dart b/lib/screens/nollning/questscreen_24/goodbyePaperPage.dart similarity index 100% rename from lib/screens/nollning/questscreen/goodbyePaperPage.dart rename to lib/screens/nollning/questscreen_24/goodbyePaperPage.dart diff --git a/lib/screens/nollning/questscreen/paperWidget.dart b/lib/screens/nollning/questscreen_24/paperWidget.dart similarity index 97% rename from lib/screens/nollning/questscreen/paperWidget.dart rename to lib/screens/nollning/questscreen_24/paperWidget.dart index 267267d4..7333912a 100644 --- a/lib/screens/nollning/questscreen/paperWidget.dart +++ b/lib/screens/nollning/questscreen_24/paperWidget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import "package:fsek_mobile/l10n/app_localizations.dart"; -import "package:fsek_mobile/screens/nollning/questscreen/goodbyePaperPage.dart"; +import "package:fsek_mobile/screens/nollning/questscreen_24/goodbyePaperPage.dart"; //behöver vecka, synas eller inte, klarade,total diff --git a/lib/screens/nollning/questscreen/quests.dart b/lib/screens/nollning/questscreen_24/quests.dart similarity index 97% rename from lib/screens/nollning/questscreen/quests.dart rename to lib/screens/nollning/questscreen_24/quests.dart index 855da15b..2869cac1 100644 --- a/lib/screens/nollning/questscreen/quests.dart +++ b/lib/screens/nollning/questscreen_24/quests.dart @@ -4,8 +4,8 @@ import 'package:fsek_mobile/services/nollning.service.dart'; import 'package:fsek_mobile/services/service_locator.dart'; import 'package:fsek_mobile/util/nollning/week_tracker.dart'; import 'package:fsek_mobile/models/nollning/adventure_mission_week.dart'; -import 'package:fsek_mobile/screens/nollning/questscreen/paperWidget.dart'; -import 'package:fsek_mobile/screens/nollning/questscreen/finishedMissions.dart'; +import 'package:fsek_mobile/screens/nollning/questscreen_24/paperWidget.dart'; +import 'package:fsek_mobile/screens/nollning/questscreen_24/finishedMissions.dart'; class QuestPage extends StatefulWidget { @override diff --git a/lib/screens/nollning/new_questscreen/highscore.dart b/lib/screens/nollning/questscreen_25/highscore.dart similarity index 100% rename from lib/screens/nollning/new_questscreen/highscore.dart rename to lib/screens/nollning/questscreen_25/highscore.dart diff --git a/lib/screens/nollning/new_questscreen/quest_home.dart b/lib/screens/nollning/questscreen_25/quest_home.dart similarity index 97% rename from lib/screens/nollning/new_questscreen/quest_home.dart rename to lib/screens/nollning/questscreen_25/quest_home.dart index e300f701..da1c034b 100644 --- a/lib/screens/nollning/new_questscreen/quest_home.dart +++ b/lib/screens/nollning/questscreen_25/quest_home.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:fsek_mobile/screens/nollning/new_questscreen/highscore.dart'; -import 'package:fsek_mobile/screens/nollning/new_questscreen/quests.dart'; +import 'package:fsek_mobile/screens/nollning/questscreen_25/highscore.dart'; +import 'package:fsek_mobile/screens/nollning/questscreen_25/quests.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; class QuestHomeScreen extends StatefulWidget { diff --git a/lib/screens/nollning/new_questscreen/quests.dart b/lib/screens/nollning/questscreen_25/quests.dart similarity index 100% rename from lib/screens/nollning/new_questscreen/quests.dart rename to lib/screens/nollning/questscreen_25/quests.dart diff --git a/lib/screens/nollning/questscreen_26/quest_home.dart b/lib/screens/nollning/questscreen_26/quest_home.dart new file mode 100644 index 00000000..62d1ce31 --- /dev/null +++ b/lib/screens/nollning/questscreen_26/quest_home.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:fsek_mobile/l10n/app_localizations.dart'; + +class QuestHomeScreen extends StatefulWidget { + @override + _QuestHomeScreenState createState() => _QuestHomeScreenState(); +} + +class _QuestHomeScreenState extends State { + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + var t = AppLocalizations.of(context)!; + + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + + return Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + scrolledUnderElevation: 0.0, + ), + body: InteractiveViewer( + panEnabled: true, + child: Container( + height: screenHeight, + width: screenWidth, + child: Align(alignment: Alignment.center, child: Text("Sidequests!")), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/nollning/schedule.dart b/lib/screens/nollning/schedule.dart index 6378d539..453756cf 100644 --- a/lib/screens/nollning/schedule.dart +++ b/lib/screens/nollning/schedule.dart @@ -1,32 +1,142 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:fsek_mobile/l10n/app_localizations.dart'; - +import 'package:fsek_mobile/screens/nollning/englishSchedule.dart'; +import 'package:fsek_mobile/util/app_exception.dart'; +import 'package:fsek_mobile/util/nollning/week_tracker.dart'; class ScheduleScreenPage extends StatefulWidget { @override _ScheduleScreenState createState() => _ScheduleScreenState(); } - class _ScheduleScreenState extends State { + var state = -1; + var image_loaded = false; + + @override void initState(){ super.initState(); + // hide the android navigation bar while the schedule is showing + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); } + @override + void dispose() { + // before leaving, show the android navigation bar again + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + super.dispose(); + } @override Widget build(BuildContext context) { var t = AppLocalizations.of(context)!; - String schemaPath = "assets/data/nollning_25/schema/schedulescreen_${t.localeName}.png"; + + switch(t.localeName){ + case "sv": + return _swedishSchema(context); + case "en": + return EnglishSchedulePage(); + default: + throw new InvalidInputException("Invalid locale: ${t.localeName}"); + } + } + + Widget _swedishSchema(BuildContext context) { + var screen_width = MediaQuery.of(context).size.width; + var screen_height = MediaQuery.of(context).size.height; + + const img_width = 1581; + const img_height = 22108; + final double render_image_width = screen_width * 1.03; // Magic number because the schema image's border looks a bit wierd so we make it a bit wider to not include the edges. + final double render_image_height = render_image_width * (img_height / img_width); + + final schema_Path = "assets/data/nollning_26/schema/schema_sv.png"; return Scaffold( + backgroundColor: new Color.fromRGBO(134, 187, 230, 1), extendBodyBehindAppBar: true, appBar: AppBar( backgroundColor: Colors.transparent, elevation: 0.0, scrolledUnderElevation: 0.0, ), - body: InteractiveViewer(panEnabled: true, child: SingleChildScrollView(child: Column(children: [Image.asset(schemaPath, fit: BoxFit.fill)]))) + body: GestureDetector( + onVerticalDragEnd: (details) { + var sensitivity = 100; + if (details.primaryVelocity! > sensitivity) { + // Swipe down + if (state != 4) { + setState(() { state++; }); + } + } else if (details.primaryVelocity! < -sensitivity) { + // Swipe up + if (state != 0) { + setState(() { state--; }); + } + } + }, + child: Stack( + children: [ + AnimatedPositioned( + width: screen_width, + height: render_image_height, + top: _screenPosition(render_image_height, state), + duration: const Duration(seconds: 2), + curve: Curves.fastOutSlowIn, + child: ClipRect( + child: OverflowBox( + maxWidth: render_image_width, + minWidth: render_image_width, + maxHeight: render_image_height, + minHeight: render_image_height, + child: Image.asset( + schema_Path, + fit: BoxFit.fill, + cacheHeight: 5000, + frameBuilder: (context, child, frame, wasSynchronouslyLoaded) { + if (wasSynchronouslyLoaded || frame != null) { + if (!image_loaded) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + var week = WeekTracker.determineWeek(); + setState(() { + image_loaded = true; + state = week; + }); + } + }); + } + return child; + } + return const SizedBox.shrink(); // invisible while loading + }, + ), + ), + ), + ) + ], + ), + ), ); } + + static double _screenPosition(double render_image_height, int state){ + switch(state){ + case -1: // Image not loaded + return -render_image_height; + case 0: // Week 0 + return -render_image_height * 0.847; + case 1: // Week 1 + return -render_image_height * 0.64; + case 2: // Week 2 + return -render_image_height * 0.43; + case 3: // Week 3 + return -render_image_height * 0.23; + case 4: // Week 4 + return -1; + default: + throw new InvalidInputException("Unexpected state: " + state.toString()); + } + } } \ No newline at end of file diff --git a/lib/screens/other/other.dart b/lib/screens/other/other.dart index 7a820271..cf7784d2 100644 --- a/lib/screens/other/other.dart +++ b/lib/screens/other/other.dart @@ -4,7 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:fsek_mobile/screens/contact/contact.dart'; import 'package:fsek_mobile/screens/gallery/gallery.dart'; import 'package:fsek_mobile/screens/nollning/emergency_contacts.dart'; -import 'package:fsek_mobile/screens/nollning/nolleguide25/nolleguide_home.dart'; +import 'package:fsek_mobile/screens/nollning/nolleguide_26/nolleguide_home.dart'; import 'package:fsek_mobile/screens/other/aboutGuild.dart'; import 'package:fsek_mobile/screens/settings/language_settings.dart'; import 'package:fsek_mobile/screens/settings/settings.dart'; diff --git a/lib/util/nollning/week_tracker.dart b/lib/util/nollning/week_tracker.dart index 05242308..40924cd1 100644 --- a/lib/util/nollning/week_tracker.dart +++ b/lib/util/nollning/week_tracker.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; class WeekTracker { + /* Not used anymore but will be left in because otherwise stuff breaks */ static const List weekColors = [ Color(0xFFf77e14), // v0 Color(0xFFf77e14), // v1 @@ -10,13 +11,14 @@ class WeekTracker { Color(0xFFf77e14), // for other times and purposes ]; + /* This is used though */ static int determineWeek({bool differentPreIntroduction = false}) { DateTime now = DateTime.now(); - DateTime v0 = DateTime(2024, 8, 26, 0, 0); - DateTime v1 = DateTime(2024, 9, 2, 0, 0); - DateTime v2 = DateTime(2024, 9, 9, 0, 0); - DateTime v3 = DateTime(2024, 9, 16, 0, 0); - DateTime v4 = DateTime(2024, 9, 23, 0, 0); + DateTime v0 = DateTime(2026, 8, 24, 0, 0); + DateTime v1 = DateTime(2026, 8, 31, 0, 0); + DateTime v2 = DateTime(2026, 9, 7, 0, 0); + DateTime v3 = DateTime(2026, 9, 14, 0, 0); + DateTime v4 = DateTime(2026, 9, 21, 0, 0); List weeks = [v0, v1, v2, v3, v4]; @@ -33,10 +35,10 @@ class WeekTracker { } } - // If it for some reason doesnt find one I guess default to week 0 for no spoilers? - // or 5 for generic stuff, like coloring in with orange + // If it for some reason doesn't find one I guess default to week 0 for no spoilers? + // or 4 for generic stuff, like coloring in with orange if (differentPreIntroduction) - return 5; + return 4; else return 0; } diff --git a/pubspec.lock b/pubspec.lock index 3571ec8e..9c0a5dde 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1031,14 +1031,6 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.2" - photo_view: - dependency: "direct main" - description: - name: photo_view - sha256: "1fc3d970a91295fbd1364296575f854c9863f225505c28c46e0a03e48960c75e" - url: "https://pub.dev" - source: hosted - version: "0.15.0" platform: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9ab56f98..12e577de 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ description: Mobile application for the F-guild # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # -version: 1.28.6122+1 +version: 1.29.6122+1 environment: sdk: '>=3.10.0 <4.0.0' @@ -76,7 +76,6 @@ dependencies: url_launcher_web: any # flutter_web_plugins: any html: any - photo_view: ^0.15.0 package_info_plus: ^9.0.0 connectivity_plus: ^7.0.0 vector_math: any @@ -115,16 +114,25 @@ flutter: - assets/img/ - assets/img/moose_game/ - assets/img/memes/ - - assets/data/nollning_25/calendar/ - - assets/data/nollning_25/nolleguide/ - - assets/data/nollning_25/nolleguide/kladguide/ - - assets/data/nollning_25/nolleguide/homescreen/ - - assets/data/nollning_25/uppdrag/ - - assets/data/nollning_25/nolleguide/studentlivet/ - - assets/data/nollning_25/nolleguide/studentlivet/fsek/ - - assets/data/nollning_25/ - - assets/data/nollning_25/schema/ - - assets/data/nollning_25/homescreen/ + - assets/data/nollning_26/homescreen/ + - assets/data/nollning_26/schema/ + - assets/data/nollning_26/nolleguide/homescreen/ + - assets/data/nollning_26/nolleguide/studentlife/ + - assets/data/nollning_26/nolleguide/studentlife/building_blocks/ + - assets/data/nollning_26/nolleguide/studentlife/faculty/ + - assets/data/nollning_26/nolleguide/studentlife/guild/ + - assets/data/nollning_26/nolleguide/studentlife/lund/ + - assets/data/nollning_26/nolleguide/ + - assets/data/nollning_26/nolleguide/dresscode/ + - assets/data/nollning_26/nolleguide/sandwich/ + - assets/data/nollning_26/homescreen/lvl_0/ + - assets/data/nollning_26/homescreen/lvl_1/ + - assets/data/nollning_26/homescreen/lvl_2/ + - assets/data/nollning_26/homescreen/lvl_3/ + - assets/data/nollning_26/homescreen/lvl_4/ + - assets/data/nollning_26/calendar/ + - assets/data/nollning_26/map/ + - assets/data/nollning_26/map/pin_media/ fonts: - family: Brandon Grotesque @@ -145,6 +153,9 @@ flutter: weight: 500 - asset: assets/fonts/MinionPro-Bold.otf weight: 900 + - family: Consolas + fonts: + - asset: assets/fonts/Consolas-Regular.ttf # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.