fix error with browser view and levels
This commit is contained in:
@@ -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,
|
||||
),
|
||||
) ??
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
_loadDecks();
|
||||
}
|
||||
|
||||
setState(() {});
|
||||
if (pageController.hasClients) {
|
||||
pageController.jumpToPage(currentPageIndex);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
Reference in New Issue
Block a user