function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Cristian TrifCristian Trif 

pageBlockTable change depending on selectlist value

Hi. I want to create a selectlist exactly like this.

User-added image

I created the logic for this but I really don't know how to make it with Visualforce.

Controller:

 

public class TaskController {
    public List<Task> lstTasksForUser {get;set;}
    public TaskController(){
        lstTasksForUser = [Select id, ActivityDate, Status, Subject, WhoId, WhatId, CompanyName__c, AccountId From Task WHERE Status!= 'Completed' AND OwnerId =: UserInfo.getUserId()];
    }
    
    public List<Task> tasksToday {get;set;}
    public List<Task> getTodayTasks(){
        tasksToday = [Select id, CreatedDate, ActivityDate, Status, Subject, WhoId, WhatId, CompanyName__c, AccountId From Task where ActivityDate = TODAY AND Status!= 'Completed'];
        return tasksToday;
    }
    
    public List<Task> tasksThisMonth {get;set;}
    public List<Task> getThisMonthTasks(){
        tasksThisMonth = [Select id, CreatedDate, ActivityDate, Status, Subject, WhoId, WhatId, CompanyName__c, AccountId From Task where ActivityDate = THIS_MONTH AND Status!= 'Completed'];
        return tasksThisMonth;
    }
    
    public List<Task> tasksCloseTomorow {get;set;}
    public List<Task> getTomorowCloseTasks(){
        tasksCloseTomorow = [Select id, CreatedDate, ActivityDate, Status, Subject, WhoId, WhatId, CompanyName__c, AccountId From Task where ActivityDate = TOMORROW AND Status!= 'Completed'];
        return tasksCloseTomorow;
    }
    
    public List<Task> tasksOverdue {get;set;}
    public List<Task> getOverdueTasks(){
        tasksOverdue = [Select id, CreatedDate, ActivityDate, Status, Subject, WhoId, WhatId, CompanyName__c, AccountId From Task where ActivityDate < TODAY AND Status!= 'Completed' ];
        return tasksOverdue;
    }
    
    
}

This is my VF page and I'm stuck on this selectList part. I want when I select Today in the selectListOptions my pageBlockTable to change and fetch the records for Today.

 

<apex:page controller="TaskController" tabStyle="Task">
    <apex:form >
        <apex:pageBlock title="My Tasks" id="tasks_list">
            <apex:pageBlockTable value="{!lstTasksForUser}" var="tsk">
                <apex:selectList size="5" onchange>
                	<apex:selectOptions value="{!TodayTasks}" >
                        
                    </apex:selectOptions>
                </apex:selectList>
                <apex:column headerValue="Complete" >
                    <a href="https://eu12.salesforce.com/{!tsk.id}/e?close=1&retURL=%2Fhome%2Fhome.jsp" rendered="{!if(tsk.status!='Completed',true,false)}" > 
                        X 
                    </a>
                </apex:column>
                <apex:column value="{!tsk.ActivityDate}"/>
                <apex:column value="{!tsk.Status}"/>
                <apex:column value="{!tsk.Subject}"/>
                <apex:column value="{!tsk.WhoId}"/>
                <apex:column value="{!tsk.WhatId}"/>
                <apex:column value="{!tsk.CompanyName__c}"/>
                <apex:column value="{!tsk.AccountId}"/>
            </apex:pageBlockTable>
        </apex:pageBlock> 
    </apex:form>
</apex:page>
 

 

Best Answer chosen by Cristian Trif
cvuyyurucvuyyuru
Hi Cristian, 
Use this code.
public class TaskControllers{
    
    public string selfilter{get; set;}
    public list<selectOption> filteroptions{get; set;}
    public list<Task> lstTasks{get; set;}
    
    public TaskControllers(){
        lstTasks = [Select id, ActivityDate, Status, Subject, WhoId, WhatId, AccountId From Task WHERE Status!= 'Completed' AND OwnerId =: UserInfo.getUserId()];
        // Add this line in constructor
        filteroptions = new list<SelectOption>();
        filterOptions.add(new SelectOption('TOMORROW', 'Tomorrow'));
        filterOptions.add(new SelectOption('TODAY', 'Today'));
        filterOptions.add(new SelectOption('YESTERDAY', 'Yesterday'));
        filterOptions.add(new SelectOption('THIS_WEEK', 'This Week'));
        filterOptions.add(new SelectOption('LAST_WEEK', 'Last Week'));
        filterOptions.add(new SelectOption('NEXT_WEEK', 'Next Week'));
        filterOptions.add(new SelectOption('LAST_WEEK', 'Last Week'));
        filterOptions.add(new SelectOption('NEXT_MONTH', 'Next Month'));
        filterOptions.add(new SelectOption('THIS_MONTH', 'This Month'));
        filterOptions.add(new SelectOption('LAST_MONTH', 'Last Month'));
    }
    

