Skip to content

Commit 6df4973

Browse files
committed
Merge remote-tracking branch 'origin/main' into enhancement/288-display-study-room-utilization-percentages-using-iris
2 parents efbb13c + 2d54414 commit 6df4973

16 files changed

+231
-182
lines changed

android/settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ plugins {
2020
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
2121
id "com.android.application" version '8.6.1' apply false
2222
id "org.jetbrains.kotlin.android" version "1.9.20" apply false
23-
id "org.jetbrains.kotlin.plugin.serialization" version "2.0.20" apply false
23+
id "org.jetbrains.kotlin.plugin.serialization" version "2.0.21" apply false
2424
id "com.google.gms.google-services" version "4.4.2" apply false
2525
id "com.google.firebase.crashlytics" version "3.0.2" apply false
2626
}

assets/translations/de.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@
230230
"campus": "Campus",
231231
"studies": "Studium",
232232
"suggested": "Interessante {}",
233-
"all": "Alle",
233+
"more": "Mehr",
234234
"visibility": "Sichtbarkeit",
235235
"utilizationAt": "Auslastung bei {}%"
236236
}

assets/translations/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@
230230
"campus": "Campus",
231231
"studies": "Studies",
232232
"suggested": "Suggested {}",
233-
"all": "All",
233+
"more": "More",
234234
"visibility": "Visibility",
235235
"utilizationAt": "Utilization at {}%"
236236
}

lib/base/util/grid_utility.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import 'package:campus_flutter/base/enums/device.dart';
2+
import 'package:campus_flutter/base/services/device_type_service.dart';
3+
import 'package:flutter/material.dart';
4+
5+
class GridUtility {
6+
static int campusCrossAxisCount(BuildContext context) {
7+
switch (DeviceService.getType(context)) {
8+
case Device.landscapeTablet:
9+
return 6;
10+
case Device.portraitTablet:
11+
return 4;
12+
case Device.phone:
13+
return 2;
14+
}
15+
}
16+
17+
static int campusPaddedCrossAxisCount(BuildContext context) {
18+
switch (DeviceService.getType(context)) {
19+
case Device.landscapeTablet:
20+
return 3;
21+
case Device.portraitTablet:
22+
return 4;
23+
case Device.phone:
24+
return 2;
25+
}
26+
}
27+
28+
static int campusNumberOfItems(BuildContext context) {
29+
switch (DeviceService.getType(context)) {
30+
case Device.landscapeTablet:
31+
return 6;
32+
case Device.portraitTablet:
33+
return 8;
34+
case Device.phone:
35+
return 6;
36+
}
37+
}
38+
}

