fix error with browser view and levels

This commit is contained in:
Rene Kievits
2025-11-02 19:53:10 +01:00
parent 5f1b9ba12e
commit 14ad880f79

View File

@@ -173,11 +173,22 @@ class _BrowseScreenState extends State<BrowseScreen>
itemBuilder: (context, index) {
final level = sortedLevels[index];
final levelItems = groupedItems[level]!;
final bool isDisabled = levelItems.every(
(item) => (item as dynamic).srsItems.values.every(
(srs) => (srs as SrsItem).disabled,
),
);
final bool isDisabled;
if (repository is DeckRepository) {
isDisabled = levelItems.every(
(item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every(
(srs) => srs.disabled,
),
);
} else if (repository is VocabDeckRepository) {
isDisabled = levelItems.every(
(item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every(
(srs) => srs.disabled,
),
);
} else {
isDisabled = false; // Default to false if repository type is unknown
}
return Column(
children: [
@@ -197,7 +208,7 @@ class _BrowseScreenState extends State<BrowseScreen>
Checkbox(
value: !isDisabled,
onChanged: (value) {
_toggleLevelExclusion(level, repository);
_toggleLevelExclusion(level, repository, index, pageController);
},
),
],
@@ -227,13 +238,20 @@ class _BrowseScreenState extends State<BrowseScreen>
final level = levels[index];
final isSelected = index == currentPage;
final items = isKanji ? _kanjiByLevel[level] : _vocabByLevel[level];
final bool isDisabled =
items?.every(
(item) => (item as dynamic).srsItems.values.every(
(srs) => (srs as SrsItem).disabled,
),
) ??
false;
final bool isDisabled;
if (isKanji) {
isDisabled = items?.every(
(item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every(
(srs) => srs.disabled,
), ) ??
false;
} else {
isDisabled = items?.every(
(item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every(
(srs) => srs.disabled,
), ) ??
false;
}
return Expanded(
child: Padding(
@@ -636,14 +654,20 @@ class _BrowseScreenState extends State<BrowseScreen>
_vocabSortedLevels = _vocabByLevel.keys.toList()..sort();
}
Future<void> _toggleLevelExclusion(int level, dynamic repository) async {
Future<void> _toggleLevelExclusion(
int level,
dynamic repository,
int currentPageIndex,
PageController pageController,
) async {
final List<SrsItem> itemsToUpdate = [];
final bool currentlyDisabled;
List<dynamic> items = [];
bool currentlyDisabled = false;
if (repository is DeckRepository) {
final items = _kanjiByLevel[level] ?? [];
items = _kanjiByLevel[level] ?? [];
currentlyDisabled = items.every(
(item) => item.srsItems.values.every((srs) => srs.disabled),
(item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every((srs) => srs.disabled),
);
for (final item in items) {
for (final srsItem in item.srsItems.values) {
@@ -651,9 +675,9 @@ class _BrowseScreenState extends State<BrowseScreen>
}
}
} else if (repository is VocabDeckRepository) {
final items = _vocabByLevel[level] ?? [];
items = _vocabByLevel[level] ?? [];
currentlyDisabled = items.every(
(item) => item.srsItems.values.every((srs) => srs.disabled),
(item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every((srs) => srs.disabled),
);
for (final item in items) {
for (final srsItem in item.srsItems.values) {
@@ -664,12 +688,70 @@ class _BrowseScreenState extends State<BrowseScreen>
return;
}
for (final item in itemsToUpdate) {
item.disabled = !currentlyDisabled;
if (itemsToUpdate.isEmpty) {
// No SrsItems exist for this level, so create them and set their disabled status
for (final item in items) { // 'items' contains KanjiItem or VocabularyItem
// Determine quiz modes based on repository type
List<QuizMode> quizModes = [];
if (repository is DeckRepository) {
quizModes = [QuizMode.kanjiToEnglish, QuizMode.englishToKanji, QuizMode.reading];
} else if (repository is VocabDeckRepository) {
quizModes = [QuizMode.vocabToEnglish, QuizMode.englishToVocab, QuizMode.audioToEnglish];
}
for (final mode in quizModes) {
String? readingType;
if (mode == QuizMode.reading && repository is DeckRepository) {
// For reading mode, create SrsItems for both onyomi and kunyomi if they exist
if ((item as KanjiItem).onyomi.isNotEmpty) {
readingType = 'onyomi';
itemsToUpdate.add(SrsItem(
subjectId: item.id,
quizMode: mode,
readingType: readingType,
disabled: !currentlyDisabled,
));
}
if ((item as KanjiItem).kunyomi.isNotEmpty) {
readingType = 'kunyomi';
itemsToUpdate.add(SrsItem(
subjectId: item.id,
quizMode: mode,
readingType: readingType,
disabled: !currentlyDisabled,
));
}
} else {
itemsToUpdate.add(SrsItem(
subjectId: item.id,
quizMode: mode,
disabled: !currentlyDisabled,
));
}
}
}
// Now insert these newly created SrsItems
if (repository is DeckRepository) {
for (final srsItem in itemsToUpdate) {
await (repository as DeckRepository).insertSrsItem(srsItem);
}
} else if (repository is VocabDeckRepository) {
for (final srsItem in itemsToUpdate) {
await (repository as VocabDeckRepository).insertVocabSrsItem(srsItem);
}
}
} else {
// Existing SrsItems, so update them
for (final item in itemsToUpdate) {
item.disabled = !currentlyDisabled;
}
await repository.updateSrsItems(itemsToUpdate);
}
await repository.updateSrsItems(itemsToUpdate);
_loadDecks();
setState(() {});
if (pageController.hasClients) {
pageController.jumpToPage(currentPageIndex);
}
}
@override