5 Commits
dev ... dev

Author SHA1 Message Date
5a42884d20 Merge pull request 'Fixek + szöveg edit' (#31) from balint1414/firka:dev into dev
Reviewed-on: firka/firka#31
2026-06-11 18:13:02 +02:00
checkedear
858d558cc3 feat: classroom name on lesson bottom sheet 2026-06-11 13:51:43 +02:00
checkedear
76f345cd6b fix: space under lesson slider 2026-06-11 13:29:55 +02:00
checkedear
e211d64ffb feat: shorten teacher's name 2026-06-11 13:29:20 +02:00
checkedear
c67ce7472a fix: event card on timetable 2026-06-11 12:25:13 +02:00
6 changed files with 129 additions and 90 deletions

View File

@@ -294,4 +294,26 @@ extension StringExtension on String {
if (length == 1) this[0].toUpperCase();
return this[0].toUpperCase() + substring(1, length);
}
String shortenName([int start = 0]) {
if (length <= 16 || start >= length) {
return this;
}
int index = indexOf(" ", start);
if (index == -1) {
return this;
}
String string = substring(start, index);
if (string.endsWith(".")) {
return this;
}
return replaceRange(
start,
index,
"${string[0]}.",
).shortenName(index - string.length + 2 + 1);
}
}

View File

