Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions school_data_hub_client/lib/src/protocol/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2431,12 +2431,12 @@ class EndpointPupilWorkbooks extends _i1.EndpointRef {
@override
String get name => 'pupilWorkbooks';

_i2.Future<_i53.PupilWorkbook> postPupilWorkbook(
_i2.Future<_i53.PupilWorkbook?> postPupilWorkbook(
int isbn,
int pupilId,
String createdBy,
) =>
caller.callServerEndpoint<_i53.PupilWorkbook>(
caller.callServerEndpoint<_i53.PupilWorkbook?>(
'pupilWorkbooks',
'postPupilWorkbook',
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ class CustomExpansionTileController {
/// populated by instances of your new inner widgets, and then in
/// these inner widgets you would use [CustomExpansionTileController.of].
static CustomExpansionTileController of(BuildContext context) {
final _ExpansionTileState? result =
context.findAncestorStateOfType<_ExpansionTileState>();
final _ExpansionTileState? result = context
.findAncestorStateOfType<_ExpansionTileState>();
if (result != null) {
return result._tileController;
}
Expand Down Expand Up @@ -251,10 +251,10 @@ class CustomExpansionTile extends StatefulWidget {
this.controlAffinity,
this.controller,
}) : assert(
expandedCrossAxisAlignment != CrossAxisAlignment.baseline,
'CrossAxisAlignment.baseline is not supported since the expanded children '
'are aligned in a column, not a row. Try to use another constant.',
);
expandedCrossAxisAlignment != CrossAxisAlignment.baseline,
'CrossAxisAlignment.baseline is not supported since the expanded children '
'are aligned in a column, not a row. Try to use another constant.',
);

/// A widget to display before the title.
///
Expand Down Expand Up @@ -498,10 +498,12 @@ class CustomExpansionTile extends StatefulWidget {

class _ExpansionTileState extends State<CustomExpansionTile>
with SingleTickerProviderStateMixin {
static final Animatable<double> _easeOutTween =
CurveTween(curve: Curves.easeOut);
static final Animatable<double> _easeInTween =
CurveTween(curve: Curves.easeIn);
static final Animatable<double> _easeOutTween = CurveTween(
curve: Curves.easeOut,
);
static final Animatable<double> _easeInTween = CurveTween(
curve: Curves.easeIn,
);
// static final Animatable<double> _halfTween =
// Tween<double>(begin: 0.0, end: 0.5);

Expand All @@ -528,14 +530,18 @@ class _ExpansionTileState extends State<CustomExpansionTile>
_heightFactor = _animationController.drive(_easeInTween);
//_iconTurns = _animationController.drive(_halfTween.chain(_easeInTween));
_border = _animationController.drive(_borderTween.chain(_easeOutTween));
_headerColor =
_animationController.drive(_headerColorTween.chain(_easeInTween));
_iconColor =
_animationController.drive(_iconColorTween.chain(_easeInTween));
_backgroundColor =
_animationController.drive(_backgroundColorTween.chain(_easeOutTween));

_isExpanded = PageStorage.maybeOf(context)?.readState(context) as bool? ??
_headerColor = _animationController.drive(
_headerColorTween.chain(_easeInTween),
);
_iconColor = _animationController.drive(
_iconColorTween.chain(_easeInTween),
);
_backgroundColor = _animationController.drive(
_backgroundColorTween.chain(_easeOutTween),
);

_isExpanded =
PageStorage.maybeOf(context)?.readState(context) as bool? ??
widget.initiallyExpanded;
if (_isExpanded) {
_animationController.value = 1.0;
Expand Down Expand Up @@ -631,9 +637,11 @@ class _ExpansionTileState extends State<CustomExpansionTile>
// }

Widget _buildChildren(BuildContext context, Widget? child) {
final ExpansionTileThemeData expansionTileTheme =
ExpansionTileTheme.of(context);
final ShapeBorder expansionTileBorder = _border.value ??
final ExpansionTileThemeData expansionTileTheme = ExpansionTileTheme.of(
context,
);
final ShapeBorder expansionTileBorder =
_border.value ??
const Border(
top: BorderSide(color: Colors.transparent),
bottom: BorderSide(color: Colors.transparent),
Expand All @@ -644,7 +652,8 @@ class _ExpansionTileState extends State<CustomExpansionTile>
return Container(
clipBehavior: clipBehavior,
decoration: ShapeDecoration(
color: _backgroundColor.value ??
color:
_backgroundColor.value ??
expansionTileTheme.backgroundColor ??
Colors.transparent,
shape: expansionTileBorder,
Expand All @@ -653,22 +662,23 @@ class _ExpansionTileState extends State<CustomExpansionTile>
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTileTheme.merge(
iconColor: _iconColor.value ?? expansionTileTheme.iconColor,
textColor: _headerColor.value,
child: const SizedBox.shrink()
// ListTile(
// onTap: _handleTap,
// contentPadding:
// widget.tilePadding ?? expansionTileTheme.tilePadding,
// leading: widget.leading ?? _buildLeadingIcon(context),
// title: widget.title,
// subtitle: widget.subtitle,
// trailing: widget.trailing ?? _buildTrailingIcon(context),
// ),
),
iconColor: _iconColor.value ?? expansionTileTheme.iconColor,
textColor: _headerColor.value,
child: const SizedBox.shrink(),
// ListTile(
// onTap: _handleTap,
// contentPadding:
// widget.tilePadding ?? expansionTileTheme.tilePadding,
// leading: widget.leading ?? _buildLeadingIcon(context),
// title: widget.title,
// subtitle: widget.subtitle,
// trailing: widget.trailing ?? _buildTrailingIcon(context),
// ),
),
ClipRect(
child: Align(
alignment: widget.expandedAlignment ??
alignment:
widget.expandedAlignment ??
expansionTileTheme.expandedAlignment ??
Alignment.center,
heightFactor: _heightFactor.value,
Expand All @@ -683,49 +693,58 @@ class _ExpansionTileState extends State<CustomExpansionTile>
@override
void didChangeDependencies() {
final ThemeData theme = Theme.of(context);
final ExpansionTileThemeData expansionTileTheme =
ExpansionTileTheme.of(context);
final ExpansionTileThemeData expansionTileTheme = ExpansionTileTheme.of(
context,
);
final ExpansionTileThemeData defaults = theme.useMaterial3
? _ExpansionTileDefaultsM3(context)
: _ExpansionTileDefaultsM2(context);
_borderTween
..begin = widget.collapsedShape ??
..begin =
widget.collapsedShape ??
expansionTileTheme.collapsedShape ??
const Border(
top: BorderSide(color: Colors.transparent),
bottom: BorderSide(color: Colors.transparent),
)
..end = widget.shape ??
..end =
widget.shape ??
expansionTileTheme.collapsedShape ??
Border(
top: BorderSide(color: theme.dividerColor),
bottom: BorderSide(color: theme.dividerColor),
);
_headerColorTween
..begin = widget.collapsedTextColor ??
..begin =
widget.collapsedTextColor ??
expansionTileTheme.collapsedTextColor ??
defaults.collapsedTextColor
..end = widget.textColor ??
..end =
widget.textColor ??
expansionTileTheme.textColor ??
defaults.textColor;
_iconColorTween
..begin = widget.collapsedIconColor ??
..begin =
widget.collapsedIconColor ??
expansionTileTheme.collapsedIconColor ??
defaults.collapsedIconColor
..end = widget.iconColor ??
..end =
widget.iconColor ??
expansionTileTheme.iconColor ??
defaults.iconColor;
_backgroundColorTween
..begin = widget.collapsedBackgroundColor ??
..begin =
widget.collapsedBackgroundColor ??
expansionTileTheme.collapsedBackgroundColor
..end = widget.backgroundColor ?? expansionTileTheme.backgroundColor;
super.didChangeDependencies();
}

@override
Widget build(BuildContext context) {
final ExpansionTileThemeData expansionTileTheme =
ExpansionTileTheme.of(context);
final ExpansionTileThemeData expansionTileTheme = ExpansionTileTheme.of(
context,
);
final bool closed = !_isExpanded && _animationController.isDismissed;
final bool shouldRemoveChildren = closed && !widget.maintainState;

Expand All @@ -734,7 +753,8 @@ class _ExpansionTileState extends State<CustomExpansionTile>
child: TickerMode(
enabled: !closed,
child: Padding(
padding: widget.childrenPadding ??
padding:
widget.childrenPadding ??
expansionTileTheme.childrenPadding ??
EdgeInsets.zero,
child: Column(
Expand Down
16 changes: 16 additions & 0 deletions school_data_hub_flutter/lib/core/init/init_on_user_auth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import 'package:school_data_hub_flutter/features/school_lists/domain/school_list
import 'package:school_data_hub_flutter/features/timetable/data/timetable_api_service.dart';
import 'package:school_data_hub_flutter/features/timetable/timetable.dart';
import 'package:school_data_hub_flutter/features/user/domain/user_manager.dart';
import 'package:school_data_hub_flutter/features/workbooks/domain/pupil_workbook_manager.dart';
import 'package:school_data_hub_flutter/features/workbooks/domain/workbook_manager.dart';
import 'package:watch_it/watch_it.dart';

Expand Down Expand Up @@ -180,6 +181,21 @@ class InitOnUserAuth {
},
);

di.registerSingletonAsync<PupilWorkbookManager>(
() async {
final pupilWorkbookManager = PupilWorkbookManager();
await pupilWorkbookManager.init();
_log.info('[PupilWorkbookManager] initialized ✅️');
return pupilWorkbookManager;
},
dispose: (instance) {
_log.info('[PupilWorkbookManager] disposed 🚮');
instance.dispose();
return;
},
dependsOn: [HubSessionManager, PupilProxyManager],
);

di.registerSingletonAsync<CompetenceManager>(
() async {
final competenceManager = CompetenceManager();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'package:school_data_hub_client/school_data_hub_client.dart';
import 'package:school_data_hub_flutter/core/client/client_helper.dart';
import 'package:school_data_hub_flutter/core/session/hub_session_manager.dart';
import 'package:watch_it/watch_it.dart';

class CompetenceGoalApiService {
// Private constructor
CompetenceGoalApiService._internal();
// Singleton instance
static final CompetenceGoalApiService _instance =
CompetenceGoalApiService._internal();
// Factory constructor to return the singleton instance
factory CompetenceGoalApiService() {
return _instance;
}
Client get _client => di<Client>();

HubSessionManager get _hubSessionManager => di<HubSessionManager>();
// - post a competence goal
Future<PupilData?> postCompetenceGoal({
required int pupilId,
required int competenceId,
required String description,
required List<String> strategies,
}) async {
final response = ClientHelper.apiCall(
call: () => _client.competenceGoal.postCompetenceGoal(
competenceId: competenceId,
pupilId: pupilId,
description: description,
strategies: strategies,
createdBy: _hubSessionManager.userName!,
),
);
return response;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:school_data_hub_flutter/common/services/notification_service.dar
import 'package:school_data_hub_flutter/core/env/env_manager.dart';
import 'package:school_data_hub_flutter/core/session/hub_session_manager.dart';
import 'package:school_data_hub_flutter/features/learning/data/competence_check_api_service.dart';
import 'package:school_data_hub_flutter/features/learning/data/competence_goal_api_service.dart';
import 'package:school_data_hub_flutter/features/learning/domain/competence_helper.dart';
import 'package:school_data_hub_flutter/features/learning/domain/filters/competence_filter_manager.dart';
import 'package:school_data_hub_flutter/features/pupil/domain/pupil_proxy_manager.dart';
Expand All @@ -23,7 +24,7 @@ class CompetenceManager {
final _notificationService = di<NotificationService>();

final _competenceCheckApiService = CompetenceCheckApiService();

final _competenceGoalApiService = CompetenceGoalApiService();
final _competences = ValueNotifier<List<Competence>>([]);
ValueListenable<List<Competence>> get competences => _competences;

Expand Down Expand Up @@ -289,12 +290,20 @@ class CompetenceManager {
required List<String> strategies,
}) async {
// TODO: Implement backend call when available
// Currently there is no endpoint for posting a competence goal
// We would need something like _client.competence.postCompetenceGoal(...)
final pupilData = await _competenceGoalApiService.postCompetenceGoal(
pupilId: pupilId,
competenceId: competenceId,
description: description,
strategies: strategies,
);
if (pupilData == null) {
return;
}
di<PupilProxyManager>().updatePupilProxyWithPupilData(pupilData);

_notificationService.showSnackBar(
NotificationType.warning,
'Speichern nicht möglich: Backend-Endpunkt fehlt (CompetenceGoal)',
NotificationType.success,
'Lernziel erstellt',
);

return;
Expand Down
Loading