And yes, I know its possible to run a custom report on dashboards and specify filter criteria to check the running user, but that seems a little clunky and requires too many clicks for my liking.
The next option I considered was a before delete trigger on the User object that would block the deactivation if the user was a dashboard running user. I've never been keen on these sorts of triggers as I don't think its the greatest experience - you complete all the work and then at the last minute the platform bounces the request. Plus if a user needs to be deactivated quickly and is the running user for a number of dashboards, a trigger would slow the process down.
What I really wanted was a way to check if there were going to be problems before I deactivate.
The first part to the solution was to create a Visualforce page to display any dashboards that would be affected. Its a pretty straightforward page to display either a message that the user isn't a dashboard running user, or to list the affected dashboards:
<apex:page extensions="UserDashboardController" standardcontroller="User">
<apex:pageblock title="User Dashboard Information">
<apex:outputpanel rendered="{!NOT(UserNoDashboards)}">
<apex:outputtext>
User {!User.username} is the running user for the following dashboards:
</apex:outputtext>
<apex:pageblocktable value="{!userDashboards}" var="db">
<apex:column headervalue="Dashboard">
<apex:outputlink target="_blank" value="/{!db.id}">{!db.title}</apex:outputlink>
</apex:column>
</apex:pageblocktable>
</apex:outputpanel>
<apex:outputpanel rendered="{!userNoDashboards}">
User {!User.username} is not a running user of any dashboards.
</apex:outputpanel>
</apex:pageblock>
</apex:page>
The page is backed by the User standard controller and an extension controller that adds a couple of methods for retrieving dashboard information:
public class UserDashboardController
{
User theUser;
public UserDashboardController(ApexPages.StandardController std)
{
theUser=(User) std.getRecord();
}
public List<Dashboard> getUserDashboards()
{
List<Dashboard> dbs=[select id, Title from Dashboard
where Type='SpecifiedUser'
and RunningUserId=:theUser.id];
return dbs;
}
public Boolean getUserNoDashboards()
{
return getUserDashboards().isEmpty();
}
}
Accessing the page with the id of the user I'm considering deactivating shows that they are the running user for one dashboard:
Unfortunately, Visualforce pages can't be embedded into User page layouts, so I need another mechanism to gain access to the Visualforce page. The solution is to create a custom link (Setup -> Customize -> Users -> Custom Links) that opens the Visualforce page in a new window. The configuration for my Custom Link is shown below:
I can then add this custom link to my User page layout and the next time I'm considering deactivating a user, I simply navigate to the user's detail record, click the link and the details appear in a popup window.
It would be quite simple to extend this to output other information pertinent to deactivating a user - the accounts that the user is the owner of for example.
No comments:
Post a Comment