    public void filterTasks(){
        lstTasks = database.query('Select id, CreatedDate, ActivityDate, Status, Subject, WhoId, WhatId, AccountId From Task where ActivityDate =' +selFilter+' and IsClosed = false');
    }
}
<apex:page controller="TaskControllers" tabStyle="Task">
    <apex:form >
        <apex:pageBlock title="My Tasks" id="tasks_list">
            <apex:selectList size="1" value="{!selFilter}">
                <apex:selectOptions value="{!filteroptions}"/>
                <apex:actionSupport event="onchange" action="{!filterTasks}" rerender="pbTable"/>
            </apex:selectList>
            <apex:pageBlockTable id="pbTable" value="{!lstTasks}" var="tsk">
                <apex:column headerValue="Complete" >
                    <a href="/{!tsk.id}/e?close=1" rendered="{!if(tsk.status!='Completed',true,false)}" > 
                        X 
                    </a>
                </apex:column>
                <apex:column value="{!tsk.ActivityDate}"/>
                <apex:column value="{!tsk.Status}"/>
                <apex:column value="{!tsk.Subject}"/>
                <apex:column value="{!tsk.WhoId}"/>
                <apex:column value="{!tsk.WhatId}"/>
                <apex:column value="{!tsk.AccountId}"/>
            </apex:pageBlockTable>
        </apex:pageBlock> 
    </apex:form>
</apex:page>

 

All Answers

cvuyyurucvuyyuru
public class TaskController{
    
	public string selfilter{get; set;}
	public list<selectOption> filteroptions{get; set;}
	public list<Task> lstTasks{get; set;}
	
	public TaskController(){
        lstTasks = [Select id, ActivityDate, Status, Subject, WhoId, WhatId, CompanyName__c, AccountId From Task WHERE Status!= 'Completed' AND OwnerId =: UserInfo.getUserId()];
		// Add this line in constructor
		filteroptions = new list<SelectOption>();
		filterOptions.add('TOMORROW', 'Tomorrow');
		filterOptions.add('TODAY', 'Today');
		filterOptions.add('YESTERDAY', 'Yesterday'');
		filterOptions.add('THIS_WEEK', 'This Week');
		filterOptions.add('LAST_WEEK', 'Last Week');
		filterOptions.add('NEXT_WEEK', 'Next Week');
		filterOptions.add('LAST_WEEK', 'Last Week');
		filterOptions.add('NEXT_MONTH', 'Next Month');
		filterOptions.add('THIS_MONTH', 'This Month');
		filterOptions.add('LAST_MONTH', 'Last Month');
    }
	

	public void filterTasks(){
		lstTasks = [Select id, CreatedDate, ActivityDate, Status, Subject, WhoId, WhatId, CompanyName__c, AccountId From Task where ActivityDate =: selFilter AND Status!= 'Completed'];
	}
}
 
<apex:page controller="TaskController" tabStyle="Task">
    <apex:form >
        <apex:pageBlock title="My Tasks" id="tasks_list">
			<apex:selectList size="1" value="{!selFilter}">
				<apex:selectOptions value="{!filteroptions}"/>
				<apex:actionSupport event="onchange" action="{!filterTasks}" rerender="pbTable"/>
			</apex:selectList>
            <apex:pageBlockTable id="pbTable" value="{!lstTasksForUser}" var="tsk">
                <apex:column headerValue="Complete" >
                    <a href="/{!tsk.id}/e?close=1" rendered="{!if(tsk.status!='Completed',true,false)}" > 
                        X 
                    </a>
                </apex:column>
                <apex:column value="{!tsk.ActivityDate}"/>
                <apex:column value="{!tsk.Status}"/>
                <apex:column value="{!tsk.Subject}"/>
                <apex:column value="{!tsk.WhoId}"/>
                <apex:column value="{!tsk.WhatId}"/>
                <apex:column value="{!tsk.CompanyName__c}"/>
                <apex:column value="{!tsk.AccountId}"/>
            </apex:pageBlockTable>
        </apex:pageBlock> 
    </apex:form>
</apex:page>

Please check this. I didn't test this. Let me know if you face any issues.
Cristian TrifCristian Trif

I have a bunch of errors. in Line 7, 13,14,15,16,17,18,19,20,25,27 in Controller.

 

Why you did delete my logic? It was not good? I wrote the logic to fetch the records for today, this month, tomorrow, overdue

Cristian TrifCristian Trif
Also what's the point of selfilter in the Controller? You only defined it but not used it.
cvuyyurucvuyyuru
I guess I used it in the query.
Cristian TrifCristian Trif
Oh yes, sorry. I'm just tired. In Visualforce i don't have any errors but in Controllers I have a lot of them especially from line 7 to 20
cvuyyurucvuyyuru
Can you post a screenshot of error.
Cristian TrifCristian Trif
IT was a typo. From 41 errors i have 12.

Errors is: The method does not exist or incorrect signature: void add(String, String) from the type List<System.SelectOption>

From line 11 to 20 iI have this error. Do you know why?

User-added image
Cristian TrifCristian Trif

User-added image

 

And the last two errors. Invalid bind expression type of String for column of type Date and Unknown property 'TaskController.selFilter'

cvuyyurucvuyyuru
Hi Cristian, 
Use this code.
public class TaskControllers{
    
