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