Extend Dashboard Sharing feature tour to include settings interface
See original GitHub issueFeature Description
In #5328, we added a basic feature tour for dashboard sharing which informs an authenticated admin about the added ability to share the dashboard with other users but does not elaborate on how to use it.
This issue is about extending this tour with additional steps to walk the user through the sharing settings interface and better explain how to share the dashboard and or delegate sharing management.
Do not alter or remove anything below. The following sections will be managed by moderators only.
Acceptance criteria
The feature tour for dashboard sharing should be extended as follows:
- The tour should get additional steps to walk the user through the sharing settings interface
- A second step should be added:
- Title:
Manage view access for other roles - Body:
Grant access to the view-only dashboard for each service for the specific roles you want. Users will see the Site Kit dashboard with only the services that have been shared with them without needing to sign-in with Google. - On display, the dashboard sharing settings modal should be toggled open
- Focus: “Who can view” column
- Title:
- A third step should be added but only if the site has multiple admins (otherwise this column will not be displayed/relevant)
- Title:
Share management with other admins - Body:
By default only the user who connects a service can control who it is shared with. This setting optionally lets these users allow any other admin signed in with Google to manage the roles a service is shared with. - Focus: “Who can manage” column
- Title:
- On dismiss/completion the dashboard sharing settings modal should be closed
- A second step should be added:
- If the user dismisses the feature tour on the first step (showing settings button) they should still see the remaining tour steps when viewing the sharing settings interface for the first time (i.e. on demand)
- Dismissing on step 2 or 3 should dismiss the full tour as usual
Note: these could technically be separate tours with shared steps, etc – it is not strictly required that everything is defined in a single tour.
Implementation Brief
- Update
DashboardSharingSettingsButtonto use theCORE_UIstore for thedialogOpenstate (e.g.dashboardSharingDialogOpen) - Update
_googlesitekitDashboardSharingDatato include the value ofhasMultipleAdminsfromHas_Multiple_Admins - Define a new
dashboardSharingSettingsfeature tour- The first step should be defined as the “second” step in the ACs
- The
targetshould use.googlesitekit-dashboard-sharing-settings__main .googlesitekit-dashboard-sharing-settings__column--viewto highlight the first row’s user role select control
- The
- If
_googlesitekitDashboardSharingData.hasMultipleAdminsis true, the second step (corresponding to the “third” step in the ACs) should be included/appended- The
targetshould use.googlesitekit-dashboard-sharing-settings__main .googlesitekit-dashboard-sharing-settings__column--manageto highlight the first row’s sharing management control
- The
- The
contextsfor this tour should be omitted because it should not be triggered automatically by view context, but only by its inclusion in thedashboardSharingtour or on its own, on-demand
- The first step should be defined as the “second” step in the ACs
- Update the
dashboardSharingtour to import the newdashboardSharingSettingstour definition, appending its steps to its own- Define the
callbackfunction to respond to the tour events appropriately:- If transitioning to the 2nd step, set the
dashboardSharingDialogOpenstate to true - If transitioning to the 1st step, set the
dashboardSharingDialogOpenstate to false - When exiting the tour, ensure
dashboardSharingDialogOpenis set to false again - Keep track of visited tour steps, if step 2 was reached, dismiss the
dashboardSharingSettingstour when exiting the tour
- If transitioning to the 2nd step, set the
- Define the
- Update feature tour infra to work similar to user surveys
- Introduce a new
initialState.currentTourproperty, which should hold the definition of the current tour being shown - Introduce a new
selectors.getCurrentTour(no arguments) that returns thestate.currentTour - Introduce a new
actions.receiveCurrentTouraction that sets thestate.currentTour - Introduce a new
actions.triggerTourwhich takes atourobject and receives thecurrentTourif there is none currently set - Introduce a new
actions.triggerTourForView(viewContext)- If feature tours are currently on cooldown (
areFeatureToursOnCooldown), the action should return early and do nothing else - Otherwise, it should take the given
viewContextand check all the tours as we do now inresolvers.getFeatureToursForView, and dispatchtriggerTourwith the firsttourthat qualifies
- If feature tours are currently on cooldown (
- Introduce a new
actions.triggerOnDemandTour(tour)that checks the given tour’s requirements (below) before dispatchingtriggerTour(tour):- The tour should not be dismissed
- Its own
checkRequirementsfunction should returntrue - It should not be affected by tour cooldown
- Update
FeatureToursto source the tour it passes toTourTooltipsvia the newgetCurrentTourselector only- A new
onMounteffect should be used to dispatchactions.triggerTourForView(viewContext)to preserve the current behavior of invoking tours for the currentviewContext
- A new
selectors.getFeatureToursForViewand its resolver should no longer be necessary- Update
actions.dismissTourto unsetstate.currentTourif the given tour slug matches the current tour’s slug - Update
DashboardSharingSettingsButtonwith auseEffecttotriggerOnDemandTourwith thedashboardSharingSettingstour object when the dialog is opened- Note the
dashboardSharingtour will essentially trigger this as part of the changes here but the secondarytriggerTourwill have no effect because acurrentTourwill already be set/running
- Note the
- Introduce a new
Test Coverage
- Add tests for the new actions and selectors added to the
core/userdata store.selectors.getCurrentTouractions.receiveCurrentTouractions.triggerTour(tour)actions.triggerTourForView(viewContext)actions.triggerOnDemandTour(tour)
- Update tests for
actions.dismissTour - Remove tests for
getFeatureToursForView
QA Brief
This issue extends the existing feature tour for dashboard sharing with additional steps to cover the sharing settings.
- For a site with a single admin, the tour will have 2 steps (1 extra)
- For a site with multiple admins, the tour will have 3 steps (2 extra)
- If the user sees the main tour and dismisses it before they get to the last step, they will see a secondary feature tour when the sharing settings are opened (even if they just saw the first)
- This secondary tour will only have the extra 1-2 steps as mentioned above
- They will always see all the extra steps in this tour, not just the ones they didn’t see from the first
- It is possible for a user to see a different tour before the main DS tour (enabling the cooldown) and then trigger the on-demand DS settings tour without seeing the first as it is currently. This is probably an edge case we don’t need to worry about too much but also could be addressed if we want to with out a large additional effort
Changelog entry
- Extend the Dashboard Sharing feature tour to include steps for the settings interface.
Issue Analytics
- State:
- Created a year ago
- Comments:17 (1 by maintainers)

Top Related StackOverflow Question
Just a note regarding the background colour of the feature tour, I have added a comment here https://github.com/google/site-kit-wp/issues/5254#issuecomment-1178703818 for @aaemnnosttv to kindly review and add today please.
@tofumatt, I was thinking we might want to be able to use a given tour on load (as it is now) or on-demand in some cases. The current tour requirements check requires
tour.contextsbut I think this shouldn’t be needed given the approach outlined here checks the requirements separately for an on-demand tour. I think the additionYes I thought about that as well, but I think such a property shouldn’t be necessary as on-demand tours are checked differently as defined.
The idea is that in the user’s experience, it’s only one tour so long as they see both parts. Implemented as separate tours that are triggered seamlessly, the experience is unintuitive because you’d first see a tour with one step and then immediately see a second tour with one or two steps. This way, the user sees (and interacts with) the first tour as a more comprehensive tour from the beginning, and is able to navigate back and forth to/from any step until it is dismissed (like others). As separate tours, they’d be stuck in the second, unable to go back to the first once triggered. This is also why the ACs call for a second and conditional third step to be added to the first tour rather than simply triggering a separate tour immediately after dismissing the first.
That’s why the first is more of a composite tour – we only show the settings part of it on demand if they don’t reach that part of the tour in the first.
The current IB is a bit different and came out of conversations I had with @jimmymadon last week, but he didn’t have time to update it before he left which is why I’ve taken over here 😄
I’ve updated the IB to remove the special
ON_DEMANDcontext, but the rest should be good to go I think. Let me know if you have any other questions 👍