    public string selfilter{get; set;}
    public list<selectOption> filteroptions{get; set;}
    public list<Task> lstTasks{get; set;}
    
    public TaskControllers(){
        lstTasks = [Select id, ActivityDate, Status, Subject, WhoId, WhatId, AccountId From Task WHERE Status!= 'Completed' AND OwnerId =: UserInfo.getUserId()];
        // Add this line in constructor
        filteroptions = new list<SelectOption>();
        filterOptions.add(new SelectOption('TOMORROW', 'Tomorrow'));
        filterOptions.add(new SelectOption('TODAY', 'Today'));
        filterOptions.add(new SelectOption('YESTERDAY', 'Yesterday'));
        filterOptions.add(new SelectOption('THIS_WEEK', 'This Week'));
        filterOptions.add(new SelectOption('LAST_WEEK', 'Last Week'));
        filterOptions.add(new SelectOption('NEXT_WEEK', 'Next Week'));
        filterOptions.add(new SelectOption('LAST_WEEK', 'Last Week'));
        filterOptions.add(new SelectOption('NEXT_MONTH', 'Next Month'));
        filterOptions.add(new SelectOption('THIS_MONTH', 'This Month'));
        filterOptions.add(new SelectOption('LAST_MONTH', 'Last Month'));
    }
    

    public void filterTasks(){
        lstTasks = database.query('Select id, CreatedDate, ActivityDate, Status, Subject, WhoId, WhatId, AccountId From Task where ActivityDate =' +selFilter+' and IsClosed = false');
    }
}
<apex:page controller="TaskControllers" tabStyle="Task">
    <apex:form >
        <apex:pageBlock title="My Tasks" id="tasks_list">
            <apex:selectList size="1" value="{!selFilter}">
                <apex:selectOptions value="{!filteroptions}"/>
                <apex:actionSupport event="onchange" action="{!filterTasks}" rerender="pbTable"/>
            </apex:selectList>
            <apex:pageBlockTable id="pbTable" value="{!lstTasks}" var="tsk">
                <apex:column headerValue="Complete" >
                    <a href="/{!tsk.id}/e?close=1" rendered="{!if(tsk.status!='Completed',true,false)}" > 
                        X 
                    </a>
                </apex:column>
                <apex:column value="{!tsk.ActivityDate}"/>
                <apex:column value="{!tsk.Status}"/>
                <apex:column value="{!tsk.Subject}"/>
                <apex:column value="{!tsk.WhoId}"/>
                <apex:column value="{!tsk.WhatId}"/>
                <apex:column value="{!tsk.AccountId}"/>
            </apex:pageBlockTable>
        </apex:pageBlock> 
    </apex:form>
</apex:page>

 
This was selected as the best answer
Cristian TrifCristian Trif
It works. You are good, Mister! :) Thank you a lot!
Cristian TrifCristian Trif
Can you help me also with the code coverage for this class? Until now I only wrote this: 


Task tsk = new Task();
tsk.Subject = 'Activity';
tsk.ActivityDate = System.today();
tsk.Status = 'Completed';
tsk.Priority ='Normal';
tsk.Description = 'Test';
insert tsk;

Basically, I only created the task, and now I'm stuck. I don't know how can I cover the code Coverage on my class Task Controller.

I'm confused about how can i test this method and make the code coverage for class.