@@ -137,6 +137,27 @@ Future<void> showLessonBottomSheet(
size: 26,
),
),
SizedBox(width: 6),
if (lesson.roomName != null)
Card(
shadowColor: Colors.transparent,
color: appStyle.colors.a15p,
margin: EdgeInsets.all(0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 6),
child: Text(
lesson.roomName!,
style: appStyle.fonts.B_14R.apply(
color: appStyle.colors.secondary,
),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
),
),
],
),
SizedBox(height: 20),
@@ -165,7 +186,6 @@ Future<void> showLessonBottomSheet(
lesson.substituteTeacher!,
style: appStyle.fonts.B_14R.apply(color: appStyle.colors.textSecondary),
),
SizedBox(height: 8),
Text(
'${lesson.start.format(data.l10n, FormatMode.hmm)} - ${lesson.end.format(data.l10n, FormatMode.hmm)}',
style: appStyle.fonts.B_14R.apply(color: appStyle.colors.textSecondary),

View File

@@ -259,6 +259,7 @@ class _HomeMainScreen extends FirkaState<HomeMainScreen> {
WelcomeWidget(widget.data.l10n, now, student!, lessons!),
SizedBox(height: 48),
LessonSlider(lessonTestMap, testsTomorrow),
SizedBox(height: 24),
...noticeBoardWidgets
.groupList((e) => e.$2)
.entries

View File

@@ -166,7 +166,7 @@ class LessonWidget extends StatelessWidget {
),
showSubstitutions
? Text(
lesson.substituteTeacher!,
lesson.substituteTeacher!.shortenName(),
style: appStyle.fonts.B_14R.apply(
color: appStyle.colors.textSecondary,
),

View File

@@ -204,7 +204,7 @@ class LessonBigWidget extends StatelessWidget {
),
if (isSubstituted)
Text(
lesson.substituteTeacher!,
lesson.substituteTeacher!.shortenName(),
style: appStyle.fonts.B_14R.apply(
color: appStyle.colors.textSecondary,
),

View File

@@ -32,10 +32,8 @@ class TimeTableDayWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget ttBody;
if (lessons.isEmpty) {
ttBody = Column(
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
@@ -92,95 +90,93 @@ class TimeTableDayWidget extends StatelessWidget {
),
],
);
} else {
List<Widget> ttLessons = List.empty(growable: true);
for (var i = 0; i < events.length; i++) {
var event = events[i];
ttLessons.add(
FirkaCard.single(
margin: EdgeInsets.zero,
padding: EdgeInsets.all(16),
child: Text(
event.name,
style: appStyle.fonts.B_16R.apply(
color: appStyle.colors.textPrimary,
),
}
List<Widget> ttLessons = List.empty(growable: true);
for (final event in events) {
ttLessons.add(
FirkaCard.single(
margin: EdgeInsets.zero,
padding: EdgeInsets.all(16),
child: Text(
event.name,
style: appStyle.fonts.B_16R.apply(
color: appStyle.colors.textPrimary,
),
),
);
}
if (events.isNotEmpty) {
ttLessons.add(SizedBox());
}
var showBreak = data.settings
.group("settings")
.subGroup("timetable_toast")
.boolean("breaks");
for (var i = 0; i < lessons.length; i++) {
var lesson = lessons[i];
var nextLesson = lessons.length > i + 1 ? lessons[i + 1] : null;
ttLessons.add(
LessonWidget(
data,
lesson,
tests.firstWhereOrNull(
(test) => test.lessonNumber == lesson.lessonNumber,
),
active: timeNow().isBetween(
i > 0 ? lessons[i - 1].end : lesson.start,
lesson.end,
),
),
);
if (!showBreak || nextLesson == null) {
continue;
}
var breakMins = nextLesson.start.difference(lesson.end).inMinutes;
ttLessons.add(
FirkaCard(
color: appStyle.colors.cardTranslucent,
margin: EdgeInsets.all(0),
padding: EdgeInsets.symmetric(vertical: 11, horizontal: 16),
shadow: false,
left: [
Text(
initData.l10n.breakTxt,
style: appStyle.fonts.B_14SB.copyWith(
color: appStyle.colors.textSecondary,
),
),
],
right: [
Text(
"$breakMins ${breakMins > 1 ? initData.l10n.starting_min_plural : initData.l10n.starting_min}",
style: appStyle.fonts.B_14R.copyWith(
color: appStyle.colors.textSecondary,
),
),
],
),
);
}
ttBody = Padding(
padding: const EdgeInsets.only(top: 70 + 16 + 20, left: 20, right: 20),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 16,
children: [...ttLessons, SizedBox(height: 55)],
),
),
);
}
return ttBody;
if (events.isNotEmpty) {
ttLessons.add(SizedBox());
}
var showBreak = data.settings
.group("settings")
.subGroup("timetable_toast")
.boolean("breaks");
for (var i = 0; i < lessons.length; i++) {
var lesson = lessons[i];
var nextLesson = lessons.length > i + 1 ? lessons[i + 1] : null;
ttLessons.add(
LessonWidget(
data,
lesson,
tests.firstWhereOrNull(
(test) => test.lessonNumber == lesson.lessonNumber,
),
active: timeNow().isBetween(
i > 0 ? lessons[i - 1].end : lesson.start,
lesson.end,
),
),
);
if (!showBreak || nextLesson == null) {
continue;
}
var breakMins = nextLesson.start.difference(lesson.end).inMinutes;
ttLessons.add(
FirkaCard(
color: appStyle.colors.cardTranslucent,
margin: EdgeInsets.all(0),
padding: EdgeInsets.symmetric(vertical: 11, horizontal: 16),
shadow: false,
left: [
Text(
initData.l10n.breakTxt,
style: appStyle.fonts.B_14SB.copyWith(
color: appStyle.colors.textSecondary,
),
),
],
right: [
Text(
"$breakMins ${breakMins > 1 ? initData.l10n.starting_min_plural : initData.l10n.starting_min}",
style: appStyle.fonts.B_14R.copyWith(
color: appStyle.colors.textSecondary,
),
),
],
),
);
}
return Padding(
padding: const EdgeInsets.only(top: 70 + 16 + 20, left: 20, right: 20),
child: ListView.separated(
separatorBuilder: (context, index) => SizedBox(height: 16),
itemBuilder: (context, index) {
if (ttLessons.length == index) {
return SizedBox(height: 55);
}
return ttLessons[index];
},
itemCount: ttLessons.length + 1,
),
);
}
}