implemented Ticker page selection persistence and enhanced ProseMirror table display modes

This commit is contained in:
2026-07-10 19:15:52 +02:00
parent 0d01f6b631
commit 37608e59b3
10 changed files with 827 additions and 131 deletions
@@ -6,13 +6,19 @@ import '../../../../../api/marianumconnect/queries/get_ticker_nav/get_ticker_nav
part 'ticker_state.freezed.dart';
part 'ticker_state.g.dart';
/// Hydrated ticker module state: the current "Aktuelles" post plus the filtered
/// page tree. Page contents are loaded on demand in the detail screen and are
/// deliberately not cached here.
/// Hydrated ticker module state: the current "Aktuelles" post, the filtered
/// page tree and the slug of the page the user last had open ([selectedSlug],
/// null = "Aktuelles" home). Persisting the slug lets the ticker reopen on the
/// last page instead of always falling back to home; a slug that is no longer
/// in [nav] (deleted/hidden) is discarded by the view. Page contents are loaded
/// on demand in the detail screen and are deliberately not cached here.
@freezed
abstract class TickerState with _$TickerState {
const factory TickerState({TickerResponse? ticker, TickerNavResponse? nav}) =
_TickerState;
const factory TickerState({
TickerResponse? ticker,
TickerNavResponse? nav,
String? selectedSlug,
}) = _TickerState;
factory TickerState.fromJson(Map<String, dynamic> json) =>
_$TickerStateFromJson(json);
@@ -15,7 +15,7 @@ T _$identity<T>(T value) => value;
/// @nodoc
mixin _$TickerState {
TickerResponse? get ticker; TickerNavResponse? get nav;
TickerResponse? get ticker; TickerNavResponse? get nav; String? get selectedSlug;
/// Create a copy of TickerState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@@ -28,16 +28,16 @@ $TickerStateCopyWith<TickerState> get copyWith => _$TickerStateCopyWithImpl<Tick
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is TickerState&&(identical(other.ticker, ticker) || other.ticker == ticker)&&(identical(other.nav, nav) || other.nav == nav));
return identical(this, other) || (other.runtimeType == runtimeType&&other is TickerState&&(identical(other.ticker, ticker) || other.ticker == ticker)&&(identical(other.nav, nav) || other.nav == nav)&&(identical(other.selectedSlug, selectedSlug) || other.selectedSlug == selectedSlug));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,ticker,nav);
int get hashCode => Object.hash(runtimeType,ticker,nav,selectedSlug);
@override
String toString() {
return 'TickerState(ticker: $ticker, nav: $nav)';
return 'TickerState(ticker: $ticker, nav: $nav, selectedSlug: $selectedSlug)';
}
@@ -48,7 +48,7 @@ abstract mixin class $TickerStateCopyWith<$Res> {
factory $TickerStateCopyWith(TickerState value, $Res Function(TickerState) _then) = _$TickerStateCopyWithImpl;
@useResult
$Res call({
TickerResponse? ticker, TickerNavResponse? nav
TickerResponse? ticker, TickerNavResponse? nav, String? selectedSlug
});
@@ -65,11 +65,12 @@ class _$TickerStateCopyWithImpl<$Res>
/// Create a copy of TickerState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? ticker = freezed,Object? nav = freezed,}) {
@pragma('vm:prefer-inline') @override $Res call({Object? ticker = freezed,Object? nav = freezed,Object? selectedSlug = freezed,}) {
return _then(_self.copyWith(
ticker: freezed == ticker ? _self.ticker : ticker // ignore: cast_nullable_to_non_nullable
as TickerResponse?,nav: freezed == nav ? _self.nav : nav // ignore: cast_nullable_to_non_nullable
as TickerNavResponse?,
as TickerNavResponse?,selectedSlug: freezed == selectedSlug ? _self.selectedSlug : selectedSlug // ignore: cast_nullable_to_non_nullable
as String?,
));
}
@@ -154,10 +155,10 @@ return $default(_that);case _:
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( TickerResponse? ticker, TickerNavResponse? nav)? $default,{required TResult orElse(),}) {final _that = this;
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( TickerResponse? ticker, TickerNavResponse? nav, String? selectedSlug)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _TickerState() when $default != null:
return $default(_that.ticker,_that.nav);case _:
return $default(_that.ticker,_that.nav,_that.selectedSlug);case _:
return orElse();
}
@@ -175,10 +176,10 @@ return $default(_that.ticker,_that.nav);case _:
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( TickerResponse? ticker, TickerNavResponse? nav) $default,) {final _that = this;
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( TickerResponse? ticker, TickerNavResponse? nav, String? selectedSlug) $default,) {final _that = this;
switch (_that) {
case _TickerState():
return $default(_that.ticker,_that.nav);case _:
return $default(_that.ticker,_that.nav,_that.selectedSlug);case _:
throw StateError('Unexpected subclass');
}
@@ -195,10 +196,10 @@ return $default(_that.ticker,_that.nav);case _:
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( TickerResponse? ticker, TickerNavResponse? nav)? $default,) {final _that = this;
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( TickerResponse? ticker, TickerNavResponse? nav, String? selectedSlug)? $default,) {final _that = this;
switch (_that) {
case _TickerState() when $default != null:
return $default(_that.ticker,_that.nav);case _:
return $default(_that.ticker,_that.nav,_that.selectedSlug);case _:
return null;
}
@@ -210,11 +211,12 @@ return $default(_that.ticker,_that.nav);case _:
@JsonSerializable()
class _TickerState implements TickerState {
const _TickerState({this.ticker, this.nav});
const _TickerState({this.ticker, this.nav, this.selectedSlug});
factory _TickerState.fromJson(Map<String, dynamic> json) => _$TickerStateFromJson(json);
@override final TickerResponse? ticker;
@override final TickerNavResponse? nav;
@override final String? selectedSlug;
/// Create a copy of TickerState
/// with the given fields replaced by the non-null parameter values.
@@ -229,16 +231,16 @@ Map<String, dynamic> toJson() {
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TickerState&&(identical(other.ticker, ticker) || other.ticker == ticker)&&(identical(other.nav, nav) || other.nav == nav));
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TickerState&&(identical(other.ticker, ticker) || other.ticker == ticker)&&(identical(other.nav, nav) || other.nav == nav)&&(identical(other.selectedSlug, selectedSlug) || other.selectedSlug == selectedSlug));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,ticker,nav);
int get hashCode => Object.hash(runtimeType,ticker,nav,selectedSlug);
@override
String toString() {
return 'TickerState(ticker: $ticker, nav: $nav)';
return 'TickerState(ticker: $ticker, nav: $nav, selectedSlug: $selectedSlug)';
}
@@ -249,7 +251,7 @@ abstract mixin class _$TickerStateCopyWith<$Res> implements $TickerStateCopyWith
factory _$TickerStateCopyWith(_TickerState value, $Res Function(_TickerState) _then) = __$TickerStateCopyWithImpl;
@override @useResult
$Res call({
TickerResponse? ticker, TickerNavResponse? nav
TickerResponse? ticker, TickerNavResponse? nav, String? selectedSlug
});
@@ -266,11 +268,12 @@ class __$TickerStateCopyWithImpl<$Res>
/// Create a copy of TickerState
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? ticker = freezed,Object? nav = freezed,}) {
@override @pragma('vm:prefer-inline') $Res call({Object? ticker = freezed,Object? nav = freezed,Object? selectedSlug = freezed,}) {
return _then(_TickerState(
ticker: freezed == ticker ? _self.ticker : ticker // ignore: cast_nullable_to_non_nullable
as TickerResponse?,nav: freezed == nav ? _self.nav : nav // ignore: cast_nullable_to_non_nullable
as TickerNavResponse?,
as TickerNavResponse?,selectedSlug: freezed == selectedSlug ? _self.selectedSlug : selectedSlug // ignore: cast_nullable_to_non_nullable
as String?,
));
}
@@ -13,7 +13,12 @@ _TickerState _$TickerStateFromJson(Map<String, dynamic> json) => _TickerState(
nav: json['nav'] == null
? null
: TickerNavResponse.fromJson(json['nav'] as Map<String, dynamic>),
selectedSlug: json['selectedSlug'] as String?,
);
Map<String, dynamic> _$TickerStateToJson(_TickerState instance) =>
<String, dynamic>{'ticker': instance.ticker, 'nav': instance.nav};
<String, dynamic>{
'ticker': instance.ticker,
'nav': instance.nav,
'selectedSlug': instance.selectedSlug,
};