You need to sign in to do that
Don't have an account?
Doug Traster 4
Problems with Field being greyed out on Visual Force page using ActionSupport/reRender
I am trying to modify an existing VF page on Opportunity Line Item. I need to have user be able to choose discount in either percentage or currency, and I am trying to use ActionSupport and reRender, but not getting it to work correctly.
Can someone please help.
Here is the VF
<apex:page standardController="Opportunity" extensions="opportunityPBB” action="{!priceBookCheck}" >
<apex:sectionHeader Title="Manage {!$ObjectType.Product2.LabelPlural}" subtitle="{!opportunity.Name}"/>
<apex:messages style="color:red"/>
<style>
.search{
font-size:14pt;
margin-right: 20px;
}
.fyi{
color:red;
font-style:italic;
}
.label{
margin-right:10px;
font-weight:bold;
}
</style>
<script type='text/javascript'>
var waitTime = 1;
var countDown = waitTime+1;
var started = false;
function resetTimer(){
countDown=waitTime+1;
if(started==false){
started=true;
runCountDown();
}
}
function runCountDown(){
countDown--;
if(countDown<=0){
fetchResults();
started=false;
}
else{
window.setTimeout(runCountDown,1000);
}
}
</script>
<apex:form >
<apex:outputPanel id="mainBody">
<apex:outputLabel styleClass="label">PriceBook: </apex:outputLabel>
<apex:outputText value="{!theBook.Name}"/>
<apex:commandLink action="{!changePricebook}" value="change" immediate="true"/>
<br/>
<apex:outputPanel rendered="{!multipleCurrencies}">
<apex:outputLabel styleClass="label">Currency: </apex:outputLabel>
<apex:outputText value="{!chosenCurrency}"/>
<br/>
</apex:outputPanel>
<br/>
<!-- HERE IS WHERE I AM DOING THE OUTPUT PANEL TO DO THE GREY OUT—>
<apex:outputPanel id="thePanel">
<apex:inputField value="{!s.Discount_Choice__c}">
<apex:actionSupport event="onchange" action="{!doDisable}" rerender="thePanel"/>
</apex:inputField>
<apex:inputField value="{!s.Discount_Percent__c.}" rendered="{!shouldRender}"/>
</apex:outputPanel>
<apex:pageBlock title="Selected {!$ObjectType.Product2.LabelPlural}" id="selected">
<apex:pageblockTable value="{!shoppingCart}" var="s">
<apex:column >
<apex:commandLink value="Remove" action="{!removeFromShoppingCart}" reRender="selected,searchResults" immediate="true">
<apex:param value="{!s.PriceBookEntryId}" assignTo="{!toUnselect}" name="toUnselect"/>
</apex:commandLink>
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.LabelPlural}" value="{!s.PriceBookEntry.Product2.Name}"/>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Quantity.Label}">
<apex:inputField value="{!s.Quantity}" style="width:70px" required="true" onkeyup="refreshTotals();"/>
</apex:column>
<!-- This should be greyed out if you choose ‘Currency’ above—>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Discount_Percent__c.Label}">
<apex:inputField value="{!s.Discount_Percent__c}" style="width:70px" required="true" onkeyup="refreshTotals();"/>
</apex:column>
<!-- This should be greyed out if you choose ‘Percentage’ above—>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Discount_Currency__c.Label}">
<apex:inputField value="{!s.Discount_Currency__c}" style="width:70px" required="false" onkeyup="refreshTotals();"/>
</apex:column>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.UnitPrice.Label}">
<apex:inputField value="{!s.UnitPrice}" style="width:70px" required="false" onkeyup="refreshTotals();"/>
</apex:column>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Description.Label}">
<apex:inputField value="{!s.Description}" required="false"/>
</apex:column>
</apex:pageblockTable>
<apex:pageBlockButtons >
<apex:commandButton action="{!onSave}" value="Save"/>
<apex:commandButton action="{!onCancel}" value="Cancel" immediate="true"/>
</apex:pageBlockButtons>
</apex:pageBlock>
<apex:pageBlock >
<apex:outputPanel styleClass="search">
Search for {!$ObjectType.Product2.LabelPlural}:
</apex:outputPanel>
<apex:actionRegion renderRegionOnly="false" immediate="true">
<apex:actionFunction name="fetchResults" action="{!updateAvailableList}" reRender="searchResults" status="searchStatus"/>
<apex:inputText value="{!searchString}" onkeydown="if(event.keyCode==13){this.blur();}else{resetTimer();}" style="width:300px"/>
<i>
<apex:actionStatus id="searchStatus" startText="searching..." stopText=" "/>
</i>
</apex:actionRegion>
<br/>
<br/>
<apex:outputPanel id="searchResults">
<apex:pageBlockTable value="{!AvailableProducts}" var="a">
<apex:column headerValue="{!$ObjectType.Product2.Fields.Name.Label}" value="{!a.Product2.Name}" />
<apex:column headerValue="{!$ObjectType.Product2.Fields.Family.Label}" value="{!a.Product2.Family}"/>
<apex:column headerValue="{!$ObjectType.Product2.Fields.Description.Label}" value="{!a.Product2.Description}"/>
<apex:column >
<apex:commandButton value="Select" action="{!addToShoppingCart}" reRender="selected,searchResults" immediate="true">
<apex:param value="{!a.Id}" assignTo="{!toSelect}" name="toSelect"/>
</apex:commandButton>
</apex:column>
</apex:pageBlockTable>
<apex:outputPanel styleClass="fyi" rendered="{!overLimit}">
<br/>
Your search returned over 100 results, use a more specific search string if you do not see the desired {!$ObjectType.Product2.Label}.
<br/>
</apex:outputPanel>
</apex:outputPanel>
</apex:pageBlock>
</apex:outputPanel>
</apex:form>
</apex:page>
Here is class/controller
public with sharing class opportunityProductEntryExtension {
public Opportunity theOpp {get;set;}
public String searchString {get;set;}
public opportunityLineItem[] shoppingCart {get;set;}
public priceBookEntry[] AvailableProducts {get;set;}
public Pricebook2 theBook {get;set;}
public String toSelect {get; set;}
public String toUnselect {get; set;}
public Decimal Total {get;set;}
public Boolean overLimit {get;set;}
public Boolean multipleCurrencies {get; set;}
private Boolean forcePricebookSelection = false;
private opportunityLineItem[] forDeletion = new opportunityLineItem[]{};
public opportunityProductEntryExtension(ApexPages.StandardController controller) {
multipleCurrencies = UserInfo.isMultiCurrencyOrganization();
if(multipleCurrencies)
theOpp = database.query('select Id, Pricebook2Id, Pricebook2.Name, CurrencyIsoCode from Opportunity where Id = \'' + controller.getRecord().Id + '\' limit 1');
else
theOpp = [select Id, Pricebook2Id, PriceBook2.Name from Opportunity where Id = :controller.getRecord().Id limit 1];
shoppingCart = [select Id, Quantity, TotalPrice, UnitPrice, Discount_Choice__c, Discount_Percent__c, Discount_Currency__c, Description, PriceBookEntryId, PriceBookEntry.Name, PriceBookEntry.IsActive, PriceBookEntry.Product2Id, PriceBookEntry.Product2.Name, PriceBookEntry.PriceBook2Id from opportunityLineItem
where OpportunityId=:theOpp.Id];
if(theOpp.Pricebook2Id == null){
Pricebook2[] activepbs = [select Id, Name from Pricebook2 where isActive = true limit 2];
if(activepbs.size() == 2){
forcePricebookSelection = true;
theBook = new Pricebook2();
}
else{
theBook = activepbs[0];
}
}
else{
theBook = theOpp.Pricebook2;
}
if(!forcePricebookSelection)
updateAvailableList();
}
public PageReference priceBookCheck(){
if(forcePricebookSelection){
return changePricebook();
}
else{
if(theOpp.pricebook2Id != theBook.Id){
try{
theOpp.Pricebook2Id = theBook.Id;
update(theOpp);
}
catch(Exception e){
ApexPages.addMessages(e);
}
}
return null;
}
}
public String getChosenCurrency(){
if(multipleCurrencies)
return (String)theOpp.get('CurrencyIsoCode');
else
return '';
}
public void updateAvailableList() {
String qString = 'select Id, Pricebook2Id, IsActive, Product2.Name, Product2.Family, Product2.IsActive, Product2.Description, UnitPrice from PricebookEntry where IsActive=true and Pricebook2Id = \'' + theBook.Id + '\'';
if(multipleCurrencies)
qstring += ' and CurrencyIsoCode = \'' + theOpp.get('currencyIsoCode') + '\'';
if(searchString!=null){
qString+= ' and (Product2.Name like \'%' + searchString + '%\' or Product2.Description like \'%' + searchString + '%\')';
}
Set<Id> selectedEntries = new Set<Id>();
for(opportunityLineItem d:shoppingCart){
selectedEntries.add(d.PricebookEntryId);
}
if(selectedEntries.size()>0){
String tempFilter = ' and Id not in (';
for(Id i : selectedEntries){
tempFilter+= '\'' + (String)i + '\',';
}
String extraFilter = tempFilter.substring(0,tempFilter.length()-1);
extraFilter+= ')';
qString+= extraFilter;
}
qString+= ' order by Product2.Name';
qString+= ' limit 101';
system.debug('qString:' +qString);
AvailableProducts = database.query(qString);
if(AvailableProducts.size()==101){
AvailableProducts.remove(100);
overLimit = true;
}
else{
overLimit=false;
}
}
public void addToShoppingCart(){
for(PricebookEntry d : AvailableProducts){
if((String)d.Id==toSelect){
shoppingCart.add(new opportunityLineItem(OpportunityId=theOpp.Id, PriceBookEntry=d, PriceBookEntryId=d.Id, UnitPrice=d.UnitPrice));
break;
}
}
updateAvailableList();
}
public PageReference removeFromShoppingCart(){
Integer count = 0;
for(opportunityLineItem d : shoppingCart){
if((String)d.PriceBookEntryId==toUnselect){
if(d.Id!=null)
forDeletion.add(d);
shoppingCart.remove(count);
break;
}
count++;
}
updateAvailableList();
return null;
}
//HERE IS MY ACTION TO GET IT TO WORK
public void doDisable() {
if(OportunityLineItem.Discount_Choice__c =='Currency')
{
shouldRender=false;
}
else{
shouldRender =true;
}
}
public PageReference onSave(){
if(forDeletion.size()>0)
delete(forDeletion);
try{
if(shoppingCart.size()>0)
upsert(shoppingCart);
}
catch(Exception e){
ApexPages.addMessages(e);
return null;
}
return new PageReference('/' + ApexPages.currentPage().getParameters().get('Id'));
}
public PageReference onCancel(){
return new PageReference('/' + ApexPages.currentPage().getParameters().get('Id'));
}
public PageReference changePricebook(){
PageReference ref = new PageReference('/oppitm/choosepricebook.jsp');
ref.getParameters().put('id',theOpp.Id);
ref.getParameters().put('retURL','/apex/opportunityProductEntry?id=' + theOpp.Id);
return ref;
}
}
Can someone please help.
Here is the VF
<apex:page standardController="Opportunity" extensions="opportunityPBB” action="{!priceBookCheck}" >
<apex:sectionHeader Title="Manage {!$ObjectType.Product2.LabelPlural}" subtitle="{!opportunity.Name}"/>
<apex:messages style="color:red"/>
<style>
.search{
font-size:14pt;
margin-right: 20px;
}
.fyi{
color:red;
font-style:italic;
}
.label{
margin-right:10px;
font-weight:bold;
}
</style>
<script type='text/javascript'>
var waitTime = 1;
var countDown = waitTime+1;
var started = false;
function resetTimer(){
countDown=waitTime+1;
if(started==false){
started=true;
runCountDown();
}
}
function runCountDown(){
countDown--;
if(countDown<=0){
fetchResults();
started=false;
}
else{
window.setTimeout(runCountDown,1000);
}
}
</script>
<apex:form >
<apex:outputPanel id="mainBody">
<apex:outputLabel styleClass="label">PriceBook: </apex:outputLabel>
<apex:outputText value="{!theBook.Name}"/>
<apex:commandLink action="{!changePricebook}" value="change" immediate="true"/>
<br/>
<apex:outputPanel rendered="{!multipleCurrencies}">
<apex:outputLabel styleClass="label">Currency: </apex:outputLabel>
<apex:outputText value="{!chosenCurrency}"/>
<br/>
</apex:outputPanel>
<br/>
<!-- HERE IS WHERE I AM DOING THE OUTPUT PANEL TO DO THE GREY OUT—>
<apex:outputPanel id="thePanel">
<apex:inputField value="{!s.Discount_Choice__c}">
<apex:actionSupport event="onchange" action="{!doDisable}" rerender="thePanel"/>
</apex:inputField>
<apex:inputField value="{!s.Discount_Percent__c.}" rendered="{!shouldRender}"/>
</apex:outputPanel>
<apex:pageBlock title="Selected {!$ObjectType.Product2.LabelPlural}" id="selected">
<apex:pageblockTable value="{!shoppingCart}" var="s">
<apex:column >
<apex:commandLink value="Remove" action="{!removeFromShoppingCart}" reRender="selected,searchResults" immediate="true">
<apex:param value="{!s.PriceBookEntryId}" assignTo="{!toUnselect}" name="toUnselect"/>
</apex:commandLink>
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.LabelPlural}" value="{!s.PriceBookEntry.Product2.Name}"/>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Quantity.Label}">
<apex:inputField value="{!s.Quantity}" style="width:70px" required="true" onkeyup="refreshTotals();"/>
</apex:column>
<!-- This should be greyed out if you choose ‘Currency’ above—>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Discount_Percent__c.Label}">
<apex:inputField value="{!s.Discount_Percent__c}" style="width:70px" required="true" onkeyup="refreshTotals();"/>
</apex:column>
<!-- This should be greyed out if you choose ‘Percentage’ above—>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Discount_Currency__c.Label}">
<apex:inputField value="{!s.Discount_Currency__c}" style="width:70px" required="false" onkeyup="refreshTotals();"/>
</apex:column>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.UnitPrice.Label}">
<apex:inputField value="{!s.UnitPrice}" style="width:70px" required="false" onkeyup="refreshTotals();"/>
</apex:column>
<apex:column headerValue="{!$ObjectType.OpportunityLineItem.Fields.Description.Label}">
<apex:inputField value="{!s.Description}" required="false"/>
</apex:column>
</apex:pageblockTable>
<apex:pageBlockButtons >
<apex:commandButton action="{!onSave}" value="Save"/>
<apex:commandButton action="{!onCancel}" value="Cancel" immediate="true"/>
</apex:pageBlockButtons>
</apex:pageBlock>
<apex:pageBlock >
<apex:outputPanel styleClass="search">
Search for {!$ObjectType.Product2.LabelPlural}:
</apex:outputPanel>
<apex:actionRegion renderRegionOnly="false" immediate="true">
<apex:actionFunction name="fetchResults" action="{!updateAvailableList}" reRender="searchResults" status="searchStatus"/>
<apex:inputText value="{!searchString}" onkeydown="if(event.keyCode==13){this.blur();}else{resetTimer();}" style="width:300px"/>
<i>
<apex:actionStatus id="searchStatus" startText="searching..." stopText=" "/>
</i>
</apex:actionRegion>
<br/>
<br/>
<apex:outputPanel id="searchResults">
<apex:pageBlockTable value="{!AvailableProducts}" var="a">
<apex:column headerValue="{!$ObjectType.Product2.Fields.Name.Label}" value="{!a.Product2.Name}" />
<apex:column headerValue="{!$ObjectType.Product2.Fields.Family.Label}" value="{!a.Product2.Family}"/>
<apex:column headerValue="{!$ObjectType.Product2.Fields.Description.Label}" value="{!a.Product2.Description}"/>
<apex:column >
<apex:commandButton value="Select" action="{!addToShoppingCart}" reRender="selected,searchResults" immediate="true">
<apex:param value="{!a.Id}" assignTo="{!toSelect}" name="toSelect"/>
</apex:commandButton>
</apex:column>
</apex:pageBlockTable>
<apex:outputPanel styleClass="fyi" rendered="{!overLimit}">
<br/>
Your search returned over 100 results, use a more specific search string if you do not see the desired {!$ObjectType.Product2.Label}.
<br/>
</apex:outputPanel>
</apex:outputPanel>
</apex:pageBlock>
</apex:outputPanel>
</apex:form>
</apex:page>
Here is class/controller
public with sharing class opportunityProductEntryExtension {
public Opportunity theOpp {get;set;}
public String searchString {get;set;}
public opportunityLineItem[] shoppingCart {get;set;}
public priceBookEntry[] AvailableProducts {get;set;}
public Pricebook2 theBook {get;set;}
public String toSelect {get; set;}
public String toUnselect {get; set;}
public Decimal Total {get;set;}
public Boolean overLimit {get;set;}
public Boolean multipleCurrencies {get; set;}
private Boolean forcePricebookSelection = false;
private opportunityLineItem[] forDeletion = new opportunityLineItem[]{};
public opportunityProductEntryExtension(ApexPages.StandardController controller) {
multipleCurrencies = UserInfo.isMultiCurrencyOrganization();
if(multipleCurrencies)
theOpp = database.query('select Id, Pricebook2Id, Pricebook2.Name, CurrencyIsoCode from Opportunity where Id = \'' + controller.getRecord().Id + '\' limit 1');
else
theOpp = [select Id, Pricebook2Id, PriceBook2.Name from Opportunity where Id = :controller.getRecord().Id limit 1];
shoppingCart = [select Id, Quantity, TotalPrice, UnitPrice, Discount_Choice__c, Discount_Percent__c, Discount_Currency__c, Description, PriceBookEntryId, PriceBookEntry.Name, PriceBookEntry.IsActive, PriceBookEntry.Product2Id, PriceBookEntry.Product2.Name, PriceBookEntry.PriceBook2Id from opportunityLineItem
where OpportunityId=:theOpp.Id];
if(theOpp.Pricebook2Id == null){
Pricebook2[] activepbs = [select Id, Name from Pricebook2 where isActive = true limit 2];
if(activepbs.size() == 2){
forcePricebookSelection = true;
theBook = new Pricebook2();
}
else{
theBook = activepbs[0];
}
}
else{
theBook = theOpp.Pricebook2;
}
if(!forcePricebookSelection)
updateAvailableList();
}
public PageReference priceBookCheck(){
if(forcePricebookSelection){
return changePricebook();
}
else{
if(theOpp.pricebook2Id != theBook.Id){
try{
theOpp.Pricebook2Id = theBook.Id;
update(theOpp);
}
catch(Exception e){
ApexPages.addMessages(e);
}
}
return null;
}
}
public String getChosenCurrency(){
if(multipleCurrencies)
return (String)theOpp.get('CurrencyIsoCode');
else
return '';
}
public void updateAvailableList() {
String qString = 'select Id, Pricebook2Id, IsActive, Product2.Name, Product2.Family, Product2.IsActive, Product2.Description, UnitPrice from PricebookEntry where IsActive=true and Pricebook2Id = \'' + theBook.Id + '\'';
if(multipleCurrencies)
qstring += ' and CurrencyIsoCode = \'' + theOpp.get('currencyIsoCode') + '\'';
if(searchString!=null){
qString+= ' and (Product2.Name like \'%' + searchString + '%\' or Product2.Description like \'%' + searchString + '%\')';
}
Set<Id> selectedEntries = new Set<Id>();
for(opportunityLineItem d:shoppingCart){
selectedEntries.add(d.PricebookEntryId);
}
if(selectedEntries.size()>0){
String tempFilter = ' and Id not in (';
for(Id i : selectedEntries){
tempFilter+= '\'' + (String)i + '\',';
}
String extraFilter = tempFilter.substring(0,tempFilter.length()-1);
extraFilter+= ')';
qString+= extraFilter;
}
qString+= ' order by Product2.Name';
qString+= ' limit 101';
system.debug('qString:' +qString);
AvailableProducts = database.query(qString);
if(AvailableProducts.size()==101){
AvailableProducts.remove(100);
overLimit = true;
}
else{
overLimit=false;
}
}
public void addToShoppingCart(){
for(PricebookEntry d : AvailableProducts){
if((String)d.Id==toSelect){
shoppingCart.add(new opportunityLineItem(OpportunityId=theOpp.Id, PriceBookEntry=d, PriceBookEntryId=d.Id, UnitPrice=d.UnitPrice));
break;
}
}
updateAvailableList();
}
public PageReference removeFromShoppingCart(){
Integer count = 0;
for(opportunityLineItem d : shoppingCart){
if((String)d.PriceBookEntryId==toUnselect){
if(d.Id!=null)
forDeletion.add(d);
shoppingCart.remove(count);
break;
}
count++;
}
updateAvailableList();
return null;
}
//HERE IS MY ACTION TO GET IT TO WORK
public void doDisable() {
if(OportunityLineItem.Discount_Choice__c =='Currency')
{
shouldRender=false;
}
else{
shouldRender =true;
}
}
public PageReference onSave(){
if(forDeletion.size()>0)
delete(forDeletion);
try{
if(shoppingCart.size()>0)
upsert(shoppingCart);
}
catch(Exception e){
ApexPages.addMessages(e);
return null;
}
return new PageReference('/' + ApexPages.currentPage().getParameters().get('Id'));
}
public PageReference onCancel(){
return new PageReference('/' + ApexPages.currentPage().getParameters().get('Id'));
}
public PageReference changePricebook(){
PageReference ref = new PageReference('/oppitm/choosepricebook.jsp');
ref.getParameters().put('id',theOpp.Id);
ref.getParameters().put('retURL','/apex/opportunityProductEntry?id=' + theOpp.Id);
return ref;
}
}