I have VF page with an account standard controller. Also, it allows to add/edit/remove Assets related to this account. It uses the Std Account controller with an extension. Part of the page shows updated Account info (updated from updates to Assets further below in the page). Below that there is a section for editing existent assets. When I update something such as the Primary Platform (assets field) and save it, an Asset trigger fires which in turn checks whether the update can continue and if so, also performs an update on the Account to reflect this new 'Primary' manufacturer. As far as I can see in debugs, when I hit save on the asset, the trigger fires and updates the account correctly. BUT to see these values I have to reload the page, the rerender does not work and I still see the old account field value unless I do a full page refresh.
Can anyone point me as to how to rerender the account without a full page refresh???
VISUAFORCE PAGE:
<apex:page tabStyle="Account" standardController="Account" extensions="AccountTestAndAssets_MR">
<apex:sectionHeader title="Account Tests & Assets" subtitle="{!account.Name}"/>
<apex:form id="theForm">
<apex:pageBlock title="Account Tests & Assets Edit" id="theBlock" >
<apex:pageMessages id="msgs"/>
<apex:pageblockButtons >
<apex:commandButton action="{!save}" value="Save"/>
<apex:commandButton action="{!cancel}" value="Cancel"/>
</apex:pageblockButtons>
<apex:pageBlockSection title="Tests" columns="1" collapsible="false" id="theTestSection">
<apex:panelGrid columns="8" width="100%">
<apex:outputText > </apex:outputText>
<apex:outputText >Primary Manufacturer</apex:outputText>
<apex:outputText >Primary Platform</apex:outputText>
<apex:outputText >Dako</apex:outputText>
<apex:outputText >Dako Value</apex:outputText>
<apex:outputText >Competitive</apex:outputText>
<apex:outputText >Competitive Value</apex:outputText>
<apex:outputText >Total</apex:outputText>
<apex:outputText >IHC</apex:outputText>
<apex:outputText value="{!account.IHC_Primary_Manufacturer__c}" />
<apex:outputText value="{!account.IHC_Primary_Platform__c}" />
<apex:inputField value="{!account.IHC_Dako__c}" >
<apex:actionSupport event="onchange" rerender="IHC_Comp"/>
</apex:inputField>
<apex:outputText value="{!account.IHC_Dako_Value__c}"/>
<apex:outputText value="{!Acc_IHC_Competitor}" id="IHC_Comp" />
<apex:outputText value="{!account.IHC_Competitor_Value__c}"/>
<apex:inputField value="{!account.IHC_Total__c}" >
<apex:actionSupport event="onchange" rerender="IHC_Comp"/>
</apex:inputField>
</apex:panelGrid>
</apex:pageBlockSection>
<apex:pageBlockSection title="Manage Assets" columns="1" collapsible="false" id="theAddSection">
<apex:panelGrid columns="8" width="100%">
<apex:outputText styleClass="columnHeader" >Type</apex:outputText>
<apex:outputText styleClass="columnHeader">Manufacturer</apex:outputText>
<apex:outputText styleClass="columnHeader">Model Name</apex:outputText>
<apex:outputText styleClass="columnHeader">Serial Number</apex:outputText>
<apex:outputText styleClass="columnHeader">Install. Date</apex:outputText>
<apex:outputText styleClass="columnHeader">Expiry Date</apex:outputText>
<apex:outputText styleClass="columnHeader">Expiry Type</apex:outputText>
<apex:outputText styleClass="columnHeader">Primary</apex:outputText>
<apex:inputField value="{!newAsset.Account_Asset_Type__c}" />
<apex:inputField value="{!newAsset.Account_Asset_Manufacturer__c}" />
<apex:inputField value="{!newAsset.Account_Asset_Model_name__c}" />
<apex:inputField value="{!newAsset.SerialNumber}" />
<apex:inputField value="{!newAsset.InstallDate}" />
<apex:inputField value="{!newAsset.Account_Asset_Expiry_Date__c}" />
<apex:inputField value="{!newAsset.Account_Asset_Expiry_type__c}" />
<apex:inputField value="{!newAsset.Primary_Type__c}"/>
<apex:commandButton value="Add Asset / Save" action="{!addNewAsset}" reRender="theAddSection,theTestSection, msgs"/>
</apex:panelGrid>
<apex:pageBlockTable styleClass="bRelatedList" value="{!lstAssets}" var="theAsset" id="theAssetTable" >
<apex:column styleClass="actionColumn" headerValue="Action" >
<apex:commandLink value="View" styleClass="actionLink" action="{!viewAsset}" id="viewLnk" />
|
<apex:commandLink id="editLnk" value="Edit" styleClass="actionLink" action="{!editAsset}" reRender="theAddSection">
<apex:param name="objectId" value="{!theAsset.Id}"/>
</apex:commandLink>
|
<apex:commandLink id="delLnk" value="Del" styleClass="actionLink" action="{!deleteAsset}" reRender="theAddSection, theTestSection" onclick=" if(!confirm('The selected Asset will be deleted, do you want to continue? ?')){return};">
<apex:param name="objectId" value="{!theAsset.Id}"/>
</apex:commandLink>
|
</apex:column>
<apex:column headerValue="Type">
<apex:outputField value="{!theAsset.Account_Asset_Type__c}"/>
</apex:column>
<apex:column headervalue="Manufacturer">
<apex:outputField value="{!theAsset.Account_Asset_Manufacturer__c}"/>
</apex:column>
<apex:column headervalue="Model Name">
<apex:outputField value="{!theAsset.Account_Asset_Model_name__c}"/>
</apex:column>
<apex:column headervalue="Serial Number">
<apex:outputField value="{!theAsset.SerialNumber}"/>
</apex:column>
<apex:column headervalue="Install Date">
<apex:outputField value="{!theAsset.InstallDate}"/>
</apex:column>
<apex:column headervalue="Expiry Date">
<apex:outputField value="{!theAsset.Account_Asset_Expiry_Date__c}"/>
</apex:column>
<apex:column headervalue="Expiry Type">
<apex:outputField value="{!theAsset.Account_Asset_Expiry_type__c}"/>
</apex:column>
<apex:column headervalue="Primary">
<apex:outputField value="{!theAsset.Primary_Type__c}"/>
</apex:column>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
public with sharing class AccountTestAndAssets_MR {
public ApexPages.StandardController stdController;
private Account account;
public List<Asset> lstAssets {get; set;}
public Asset newAsset {get; set;}
public Boolean renderAssets {get; set;}
public Boolean renderlstAssets {get; set;}
public Integer Acc_IHC_Competitor {
get{
if(String.isNotBlank(String.valueOf(account.IHC_Total__c)) && String.isNotBlank(String.valueOf(account.IHC_Dako__c))){
return Integer.valueOf(account.IHC_Total__c - account.IHC_Dako__c);
}else {return null;}
}
set;}
public Integer Acc_ISH_Competitor {
get{
if(String.isNotBlank(String.valueOf(account.ISH_Total__c)) && String.isNotBlank(String.valueOf(account.ISH_Dako__c))){
return Integer.valueOf(account.ISH_Total__c - account.ISH_Dako__c);
}else {return null;}
}
set;}
public Integer Acc_HE_Competitor {
get{
if(String.isNotBlank(String.valueOf(account.H_E_Total__c)) && String.isNotBlank(String.valueOf(account.H_E_Dako__c))){
return Integer.valueOf(account.H_E_Total__c - account.H_E_Dako__c);
}else {return null;}
}
set;}
public Integer Acc_PhDx_Competitor {
get{
if(String.isNotBlank(String.valueOf(account.PharmDx_Total__c)) && String.isNotBlank(String.valueOf(account.PharmDx_Dako__c))){
return Integer.valueOf(account.PharmDx_Total__c - account.PharmDx_Dako__c);
}else {return null;}
}
set;}
public Integer Acc_SS_Competitor {
get{
if(String.isNotBlank(String.valueOf(account.Special_Stains_Total__c)) && String.isNotBlank(String.valueOf(account.Special_Stains_Dako__c))){
return Integer.valueOf(account.Special_Stains_Total__c- account.Special_Stains_Dako__c);
}else {return null;}
}
set;}
public AccountTestAndAssets_MR (ApexPages.StandardController controller) {
stdController = controller;
this.account = (Account)controller.getRecord();
addEmptyAsset();
lstAssets = [
SELECT id, Name, Account_Asset_Type__c, Account_Asset_Manufacturer__c, Account_Asset_Model_name__c,
InstallDate, Account_Asset_Expiry_Date__c, Account_Asset_Expiry_type__c, Status, IsCompetitorProduct,
Product2.Name, SerialNumber, UsageEndDate, Quantity, Contract_Type__c, Primary_Type__c, Staining_Type__c
FROM Asset
WHERE AccountId = :account.Id Order by Account_Asset_Type__c, CreatedDate DESC ];
renderAssets = lstAssets.size() > 0;
renderlstAssets = lstAssets.size() > 0;
}
private void addEmptyAsset() {
newAsset = new Asset();
newAsset.AccountId = account.Id;
newAsset.Account_Asset_Manufacturer__c = null;
}
public void addNewAsset() {
boolean inputError = false;
//validate correct field entries or throw errors
if (newAsset.Account_Asset_Type__c == null) {
newAsset.Account_Asset_Type__c.addError('Please select Type');
inputError = true;
return;
}
if (String.IsBlank(newAsset.Account_Asset_Manufacturer__c)) {
newAsset.Account_Asset_Manufacturer__c.addError('Please select Manufacturer');
inputError = true;
return;
}else{ //if there is a Manufacturer selected then validate if Competitor or Dako Asset and update field according
newAsset.IsCompetitorProduct =((String)newAsset.Account_Asset_Manufacturer__c).left(4)== 'Dako' ? false : true;
}
if (newAsset.Account_Asset_Model_name__c == null) {
newAsset.Account_Asset_Model_name__c.addError('Please select Model Name');
inputError = true;
return;
}
system.debug('###newAsset.Account_Asset_Type__c: ' + (newAsset.Account_Asset_Type__c == null));
if(newAsset.Account_Asset_Manufacturer__c.left(4).tolowerCase() == 'dako'){
if(newAsset.SerialNumber == null) {
newAsset.SerialNumber.addError('Serial Number is required for Dako Assets');
inputError = true;
return;
}
}
if (newAsset.InstallDate == null) {
newAsset.InstallDate.addError('Please select Install Date');
inputError = true;
return;
}
if (newAsset.Account_Asset_Expiry_Date__c == null) {
newAsset.Account_Asset_Expiry_Date__c.addError('Please select Expiry Date');
inputError = true;
return;
}
if (newAsset.Account_Asset_Expiry_type__c == null) {
newAsset.Account_Asset_Expiry_type__c.addError('Please select Expiry Type');
inputError = true;
return;
}
Boolean hasID = (newAsset.Id == null);
if (!hasID) newAsset.Name = newAsset.Account_Asset_Model_name__c;
//if input error: do not continue to upsert newAsset
if (inputError) return;
try {
upsert newAsset;
}catch(Exception e){
ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.ERROR, e.getMessage());
return;
}
//reload Account to get updated info from triggers (Tests section)
loadAccount ();
if (hasID) lstAssets.add(newAsset);
addEmptyAsset();
renderAssets = lstAssets.size() > 0;
}
public void editAsset() {
Id objectId = Id.valueOf(System.currentPagereference().getParameters().get('objectId'));
Integer rowIndex = 0;
for (Asset targetAsset: lstAssets) {
if (targetAsset.Id == objectId) {
newAsset = targetAsset;
break;
}
rowIndex++;
}
renderAssets = lstAssets.size() > 0;
}
public pageReference viewAsset() {
Id objectId = Id.valueOf(System.currentPagereference().getParameters().get('objectId'));
PageReference newref = new PageReference('/'+ objectId);
newRef.setRedirect(true);
return newRef;
}
public PageReference save() {
return stdController.save();
}
public void deleteAsset() {
Id objectId = Id.valueOf(System.currentPagereference().getParameters().get('objectId'));
Integer rowIndex = 0;
//TODO: check if primary is checked for asset if so then nullify corresponding account fields
for (Asset targetAsset: lstAssets) {
if (targetAsset.Id == objectId) {
delete targetAsset;
lstAssets.remove(rowIndex);
break;
}
rowIndex++;
}
renderlstAssets = lstAssets.size() > 0;}
private void loadAccount () {
/*String query = 'SELECT ';
for(Schema.FieldSetMember f : this.getFields()) {
query += f.getFieldPath() + ', ';
}
query += 'Id, Name FROM Account Where Id = \'' + account.id + '\' LIMIT 1';
account = Database.query(query);*/
this.account = (Account)stdController.getRecord();
system.debug('### load Account: ' + account);
}
public List<Schema.FieldSetMember> getFields() {
return SObjectType.Account.FieldSets.TestAndAssets_Account.getFields();
}
}