Skip to content

Commit d6dc9fc

Browse files
authored
[CLX-3200][Horizon] ModuleItemSequence screen notebook changes (#3369)
refs: CLX-3200 affects: Horizon release note: none
1 parent 01d9af0 commit d6dc9fc

File tree

19 files changed

+175
-339
lines changed

19 files changed

+175
-339
lines changed

libs/horizon/src/androidTest/java/com/instructure/horizon/espresso/TestModule.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,4 +298,9 @@ object HorizonTestModule {
298298
fun provideToDoViewModelBehavior(): com.instructure.pandautils.features.calendartodo.details.ToDoViewModelBehavior {
299299
throw NotImplementedError("This is a test module. Implementation not required.")
300300
}
301+
302+
@Provides
303+
fun provideToDoListRouter(): com.instructure.pandautils.features.todolist.ToDoListRouter {
304+
throw NotImplementedError("This is a test module. Implementation not required.")
305+
}
301306
}

libs/horizon/src/androidTest/java/com/instructure/horizon/ui/features/dashboard/widget/timespent/DashboardTimeSpentWidgetUiTest.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -237,26 +237,20 @@ class DashboardTimeSpentWidgetUiTest {
237237
fun testSuccessStateWithZeroHoursZeroMinutesDisplaysEmpty() {
238238
val state = DashboardTimeSpentUiState(
239239
state = DashboardItemState.SUCCESS,
240-
cardState = DashboardTimeSpentCardState(
241-
hours = 0,
242-
minutes = 0,
243-
courses = listOf(
244-
CourseOption(id = 1L, name = "Course 1")
245-
)
246-
)
240+
cardState = DashboardTimeSpentCardState()
247241
)
248242

249243
composeTestRule.setContent {
250244
DashboardTimeSpentSection(state)
251245
}
252246

253247
// Verify zero hours is not displayed
254-
composeTestRule.onNodeWithText("0").assertDoesNotExist()
248+
composeTestRule.onNodeWithText("0", useUnmergedTree = true).assertDoesNotExist()
255249

256250
// Verify single course text is not displayed
257-
composeTestRule.onNodeWithText("hours in your course").assertDoesNotExist()
251+
composeTestRule.onNodeWithText("hours", useUnmergedTree = true).assertDoesNotExist()
258252

259253
// Verify empty state message is displayed
260-
composeTestRule.onNodeWithText("This widget will update once data becomes available.").assertIsDisplayed()
254+
composeTestRule.onNodeWithText("This widget will update once data becomes available.", useUnmergedTree = true).assertIsDisplayed()
261255
}
262256
}

libs/horizon/src/main/java/com/instructure/horizon/features/learn/course/note/CourseNotesScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ fun CourseNotesScreen(
3838
val state by viewModel.uiState.collectAsState()
3939

4040
LaunchedEffect(courseId) {
41-
viewModel.updateCourseId(courseId)
41+
viewModel.updateFilters(courseId)
42+
viewModel.updateScreenState(true, false)
4243
}
4344

4445
Box(

libs/horizon/src/main/java/com/instructure/horizon/features/moduleitemsequence/ModuleItemSequenceScreen.kt

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api
4343
import androidx.compose.material3.Scaffold
4444
import androidx.compose.material3.SnackbarHost
4545
import androidx.compose.material3.SnackbarHostState
46-
import androidx.compose.material3.SnackbarResult
4746
import androidx.compose.material3.Surface
4847
import androidx.compose.material3.Text
4948
import androidx.compose.runtime.Composable
@@ -101,7 +100,7 @@ import com.instructure.horizon.features.moduleitemsequence.content.lti.ExternalT
101100
import com.instructure.horizon.features.moduleitemsequence.content.page.PageDetailsContentScreen
102101
import com.instructure.horizon.features.moduleitemsequence.content.page.PageDetailsViewModel
103102
import com.instructure.horizon.features.moduleitemsequence.progress.ProgressScreen
104-
import com.instructure.horizon.features.notebook.NotebookBottomDialog
103+
import com.instructure.horizon.features.notebook.navigation.NotebookRoute
105104
import com.instructure.horizon.horizonui.foundation.HorizonColors
106105
import com.instructure.horizon.horizonui.foundation.HorizonCornerRadius
107106
import com.instructure.horizon.horizonui.foundation.HorizonElevation
@@ -122,14 +121,12 @@ import com.instructure.horizon.horizonui.molecules.PillType
122121
import com.instructure.horizon.horizonui.molecules.Spinner
123122
import com.instructure.horizon.horizonui.molecules.SpinnerSize
124123
import com.instructure.horizon.horizonui.platform.LoadingStateWrapper
125-
import com.instructure.horizon.navigation.MainNavigationRoute
126124
import com.instructure.pandautils.compose.modifiers.conditional
127125
import com.instructure.pandautils.utils.Const
128126
import com.instructure.pandautils.utils.ThemePrefs
129127
import com.instructure.pandautils.utils.ViewStyler
130128
import com.instructure.pandautils.utils.getActivityOrNull
131129
import com.instructure.pandautils.utils.orDefault
132-
import kotlinx.coroutines.launch
133130
import kotlin.math.abs
134131

135132
@Composable
@@ -153,7 +150,18 @@ fun ModuleItemSequenceScreen(mainNavController: NavHostController, uiState: Modu
153150
onPreviousClick = uiState.onPreviousClick,
154151
onAssignmentToolsClick = uiState.onAssignmentToolsClick,
155152
onAiAssistClick = { uiState.updateShowAiAssist(true) },
156-
onNotebookClick = { uiState.updateShowNotebook(true) },
153+
onNotebookClick = {
154+
mainNavController.navigate(
155+
NotebookRoute.Notebook.route(
156+
uiState.courseId.toString(),
157+
uiState.objectTypeAndId.first,
158+
uiState.objectTypeAndId.second,
159+
true,
160+
false,
161+
true
162+
)
163+
)
164+
},
157165
notebookEnabled = uiState.notebookButtonEnabled,
158166
aiAssistEnabled = uiState.aiAssistButtonEnabled,
159167
hasUnreadComments = uiState.hasUnreadComments
@@ -166,22 +174,6 @@ fun ModuleItemSequenceScreen(mainNavController: NavHostController, uiState: Modu
166174
onDismiss = { uiState.updateShowAiAssist(false) },
167175
)
168176
}
169-
if (uiState.showNotebook) {
170-
NotebookBottomDialog(
171-
uiState.courseId,
172-
uiState.objectTypeAndId,
173-
{ snackbarMessage, onDismiss ->
174-
scope.launch {
175-
if (snackbarMessage != null) {
176-
val result = snackbarHostState.showSnackbar(snackbarMessage)
177-
if (result == SnackbarResult.Dismissed) {
178-
onDismiss()
179-
}
180-
}
181-
} },
182-
{ uiState.updateShowNotebook(false) }
183-
)
184-
}
185177
ModuleItemSequenceContent(uiState = uiState, mainNavController = mainNavController, onBackPressed = {
186178
mainNavController.popBackStack()
187179
})
@@ -646,7 +638,6 @@ private fun ModuleItemSequenceScreenPreview() {
646638
moduleItemContent = ModuleItemContent.Assignment(courseId = 1, assignmentId = 1L)
647639
),
648640
updateShowAiAssist = {},
649-
updateShowNotebook = {},
650641
)
651642
)
652643
}

