Skip to content

Commit 88806ac

Browse files
hermannakosclaude
andcommitted
Add Pendo tags to all dashboard widget interactive elements
Add pendoTag modifiers to clickable elements across all dashboard widgets (Courses, Todo, Forecast, Conferences, Course Invitations, Institutional Announcements, Progress) to enable widget retention tracking via Pendo analytics. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 903e4c2 commit 88806ac

13 files changed

Lines changed: 57 additions & 16 deletions

File tree

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/conferences/ConferencesWidget.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import com.instructure.canvasapi2.utils.ContextKeeper
6363
import com.instructure.pandautils.R
6464
import com.instructure.pandautils.compose.composables.PagerIndicator
6565
import kotlinx.coroutines.flow.SharedFlow
66+
import sdk.pendo.io.pendoTag
6667

6768
@Composable
6869
fun ConferencesWidget(
@@ -180,6 +181,7 @@ private fun ConferenceCard(
180181
Card(
181182
modifier = modifier
182183
.fillMaxWidth()
184+
.pendoTag("conferencesWidget_joinConference", true)
183185
.clickable(enabled = !isJoining, onClick = onJoin),
184186
shape = RoundedCornerShape(16.dp),
185187
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp),
@@ -246,7 +248,7 @@ private fun ConferenceCard(
246248
} else {
247249
IconButton(
248250
onClick = onDismiss,
249-
modifier = Modifier.padding(end = 4.dp)
251+
modifier = Modifier.padding(end = 4.dp).pendoTag("conferencesWidget_dismissConference", true)
250252
) {
251253
Icon(
252254
painter = painterResource(R.drawable.ic_close),

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/courseinvitation/CourseInvitationsWidget.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import com.instructure.pandautils.R
6262
import com.instructure.pandautils.compose.composables.PagerIndicator
6363
import com.instructure.pandautils.domain.models.enrollment.CourseInvitation
6464
import kotlinx.coroutines.flow.SharedFlow
65+
import sdk.pendo.io.pendoTag
6566

6667
@OptIn(ExperimentalFoundationApi::class)
6768
@Composable
@@ -200,7 +201,8 @@ fun CourseInvitationsContent(
200201
onClick = {
201202
uiState.onDeclineInvitation(invitation)
202203
invitationToDecline = null
203-
}
204+
},
205+
modifier = Modifier.pendoTag("courseInvitationsWidget_confirmDeclineButton", true)
204206
) {
205207
Text(
206208
text = stringResource(R.string.declineCourseInvitation),
@@ -209,7 +211,7 @@ fun CourseInvitationsContent(
209211
}
210212
},
211213
dismissButton = {
212-
TextButton(onClick = { invitationToDecline = null }) {
214+
TextButton(onClick = { invitationToDecline = null }, modifier = Modifier.pendoTag("courseInvitationsWidget_cancelDeclineButton", true)) {
213215
Text(
214216
text = stringResource(android.R.string.cancel),
215217
color = colorResource(R.color.textDark)
@@ -267,7 +269,8 @@ private fun InvitationCard(
267269
enabled = actionsEnabled,
268270
modifier = Modifier
269271
.weight(1f)
270-
.height(32.dp),
272+
.height(32.dp)
273+
.pendoTag("courseInvitationsWidget_declineButton", true),
271274
shape = RoundedCornerShape(100.dp),
272275
colors = ButtonDefaults.outlinedButtonColors(
273276
containerColor = colorResource(R.color.backgroundLightest),
@@ -295,7 +298,8 @@ private fun InvitationCard(
295298
enabled = actionsEnabled,
296299
modifier = Modifier
297300
.weight(1f)
298-
.height(32.dp),
301+
.height(32.dp)
302+
.pendoTag("courseInvitationsWidget_acceptButton", true),
299303
shape = RoundedCornerShape(100.dp),
300304
colors = ButtonDefaults.buttonColors(
301305
containerColor = buttonColor,

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/courses/CollapsibleSection.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import androidx.compose.ui.tooling.preview.Preview
4343
import androidx.compose.ui.unit.dp
4444
import androidx.compose.ui.unit.sp
4545
import com.instructure.pandautils.R
46+
import sdk.pendo.io.pendoTag
4647

4748
@Composable
4849
fun CollapsibleSection(
@@ -57,6 +58,7 @@ fun CollapsibleSection(
5758
Row(
5859
modifier = Modifier
5960
.fillMaxWidth()
61+
.pendoTag("coursesWidget_collapsibleSection", true)
6062
.clickable { onToggleExpanded() }
6163
.padding(horizontal = 16.dp, vertical = 12.dp),
6264
horizontalArrangement = Arrangement.SpaceBetween,

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/courses/CourseCard.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ import com.instructure.pandautils.features.dashboard.widget.courses.model.GradeD
7575
import com.instructure.pandautils.utils.ThemedColor
7676
import com.instructure.pandautils.utils.color
7777
import com.instructure.pandautils.utils.getFragmentActivityOrNull
78+
import sdk.pendo.io.pendoTag
7879

7980
internal val COURSE_CARD_HEIGHT = 76.dp
8081

@@ -119,6 +120,7 @@ fun CourseCard(
119120
.fillMaxWidth()
120121
.height(COURSE_CARD_HEIGHT)
121122
.alpha(if (courseCard.isClickable) 1f else 0.5f)
123+
.pendoTag("coursesWidget_courseCard", true)
122124
.clickable(enabled = courseCard.isClickable) { activity?.let { onCourseClick(it, courseCard.id) } },
123125
verticalAlignment = Alignment.CenterVertically
124126
) {
@@ -157,6 +159,7 @@ fun CourseCard(
157159
Box(
158160
modifier = Modifier
159161
.size(24.dp)
162+
.pendoTag("coursesWidget_courseCardMenu", true)
160163
.clickable(onClick = openMenuClick)
161164
.background(
162165
color = colorResource(R.color.backgroundLightest),
@@ -189,7 +192,8 @@ fun CourseCard(
189192
onClick = {
190193
showMenu = false
191194
activity?.let { onManageOfflineContent.invoke(it, courseCard.id) }
192-
}
195+
},
196+
modifier = Modifier.pendoTag("coursesWidget_manageOfflineContent", true)
193197
)
194198
DropdownMenuItem(
195199
text = {
@@ -202,7 +206,8 @@ fun CourseCard(
202206
onClick = {
203207
showMenu = false
204208
activity?.let { onCustomizeCourse.invoke(it, courseCard.id) }
205-
}
209+
},
210+
modifier = Modifier.pendoTag("coursesWidget_customizeCourse", true)
206211
)
207212
}
208213
}
@@ -248,6 +253,7 @@ fun CourseCard(
248253
modifier = Modifier
249254
.clip(CircleShape)
250255
.size(48.dp)
256+
.pendoTag("coursesWidget_announcementBell", true)
251257
.clickable(enabled = courseCard.isClickable) {
252258
activity?.let {
253259
onAnnouncementClick?.invoke(

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/courses/CoursesWidget.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import com.instructure.pandautils.features.dashboard.widget.courses.model.GradeD
6161
import com.instructure.pandautils.features.dashboard.widget.courses.model.GroupCardItem
6262
import com.instructure.pandautils.utils.getFragmentActivityOrNull
6363
import kotlinx.coroutines.flow.SharedFlow
64+
import sdk.pendo.io.pendoTag
6465
import sh.calvin.reorderable.ReorderableItem
6566
import sh.calvin.reorderable.rememberReorderableLazyGridState
6667

@@ -178,7 +179,7 @@ fun CoursesWidgetContent(
178179
Button(
179180
onClick = { activity?.let { uiState.onAllCourses(it) } },
180181
shape = RoundedCornerShape(24.dp),
181-
modifier = Modifier.height(30.dp),
182+
modifier = Modifier.height(30.dp).pendoTag("coursesWidget_allCoursesButton", true),
182183
contentPadding = PaddingValues(
183184
start = 12.dp,
184185
0.dp,

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/courses/GroupCard.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import com.instructure.pandautils.compose.composables.Shimmer
5959
import com.instructure.pandautils.features.dashboard.widget.courses.model.GroupCardItem
6060
import com.instructure.pandautils.utils.color
6161
import com.instructure.pandautils.utils.getFragmentActivityOrNull
62+
import sdk.pendo.io.pendoTag
6263

6364
@Composable
6465
fun GroupCard(
@@ -85,6 +86,7 @@ fun GroupCard(
8586
modifier = Modifier
8687
.fillMaxWidth()
8788
.height(76.dp)
89+
.pendoTag("coursesWidget_groupCard", true)
8890
.clickable { activity?.let { onGroupClick(it, groupCard.id) } },
8991
verticalAlignment = Alignment.CenterVertically
9092
) {
@@ -174,6 +176,7 @@ fun GroupCard(
174176
.padding(end = 16.dp)
175177
.clip(CircleShape)
176178
.size(48.dp)
179+
.pendoTag("coursesWidget_groupMessage", true)
177180
.clickable { activity?.let { onMessageClick.invoke(it, groupCard.id) } },
178181
contentAlignment = Alignment.Center
179182
) {

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/forecast/AssignmentListItem.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import com.instructure.pandautils.compose.composables.SubmissionStateLabel
5555
import com.instructure.pandautils.utils.color
5656
import com.instructure.pandautils.utils.getFragmentActivity
5757
import java.util.Date
58+
import sdk.pendo.io.pendoTag
5859

5960
@Composable
6061
fun AssignmentListItem(
@@ -68,6 +69,7 @@ fun AssignmentListItem(
6869
Row(
6970
modifier = modifier
7071
.fillMaxWidth()
72+
.pendoTag("forecastWidget_assignmentItem", true)
7173
.clickable {
7274
assignment.onClick?.invoke(context.getFragmentActivity())
7375
}

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/forecast/ForecastSegmentedControl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import androidx.compose.ui.tooling.preview.Preview
5050
import androidx.compose.ui.unit.dp
5151
import androidx.compose.ui.unit.sp
5252
import com.instructure.pandautils.R
53+
import sdk.pendo.io.pendoTag
5354

5455
@Composable
5556
fun ForecastSegmentedControl(
@@ -148,6 +149,7 @@ private fun SegmentButton(
148149
Box(
149150
modifier = modifier
150151
.fillMaxHeight()
152+
.pendoTag("forecastWidget_segmentButton", true)
151153
.clickable { onSelected(section) }
152154
.shadow(
153155
elevation = if (isSelected) 2.dp else 0.dp,

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/forecast/ForecastWidget.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import com.instructure.pandautils.compose.composables.TodayButton
6565
import kotlinx.coroutines.flow.SharedFlow
6666
import java.time.LocalDate
6767
import java.util.Date
68+
import sdk.pendo.io.pendoTag
6869

6970
@Composable
7071
fun ForecastWidget(
@@ -115,7 +116,8 @@ fun ForecastWidgetContent(
115116
title = stringResource(R.string.forecastWidget_currentWeek),
116117
onClick = uiState.onJumpToCurrentWeek,
117118
buttonColor = Color(uiState.backgroundColor.color()),
118-
textColor = colorResource(R.color.textLightest)
119+
textColor = colorResource(R.color.textLightest),
120+
modifier = Modifier.pendoTag("forecastWidget_currentWeekButton", true)
119121
)
120122
} else {
121123
Spacer(modifier = Modifier.height(24.dp))
@@ -344,6 +346,7 @@ private fun ForecastWidgetErrorState(
344346
buttonText = stringResource(R.string.retry),
345347
buttonClick = onRetry,
346348
modifier = modifier
349+
.pendoTag("forecastWidget_retryButton", true)
347350
.padding(top = 8.dp)
348351
.shadow(elevation = 2.dp, shape = RoundedCornerShape(14.dp))
349352
.background(

libs/pandautils/src/main/java/com/instructure/pandautils/features/dashboard/widget/forecast/WeekNavigationHeader.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import androidx.compose.ui.tooling.preview.Preview
3636
import androidx.compose.ui.unit.dp
3737
import androidx.compose.ui.unit.sp
3838
import com.instructure.pandautils.R
39+
import sdk.pendo.io.pendoTag
3940

4041
@Composable
4142
fun WeekNavigationHeader(
@@ -53,7 +54,7 @@ fun WeekNavigationHeader(
5354
) {
5455
IconButton(
5556
onClick = onNavigatePrevious,
56-
modifier = Modifier.size(24.dp)
57+
modifier = Modifier.size(24.dp).pendoTag("forecastWidget_previousWeek", true)
5758
) {
5859
Icon(
5960
painter = painterResource(R.drawable.ic_chevron_left),
@@ -78,7 +79,7 @@ fun WeekNavigationHeader(
7879

7980
IconButton(
8081
onClick = onNavigateNext,
81-
modifier = Modifier.size(24.dp)
82+
modifier = Modifier.size(24.dp).pendoTag("forecastWidget_nextWeek", true)
8283
) {
8384
Icon(
8485
painter = painterResource(R.drawable.ic_chevron_right),

0 commit comments

Comments
 (0)