More than a year ago I posted an article about how to change the default view in an associated view. The most common requirement was changing the history view to display all records instead of the last 30 days, which still is the default in CRM 4.0. I haven't had time to update the code yet and the good thing is that I don't even have to. Jonathan Briggs from SoftArtisans sent me the complete solution for CRM 4.0 and it's an even better solution than the old 3.0 implementation, because it only loads the view when selecting the history view, instead of doing it while loading the form.
The basic setup hasn't changed that much, so you can still use
the previous article for a detailed explanation of the code and instead of
repeating everything, I simply post Jonathan's code:
/**************************************************************
* Change the default view of a view selection combo box
**************************************************************/
SetDefaultView = function(viewCombo,
viewName, appGrid) {
/* If the view has already been set, we
don't need to do it again. */
if (viewCombo.value != viewName)
{
/* Set the new
view */
viewCombo.value = viewName;
/* Call
RefreshGridView to run the code in the DHTML control.
* Without this call, only the
selection in the combo box changes,
* but not the content of the
grid */
appGrid.RefreshGridView();
}
}
/**************************************************************
* Event handler. Called whenever the ready state of the
* areaActivityHistoryFrame changes.
**************************************************************/
areaActivityHistoryFrame_OnReadyStateChange =
function() {
/* Waiting until the frame has finished
loading */
if (this.readyState ==
"complete") {
/* This is the
frame we're interested in */
var
frame = document.frames("areaActivityHistoryFrame");
/* And this is
the view combo box */
var
viewCombo = frame.document.getElementById("actualend");
/* This is the
AppGridFilterContainer control we need to refresh the view */
var
appGrid = frame.document.getElementById("AppGridFilterContainer");
/* The view
combo box uses a style sheet that references a HTML
* control. We have to wait
until the htc file is loaded,
* otherwise the call to
FireOnChange in the SetDefaultView
* method will fail. */
if
(viewCombo.readyState == "complete") {
/* If the control already has finished loading, we can
*
directly set the new view. */
SetDefaultView(viewCombo, "All", appGrid);
}
else {
/* Otherwise we have to register another event handler
* waiting
until all of the include files used by the
* combo box
are loaded as well. */
viewCombo.onreadystatechange = function() {
if (this.readyState ==
"complete") {
SetDefaultView(this, "All", appGrid);
}
}
}
}
}
/* Set a new onclick event for the History navigation
element
* This is where we register the onreadystatechange event handler */
if (document.getElementById('navActivityHistory')
!= null) {
document.getElementById('navActivityHistory').onclick
= function() {
loadArea('areaActivityHistory');
document.frames('areaActivityHistoryFrame').document.onreadystatechange
= areaActivityHistoryFrame_OnReadyStateChange;
}
}
I tested the implementation and it worked like a charm. Thanks Jonathan for sharing this.