libs/horizon/src/main/java/com/instructure/horizon/features/moduleitemsequence/ModuleItemSequenceUiState.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@ data class ModuleItemSequenceUiState(
3636
val assignmentToolsOpened: () -> Unit = {},
3737
val showAiAssist: Boolean = false,
3838
val aiAssistButtonEnabled: Boolean = false,
39-
val showNotebook: Boolean = false,
4039
val notebookButtonEnabled: Boolean = false,
4140
val updateShowAiAssist: (Boolean) -> Unit,
42-
val updateShowNotebook: (Boolean) -> Unit,
4341
val objectTypeAndId: Pair<String, String> = Pair("", ""),
4442
val updateObjectTypeAndId: (Pair<String, String>) -> Unit = {},
4543
val hasUnreadComments: Boolean = false,

libs/horizon/src/main/java/com/instructure/horizon/features/moduleitemsequence/ModuleItemSequenceViewModel.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ class ModuleItemSequenceViewModel @Inject constructor(
8585
onAssignmentToolsClick = ::onAssignmentToolsClicked,
8686
assignmentToolsOpened = ::assignmentToolsOpened,
8787
updateShowAiAssist = ::updateShowAiAssist,
88-
updateShowNotebook = ::updateShowNotebook,
8988
updateObjectTypeAndId = ::updateNotebookObjectTypeAndId,
9089
updateAiAssistContext = ::updateAiAssistContext,
9190
)
@@ -550,10 +549,6 @@ class ModuleItemSequenceViewModel @Inject constructor(
550549
_uiState.update { it.copy(showAiAssist = show) }
551550
}
552551

553-
private fun updateShowNotebook(show: Boolean) {
554-
_uiState.update { it.copy(showNotebook = show) }
555-
}
556-
557552
private fun updateNotebookObjectTypeAndId(objectTypeAndId: Pair<String, String>) {
558553
_uiState.update {
559554
it.copy(

libs/horizon/src/main/java/com/instructure/horizon/features/moduleitemsequence/content/page/PageDetailsContentScreen.kt

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ import androidx.compose.ui.draw.clip
3030
import androidx.compose.ui.platform.LocalContext
3131
import androidx.compose.ui.unit.dp
3232
import androidx.navigation.NavHostController
33-
import com.instructure.canvasapi2.managers.graphql.horizon.redwood.NoteHighlightedData
34-
import com.instructure.canvasapi2.managers.graphql.horizon.redwood.NoteHighlightedDataRange
35-
import com.instructure.canvasapi2.managers.graphql.horizon.redwood.NoteHighlightedDataTextPosition
3633
import com.instructure.horizon.features.aiassistant.common.model.AiAssistContextSource
3734
import com.instructure.horizon.features.notebook.common.webview.ComposeNotesHighlightingCanvasWebView
3835
import com.instructure.horizon.features.notebook.common.webview.NotesCallback
@@ -114,40 +111,21 @@ fun PageDetailsContentScreen(
114111
)
115112
},
116113
onNoteAdded = { selectedText, noteType, startContainer, startOffset, endContainer, endOffset, textSelectionStart, textSelectionEnd ->
117-
if (noteType == null) {
118-
mainNavController.navigate(
119-
NotebookRoute.AddNotebook(
120-
courseId = uiState.courseId.toString(),
121-
objectType = "Page",
122-
objectId = uiState.pageId.toString(),
123-
highlightedTextStartOffset = startOffset,
124-
highlightedTextEndOffset = endOffset,
125-
highlightedTextStartContainer = startContainer,
126-
highlightedTextEndContainer = endContainer,
127-
highlightedText = selectedText,
128-
textSelectionStart = textSelectionStart,
129-
textSelectionEnd = textSelectionEnd,
130-
noteType = noteType
131-
)
132-
)
133-
} else {
134-
uiState.addNote(
135-
NoteHighlightedData(
136-
selectedText = selectedText,
137-
range = NoteHighlightedDataRange(
138-
startOffset = startOffset,
139-
endOffset = endOffset,
140-
startContainer = startContainer,
141-
endContainer = endContainer
142-
),
143-
textPosition = NoteHighlightedDataTextPosition(
144-
start = textSelectionStart,
145-
end = textSelectionEnd
146-
)
147-
),
148-
noteType
114+
mainNavController.navigate(
115+
NotebookRoute.AddNotebook(
116+
courseId = uiState.courseId.toString(),
117+
objectType = "Page",
118+
objectId = uiState.pageId.toString(),
119+
highlightedTextStartOffset = startOffset,
120+
highlightedTextEndOffset = endOffset,
121+
highlightedTextStartContainer = startContainer,
122+
highlightedTextEndContainer = endContainer,
123+
highlightedText = selectedText,
124+
textSelectionStart = textSelectionStart,
125+
textSelectionEnd = textSelectionEnd,
126+
noteType = noteType
149127
)
150-
}
128+
)
151129
}
152130
)
153131
)

libs/horizon/src/main/java/com/instructure/horizon/features/notebook/NotebookDialog.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.

libs/horizon/src/main/java/com/instructure/horizon/features/notebook/NotebookScreen.kt

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ import androidx.compose.foundation.lazy.rememberLazyListState
3131
import androidx.compose.material3.Scaffold
3232
import androidx.compose.material3.Text
3333
import androidx.compose.runtime.Composable
34+
import androidx.compose.runtime.LaunchedEffect
3435
import androidx.compose.ui.Alignment
3536
import androidx.compose.ui.Modifier
3637
import androidx.compose.ui.platform.LocalContext
3738
import androidx.compose.ui.res.stringResource
3839
import androidx.compose.ui.text.style.TextOverflow
3940
import androidx.compose.ui.tooling.preview.Preview
4041
import androidx.compose.ui.unit.dp
42+
import androidx.core.content.ContextCompat
4143
import androidx.navigation.NavHostController
4244
import com.instructure.canvasapi2.managers.graphql.horizon.redwood.NoteHighlightedData
4345
import com.instructure.canvasapi2.managers.graphql.horizon.redwood.NoteHighlightedDataRange
@@ -51,6 +53,7 @@ import com.instructure.horizon.features.notebook.common.composable.NotebookPill
5153
import com.instructure.horizon.features.notebook.common.composable.NotebookTypeSelect
5254
import com.instructure.horizon.features.notebook.common.model.Note
5355
import com.instructure.horizon.features.notebook.common.model.NotebookType
56+
import com.instructure.horizon.features.notebook.navigation.NotebookRoute
5457
import com.instructure.horizon.horizonui.foundation.HorizonColors
5558
import com.instructure.horizon.horizonui.foundation.HorizonCornerRadius
5659
import com.instructure.horizon.horizonui.foundation.HorizonElevation
@@ -64,16 +67,21 @@ import com.instructure.horizon.horizonui.molecules.IconButtonSize
6467
import com.instructure.horizon.horizonui.molecules.Spinner
6568
import com.instructure.horizon.navigation.MainNavigationRoute
6669
import com.instructure.pandautils.compose.modifiers.conditional
70+
import com.instructure.pandautils.utils.ViewStyler
71+
import com.instructure.pandautils.utils.getActivityOrNull
6772
import com.instructure.pandautils.utils.localisedFormat
6873
import java.util.Date
6974

7075
@Composable
7176
fun NotebookScreen(
7277
mainNavController: NavHostController,
7378
state: NotebookUiState,
74-
onDismiss: (() -> Unit)? = null,
75-
onNoteSelected: ((Note) -> Unit)? = null,
7679
) {
80+
val activity = LocalContext.current.getActivityOrNull()
81+
LaunchedEffect(Unit) {
82+
if (activity != null) ViewStyler.setStatusBarColor(activity, ContextCompat.getColor(activity, R.color.surface_pagePrimary))
83+
}
84+
7785
val scrollState = rememberLazyListState()
7886
Scaffold(
7987
containerColor = HorizonColors.Surface.pagePrimary(),
@@ -87,15 +95,6 @@ fun NotebookScreen(
8795
)
8896
}
8997
)
90-
} else if (onDismiss != null) {
91-
NotebookAppBar(
92-
onClose = { onDismiss() },
93-
modifier = Modifier.conditional(scrollState.canScrollBackward) {
94-
horizonShadow(
95-
elevation = HorizonElevation.level2,
96-
)
97-
}
98-
)
9998
}
10099
},
101100
) { padding ->
@@ -140,13 +139,30 @@ fun NotebookScreen(
140139
items(state.notes) { note ->
141140
Column {
142141
NoteContent(note) {
143-
onNoteSelected?.invoke(note) ?: mainNavController.navigate(
144-
MainNavigationRoute.ModuleItemSequence(
145-
courseId = note.courseId,
146-
moduleItemAssetType = note.objectType.value,
147-
moduleItemAssetId = note.objectId,
142+
if (state.navigateToEdit) {
143+
mainNavController.navigate(
144+
NotebookRoute.EditNotebook(
145+
noteId = note.id,
146+
highlightedTextStartOffset = note.highlightedText.range.startOffset,
147+
highlightedTextEndOffset = note.highlightedText.range.endOffset,
148+
highlightedTextStartContainer = note.highlightedText.range.startContainer,
149+
highlightedTextEndContainer = note.highlightedText.range.endContainer,
150+
textSelectionStart = note.highlightedText.textPosition.start,
151+
textSelectionEnd = note.highlightedText.textPosition.end,
152+
highlightedText = note.highlightedText.selectedText,
153+
noteType = note.type.name,
154+
userComment = note.userText
155+
)
156+
)
157+
} else {
158+
mainNavController.navigate(
159+
MainNavigationRoute.ModuleItemSequence(
160+
courseId = note.courseId,
161+
moduleItemAssetType = note.objectType.value,
162+
moduleItemAssetId = note.objectId,
163+
)
148164
)
149-
)
165+
}
150166
}
151167

152168
if (state.notes.lastOrNull() != note) {

libs/horizon/src/main/java/com/instructure/horizon/features/notebook/NotebookUiState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ data class NotebookUiState(
3131
val updateContent: (Long?, Pair<String, String>?) -> Unit,
3232
val showTopBar: Boolean = false,
3333
val showFilters: Boolean = false,
34+
val navigateToEdit: Boolean = false
3435
)

0 commit comments

Comments
 (0)