lib/campusComponent/screen/movie_screen.dart

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import 'package:campus_flutter/base/enums/device.dart';
21
import 'package:campus_flutter/base/enums/error_handling_view_type.dart';
32
import 'package:campus_flutter/base/errorHandling/error_handling_router.dart';
43
import 'package:campus_flutter/base/extensions/context.dart';
5-
import 'package:campus_flutter/base/services/device_type_service.dart';
64
import 'package:campus_flutter/base/util/delayed_loading_indicator.dart';
5+
import 'package:campus_flutter/base/util/grid_utility.dart';
76
import 'package:campus_flutter/base/util/url_launcher.dart';
8-
import 'package:campus_flutter/campusComponent/view/movie/movie_card_view.dart';
7+
import 'package:campus_flutter/campusComponent/view/movie/movie_grid_view.dart';
98
import 'package:campus_flutter/campusComponent/viewmodel/movies_viewmodel.dart';
109
import 'package:easy_localization/easy_localization.dart';
1110
import 'package:flutter/material.dart';
@@ -34,15 +33,11 @@ class MovieScreen extends ConsumerWidget {
3433
),
3534
body: () {
3635
if (snapshot.hasData) {
37-
return GridView.count(
36+
return MovieGridView(
37+
movies: snapshot.data!,
3838
padding: EdgeInsets.all(context.padding),
39-
crossAxisCount: crossAxisCount(context),
40-
mainAxisSpacing: context.padding,
41-
crossAxisSpacing: context.padding,
42-
childAspectRatio: 250 / 470,
43-
children: [
44-
for (var movie in snapshot.data!) MovieCardView(movie: movie),
45-
],
39+
crossAxisCount: GridUtility.campusCrossAxisCount(context),
40+
withinScrollView: false,
4641
);
4742
} else if (snapshot.hasError) {
4843
return Center(
@@ -63,15 +58,4 @@ class MovieScreen extends ConsumerWidget {
6358
},
6459
);
6560
}
66-
67-
int crossAxisCount(BuildContext context) {
68-
switch (DeviceService.getType(context)) {
69-
case Device.landscapeTablet:
70-
return 6;
71-
case Device.portraitTablet:
72-
return 4;
73-
case Device.phone:
74-
return 2;
75-
}
76-
}
7761
}

lib/campusComponent/screen/student_clubs_screen.dart

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import 'package:campus_flutter/base/enums/device.dart';
22
import 'package:campus_flutter/base/enums/error_handling_view_type.dart';
33
import 'package:campus_flutter/base/errorHandling/error_handling_router.dart';
4+
import 'package:campus_flutter/base/extensions/context.dart';
45
import 'package:campus_flutter/base/networking/apis/tumdev/campus_backend.pb.dart';
56
import 'package:campus_flutter/base/services/device_type_service.dart';
67
import 'package:campus_flutter/base/util/delayed_loading_indicator.dart';
78
import 'package:campus_flutter/base/util/url_launcher.dart';
89
import 'package:campus_flutter/campusComponent/model/student_club_collection.dart';
9-
import 'package:campus_flutter/campusComponent/view/studentClub/student_club_item_view.dart';
10+
import 'package:campus_flutter/campusComponent/view/studentClub/student_club_grid_view.dart';
1011
import 'package:campus_flutter/campusComponent/viewmodel/student_club_viewmodel.dart';
1112
import 'package:easy_localization/easy_localization.dart';
1213
import 'package:flutter/material.dart';
@@ -48,34 +49,11 @@ class StudentClubsScreen extends ConsumerWidget {
4849
return TabBarView(
4950
children: [
5051
for (var collection in snapshot.data!)
51-
Padding(
52-
padding: const EdgeInsets.only(
53-
top: 15,
54-
left: 11,
55-
right: 11,
56-
),
57-
child: GridView.count(
58-
crossAxisCount: crossAxisCount(context),
59-
children: [
60-
for (var studentClub in collection.clubs)
61-
Padding(
62-
padding: const EdgeInsets.all(4.0),
63-
child: Container(
64-
decoration: const ShapeDecoration(
65-
shape: RoundedRectangleBorder(
66-
borderRadius: BorderRadius.all(
67-
Radius.circular(28.0),
68-
),
69-
),
70-
),
71-
clipBehavior: Clip.antiAlias,
72-
child: StudentClubItemView(
73-
studentClub: studentClub,
74-
),
75-
),
76-
),
77-
],
78-
),
52+
StudentClubGridView(
53+
studentClubs: collection.clubs,
54+
padding: EdgeInsets.all(context.padding),
55+
crossAxisCount: crossAxisCount(context),
56+
withinScrollView: false,
7957
),
8058
],
8159
);

lib/campusComponent/view/movie/movie_card_view.dart

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,25 @@ import 'package:flutter/material.dart';
77
import 'package:flutter_riverpod/flutter_riverpod.dart';
88

99
class MovieCardView extends ConsumerWidget {
10-
const MovieCardView({
11-
super.key,
12-
required this.movie,
13-
this.isCarousel = false,
14-
});
10+
const MovieCardView({super.key, required this.movie});
1511

1612
final Movie movie;
17-
final bool isCarousel;
1813

1914
@override
2015
Widget build(BuildContext context, WidgetRef ref) {
21-
if (isCarousel) {
22-
return body(context);
23-
} else {
24-
return InkWell(
25-
onTap: () {
26-
UrlLauncher.urlString(movie.additionalInformationUrl, ref);
27-
},
28-
child: body(context),
29-
);
30-
}
16+
return InkWell(
17+
onTap: () {
18+
UrlLauncher.urlString(movie.additionalInformationUrl, ref);
19+
},
20+
child: body(context),
21+
);
3122
}
3223

3324
Widget body(BuildContext context) {
3425
return Container(
3526
decoration: BoxDecoration(
3627
color: Theme.of(context).cardTheme.color,
37-
borderRadius: isCarousel
38-
? BorderRadius.zero
39-
: const BorderRadius.all(Radius.circular(12)),
28+
borderRadius: const BorderRadius.all(Radius.circular(12)),
4029
),
4130
clipBehavior: Clip.antiAlias,
4231
child: AspectRatio(
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import 'package:campus_flutter/base/extensions/context.dart';
2+
import 'package:campus_flutter/base/networking/apis/tumdev/campus_backend.pb.dart';
3+
import 'package:campus_flutter/campusComponent/view/movie/movie_card_view.dart';
4+
import 'package:flutter/material.dart';
5+
6+
class MovieGridView extends StatelessWidget {
7+
const MovieGridView({
8+
super.key,
9+
required this.movies,
10+
required this.padding,
11+
required this.crossAxisCount,
12+
required this.withinScrollView,
13+
});
14+
15+
final List<Movie> movies;
16+
final EdgeInsets padding;
17+
final int crossAxisCount;
18+
final bool withinScrollView;
19+
20+
@override
21+
Widget build(BuildContext context) {
22+
return GridView.count(
23+
shrinkWrap: withinScrollView,
24+
physics: withinScrollView ? NeverScrollableScrollPhysics() : null,
25+
padding: padding,
26+
crossAxisCount: crossAxisCount,
27+
mainAxisSpacing: context.padding,
28+
crossAxisSpacing: context.padding,
29+
childAspectRatio: 250 / 470,
30+
children: [for (var movie in movies) MovieCardView(movie: movie)],
31+
);
32+
}
33+
}

lib/campusComponent/view/movie/movies_widget_view.dart

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import 'package:campus_flutter/base/enums/error_handling_view_type.dart';
2+
import 'package:campus_flutter/base/extensions/context.dart';
23
import 'package:campus_flutter/base/routing/routes.dart';
34
import 'package:campus_flutter/base/util/delayed_loading_indicator.dart';
45
import 'package:campus_flutter/base/networking/apis/tumdev/campus_backend.pbgrpc.dart';
56
import 'package:campus_flutter/base/errorHandling/error_handling_router.dart';
6-
import 'package:campus_flutter/base/util/url_launcher.dart';
7+
import 'package:campus_flutter/base/util/grid_utility.dart';
8+
import 'package:campus_flutter/campusComponent/view/movie/movie_grid_view.dart';
79
import 'package:campus_flutter/homeComponent/view/widget/widget_frame_view.dart';
810
import 'package:campus_flutter/campusComponent/viewmodel/movies_viewmodel.dart';
9-
import 'package:campus_flutter/campusComponent/view/movie/movie_card_view.dart';
1011
import 'package:easy_localization/easy_localization.dart';
1112
import 'package:flutter/material.dart';
1213
import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -47,7 +48,7 @@ class _MoviesHomeWidgetState extends ConsumerState<MovieWidgetView> {
4748
const Spacer(),
4849
InkWell(
4950
child: Text(
50-
context.tr("all"),
51+
context.tr("more"),
5152
style: Theme.of(context).textTheme.titleMedium,
5253
maxLines: 1,
5354
overflow: TextOverflow.ellipsis,
@@ -65,45 +66,29 @@ class _MoviesHomeWidgetState extends ConsumerState<MovieWidgetView> {
6566

6667
Widget body(AsyncSnapshot<List<Movie>?> snapshot) {
6768
if (snapshot.hasData) {
68-
final height = MediaQuery.of(context).size.height * 0.34;
69-
final width = height * 250 / 470;
70-
return SizedBox(
71-
height: height,
72-
child: Padding(
73-
padding: const EdgeInsets.only(left: 11),
74-
child: CarouselView(
75-
itemExtent: width,
76-
shrinkExtent: width,
77-
shape: RoundedRectangleBorder(
78-
borderRadius: BorderRadius.circular(12),
79-
),
80-
children: [
81-
for (var data in snapshot.data!)
82-
MovieCardView(
83-
movie: data,
84-
isCarousel: true,
85-
),
86-
],
87-
onTap: (index) => UrlLauncher.urlString(
88-
snapshot.data![index].additionalInformationUrl,
89-
ref,
90-
),
91-
),
92-
),
69+
return MovieGridView(
70+
movies: snapshot.data!
71+
.take(GridUtility.campusNumberOfItems(context))
72+
.toList(),
73+
padding: EdgeInsets.symmetric(horizontal: context.padding),
74+
crossAxisCount: GridUtility.campusPaddedCrossAxisCount(context),
75+
withinScrollView: true,
9376
);
9477
} else if (snapshot.hasError) {
95-
return SizedBox(
96-
height: MediaQuery.of(context).size.height * 0.34,
97-
child: ErrorHandlingRouter(
98-
error: snapshot.error!,
99-
errorHandlingViewType: ErrorHandlingViewType.textOnly,
100-
retry: (() => ref.read(movieViewModel).fetch(true)),
78+
return AspectRatio(
79+
aspectRatio: 2,
80+
child: Card(
81+
child: ErrorHandlingRouter(
82+
error: Error(),
83+
errorHandlingViewType: ErrorHandlingViewType.textOnly,
84+
retry: (() => ref.read(movieViewModel).fetch(true)),
85+
),
10186
),
10287
);
10388
} else {
104-
return Card(
105-
child: SizedBox(
106-
height: MediaQuery.of(context).size.height * 0.34,
89+
return AspectRatio(
90+
aspectRatio: 2,
91+
child: Card(
10792
child: DelayedLoadingIndicator(name: context.tr("movies")),
10893
),
10994
);

lib/campusComponent/view/news/news_widget_view.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class _NewsWidgetViewState extends ConsumerState<NewsWidgetView> {
4040
const Spacer(),
4141
InkWell(
4242
child: Text(
43-
context.tr("all"),
43+
context.tr("more"),
4444
style: Theme.of(context).textTheme.titleMedium,
4545
maxLines: 1,
4646
overflow: TextOverflow.ellipsis,

lib/campusComponent/view/studentClub/student_club_item_view.dart renamed to lib/campusComponent/view/studentClub/student_club_card_view.dart

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,26 @@ import 'package:flutter/material.dart';
66
import 'package:flutter_riverpod/flutter_riverpod.dart';
77
import 'package:flutter_svg/svg.dart';
88

9-
class StudentClubItemView extends ConsumerWidget {
10-
const StudentClubItemView({
9+
class StudentClubCardView extends ConsumerWidget {
10+
const StudentClubCardView({
1111
super.key,
1212
required this.studentClub,
13-
this.isCarousel = false,
1413
});
1514

1615
final StudentClub studentClub;
17-
final bool isCarousel;
1816

1917
@override
2018
Widget build(BuildContext context, WidgetRef ref) {
21-
if (isCarousel) {
22-
return body(context);
23-
} else {
24-
return InkWell(
25-
onTap: () => UrlLauncher.urlString(studentClub.linkUrl, ref),
26-
child: body(context),
27-
);
28-
}
19+
return InkWell(
20+
onTap: () => UrlLauncher.urlString(studentClub.linkUrl, ref),
21+
child: body(context),
22+
);
2923
}
3024

3125
Widget body(BuildContext context) {
32-
return Container(
33-
color: Theme.of(context).cardTheme.color,
26+
return Card(
27+
margin: EdgeInsets.zero,
28+
clipBehavior: Clip.hardEdge,
3429
child: Column(
3530
children: [
3631
if (studentClub.coverUrl.contains("svg"))
@@ -67,6 +62,7 @@ class StudentClubItemView extends ConsumerWidget {
6762
),
6863
),
6964
),
65+
Divider(height: 0),
7066
Expanded(
7167
flex: 2,
7268
child: Center(

0 commit comments

Comments
 (0)