Wednesday, October 7, 2015

Salesforce: Pagination, search engine ,column sorting ,alphabetical sorting

------------------------------------------------------------------------------------------------------------
Vf  page
------------------------------------------------------------------------------------------------------------


<apex:page controller="FeedbackUserSelectionController1">
<apex:sectionHeader title="Feedback Form" subtitle="User Selection Page"  />
   <style type="text/css">
.loading-icon {
   background-image: url(/img/loading.gif);
   width: 16px;
   height: 16px;
}
a.alpha-link {
   font-weight: normal;
   font-size: 91%;
   padding: 0 4px;
   color: #015BA7 !important;
}
a.alpha-link+a.alpha-link {
   border-left: 1px solid #CFCECE;
}
a.alpha-link:hover {
   background-color: #e0f5fc !important;
}
a.alpha-select {
   font-weight: bold;
   text-decoration: none;
   background-color: #C6E1FF;
   color: #000000 !important;
}
.search-block {
   text-align: center;
}
.search-block input {
   margin: 0px 15px 0px 5px;
}
.search-block-button {
   min-width: 110px;
}
.process-block {
   text-align: center;
   margin-top: 10px;
}
.process-block input {
   margin: 0px 15px;
}
.process-block-button {
   min-width: 110px;
}
.page-buttons input {
   min-width: 110px;
}
</style>
   <apex:form id="TheForm">
      <!-- ***************************** -->
      <!-- Search Criteria               -->
      <apex:pageBlock mode="maindetail" >
         <div class="search-block">
            <div style="display: inline-table">
               <span>Name:</span>
               <apex:inputText value="{!SearchName}" />
            </div>
            <div style="display: inline-table">
               <span>Department:</span>
               <apex:inputText value="{!Searchdepartment}" />
            </div>
            <apex:commandButton styleClass="search-block-button" value="Search" action="{!Searchuser}" rerender="TablePanel"
               status="TableUpdateStatus" />
         </div>
         <div class="process-block">
            <apex:actionStatus id="ProcessButtonStatus">
               <apex:facet name="stop">
                  <apex:outputPanel >
                     <apex:commandButton styleClass="process-block-button" value="Process Selected" action="{!DoSomethingMany}"
                        status="ProcessButtonStatus" rerender="nothing" />
                     <apex:commandButton styleClass="process-block-button" value="Clear All" action="{!ClearAll}"
                        rerender="TheForm,TablePanel" />
                  </apex:outputPanel>
               </apex:facet>
               <apex:facet name="start">
                  <apex:outputPanel >
                     <apex:commandButton styleClass="process-block-button" value="Processing..." disabled="true" />
                     <apex:commandButton styleClass="process-block-button" value="Processing..." disabled="true" />
                  </apex:outputPanel>
               </apex:facet>
            </apex:actionStatus>
         </div>
      </apex:pageBlock>
      <!-- ************************* -->
      <!-- search results table      -->
      <apex:pageBlock id="TablePanel" title="Select Users to Give feedback ">
         <div>
            <span class="page-buttons" style="float: left; margin-bottom: 5px;"> <apex:commandButton disabled="{!!StdSetControllerUser.hasprevious}" value="Previous" action="{!StdSetControllerUser.previous}"
                  rerender="TablePanel" /> <apex:commandButton disabled="{!!StdSetControllerUser.hasnext}" value="Next"
                  action="{!StdSetControllerUser.next}" rerender="TablePanel" />
            </span>
            <!-- alphabet selection -->
            <span style="float: right; margin: 5px 5px 5px 5px;"> <apex:repeat value="{!AlphaList}" var="a">
                  <apex:commandLink value="{!a}" action="{!BuildQuery}" rerender="TablePanel"
                     styleClass="alpha-link{!if(AlphaFilter=a,' alpha-select','')}" status="TableUpdateStatus">
                     <apex:param name="AlphaFilter" value="{!a}" assignTo="{!AlphaFilter}" />
                  </apex:commandLink>
               </apex:repeat>
            </span>
         </div>
         <div style="clear: both;"></div>
         <apex:actionStatus id="TableUpdateStatus">
            <apex:inputHidden value="{!AlphaFilter}" id="hiddenField" />
            <!-- loading message -->
            <apex:facet name="start">
               <apex:outputPanel layout="block" styleClass="message infoM4">
                  <apex:panelGrid columns="2" styleClass="messageTable" columnClasses="messageCell" style="padding:0px;margin:0px;">
                     <apex:panelGroup >
                        <img class="loading-icon" src="/s.gif" />
                     </apex:panelGroup>
                     <apex:panelGroup >
                        <div class="messageText">Please wait...</div>
                     </apex:panelGroup>
                  </apex:panelGrid>
               </apex:outputPanel>
            </apex:facet>
            <!-- user table -->
            <apex:facet name="stop">
               <apex:pageBlockTable value="{!CurrentUserList}" var="a">
               
                  <apex:column >
                     <apex:facet name="header">
                        <apex:outputPanel id="SelectedCount">
                           <div style="text-align: center;">
                              <apex:outputText value="Selected" />
                              <br />
                              <apex:outputText value="{!UserSelectedCount}" />
                           </div>
                        </apex:outputPanel>
                     </apex:facet>
                     <div style="text-align: center;">
                        <apex:inputCheckBox value="{!a.aCheckBox}" id="check-box">
                           <apex:actionSupport event="onchange" rerender="SelectedCount" action="{!UpdateUserSelectedSet}" />
                           </apex:inputcheckbox>
                     </div>
                  </apex:column>
                  <apex:column >
                     <apex:facet name="header">
                        <apex:commandLink action="{!SortToggle}" rerender="TablePanel" status="TableUpdateStatus">
                           <apex:param name="SortField" value="Name" assignTo="{!SortField}" />
                           <apex:outputText value="{!$ObjectType.User.Fields.Name.Label}{!IF(SortField=='Name',IF(SortDirection='asc','?','?'),'')}" />
                        </apex:commandLink>
                     </apex:facet>
                     <apex:outputLink value="/{!a.aUser.Id}" target="_blank">{!a.aUser.Name}</apex:outputlink>
                  </apex:column>
                 
                  <apex:column >
                     <apex:facet name="header">
                        <apex:commandLink action="{!SortToggle}" rerender="TablePanel" status="TableUpdateStatus">
                           <apex:param name="SortField" value="Department" assignTo="{!SortField}" />
                           <apex:outputText value="{!$ObjectType.User.Fields.Department.Label}{!IF(SortField=='Department',IF(SortDirection='asc','?','?'),'')}" />
                        </apex:commandLink>
                     </apex:facet>
                     <apex:outputField value="{!a.aUser.Department}" />
                  </apex:column>
                  <apex:column >
                     <apex:facet name="header">
                        <apex:commandLink action="{!SortToggle}" rerender="TablePanel" status="TableUpdateStatus">
                           <apex:param name="SortField" value="CompanyName" assignTo="{!SortField}" />
                           <apex:outputText value="{!$ObjectType.User.Fields.CompanyName.Label}{!IF(SortField=='CompanyName',IF(SortDirection='asc','?','?'),'')}" />
                        </apex:commandLink>
                     </apex:facet>
                     <apex:outputField value="{!a.aUser.CompanyName}" />
                  </apex:column>
                  <apex:column >
                     <apex:facet name="header">
                        <apex:commandLink action="{!SortToggle}" rerender="TablePanel" status="TableUpdateStatus">
                           <apex:param name="SortField" value="Email" assignTo="{!SortField}" />
                           <apex:outputText value="{!$ObjectType.User.Fields.Email.Label}{!IF(SortField=='Email',IF(SortDirection='asc','?','?'),'')}" />
                        </apex:commandLink>
                     </apex:facet>
                     <apex:outputField value="{!a.aUser.Email}" />
                  </apex:column>
               
             
               
               </apex:pageBlockTable>
            </apex:facet>
         </apex:actionStatus>
         <div style="margin-top: 5px;">
            <apex:outputText value="Number of Records per Page: " />
            <apex:selectList value="{!RecPerPage}" size="1">
               <apex:selectOptions value="{!RecPerPageOption}" />
               <apex:actionSupport event="onchange" action="{!BuildQuery}" reRender="TablePanel" status="TableUpdateStatus" />
            </apex:selectList>
         </div>
      </apex:pageBlock>
   </apex:form>
</apex:page>

------------------------------------------------------------------------------------------------------------
Controller...
------------------------------------------------------------------------------------------------------------



public with sharing class FeedbackUserSelectionController1 {
    // User and selection set/variables
    private list<UserSubclass> Userlist {get; set;}
    private set<Id> UserSelectedSet;
    public Integer UserSelectedCount {get; set;}
    public String SelectedOneUser {get; set;}
    // selection and filter
    public list<String> AlphaList {get; set;}
    public String AlphaFilter {get; set;}
    public String SearchName {get; set;}
    public String Searchdepartment {get; set;}
    private String SaveSearchName;
    private String SaveSearchdepartment;
    private String Queryuser;
    // display sort and number
    public String RecPerPage {get; set;}
    public list<SelectOption> RecPerPageOption {get; set;}
    public String SortFieldSave;
    /***
    * FeedbackUserSelectionController - Constructor initialization
    ***/
   
    public FeedbackUserSelectionController1(){
        Userlist = new list<UserSubclass>();
        UserSelectedSet = new set<Id>();
        //records for page initialization
        RecPerPageOption = new list<SelectOption>();
        RecPerPageOption.add(new SelectOption('10','10'));
        RecPerPageOption.add(new SelectOption('25','25'));
        RecPerPageOption.add(new SelectOption('50','50'));
        RecPerPageOption.add(new SelectOption('100','100'));
        RecPerPageOption.add(new SelectOption('200','200'));
        RecPerPage = '10'; //default records per page
        // initialization alpha list
        AlphaList = new list<String> {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Other', 'All'};
            SortFieldSave = SortField;
        // alpha filter, use page parameter or set default to all
        if (apexpages.currentpage().getparameters().get('alpha') == null) {
            AlphaFilter = 'All';
        } else {
            AlphaFilter = apexpages.currentpage().getparameters().get('alpha');
        }
        // list generation
        BuildQuery();
    }
    /***
    * StdSetControllerUser - paging through the User list
    ***/
   
   
    public ApexPages.StandardSetController StdSetControllerUser {
        get {
            if(StdSetControllerUser == null) {
                StdSetControllerUser = new ApexPages.StandardSetController(Database.getQueryLocator(Queryuser));
                // sets the number of records in each page set
                StdSetControllerUser.setPageSize(Integer.valueOf(RecPerPage));
            }
            return StdSetControllerUser;
        }
        set;
    }
   
   
    /***
    * getCurrentUserlist - return an User list for the table
    ***/


   
    public list<UserSubclass> getCurrentUserlist() {
        UpdateUserSelectedSet();
        Userlist = new list<UserSubclass>();
        for (User a : (list<User>)StdSetControllerUser.getRecords()) {
            Userlist.add(new UserSubclass(a, UserSelectedSet.contains(a.Id)));
        }
        return Userlist;
    }
   
   
    /***
    * UpdateUserSelectedSet - add/remove Users from the selected User id list
    ***/
    public void UpdateUserSelectedSet(){
        for(UserSubclass a : Userlist ){
            if(a.aCheckBox == true) {
                UserSelectedSet.add(a.aUser.Id);
            } else {
                if(UserSelectedSet.contains(a.aUser.Id)) {
                    UserSelectedSet.remove(a.aUser.Id);
                }
            }
        }
        UserSelectedCount = UserSelectedSet.size();
    }
    /***
    * ClearUserSelectedSet - remove selected Users and initialize counter
    ***/
    public PageReference ClearAll(){
        Userlist.clear();
        UserSelectedSet.clear();
        UserSelectedCount = 0;
        SearchName = '';
        Searchdepartment = '';
        SaveSearchName = '';
        SaveSearchdepartment = '';
        AlphaFilter = 'All';
        BuildQuery();
        return null;
    }
    /***
    * Searchuser - set search criteria fields and refresh User table
    ***/
    public PageReference Searchuser() {
        SaveSearchName = SearchName;
        SaveSearchdepartment = Searchdepartment;
        BuildQuery();
        return null;
    }
    /***
    * BuildQuery - build query command for list selection change
    ***/
    public void BuildQuery() {
        StdSetControllerUser = null;
        String QueryWhere = '';
        if (AlphaFilter == null || AlphaFilter.trim().length() == 0) {
            AlphaFilter = 'All';
        }
        Queryuser = 'SELECT Department,FirstName,LastName,Name , CompanyName, Email, LOB__c ' +
            ' FROM User';
        if (AlphaFilter == 'Other') {
            QueryWhere = BuildWhere(QueryWhere, '(' + String.escapeSingleQuotes(SortField) + ' < \'A\' OR ' +
                                    String.escapeSingleQuotes(SortField) + ' > \'Z\') AND (NOT ' +
                                    String.escapeSingleQuotes(SortField) + ' LIKE \'Z%\') ');
        } else if (AlphaFilter != 'All') {
            QueryWhere = BuildWhere(QueryWhere, '(' + String.escapeSingleQuotes(SortField) + ' LIKE \'' + String.escapeSingleQuotes(AlphaFilter) + '%\')' );
        }
        if (SaveSearchName != null) {
            QueryWhere = BuildWhere(QueryWhere, ' (Name LIKE \'%' + String.escapeSingleQuotes(SaveSearchName) + '%\')');
        }
        if (SaveSearchdepartment != null) {
              QueryWhere = BuildWhere(QueryWhere, ' (Department LIKE \'%' + String.escapeSingleQuotes(SaveSearchdepartment) + '%\')');
        }
        Queryuser += QueryWhere;
        Queryuser += ' ORDER BY ' + String.escapeSingleQuotes(SortField) + ' ' + String.escapeSingleQuotes(SortDirection) + ' LIMIT 10000';
        system.debug('Queryuser:' + Queryuser);
    }
    /***
    * BuildWhere - build soql string for where criteria
    ***/
    public String BuildWhere(String QW, String Cond) {
        if (QW == '') {
            return ' WHERE ' + Cond;
        } else {
            return QW + ' AND ' + Cond;
        }
    }
    /***
    * SortDirection - return sort direction. Default ascending(asc)
    ***/
    public String SortDirection {
        get { if (SortDirection == null) {  SortDirection = 'asc'; } return SortDirection;  }
        set;
    }
    /***
    * SortField - return sort by field. Default to Name
    ***/
    public String SortField {
        get { if (SortField == null) {SortField = 'Name'; } return SortField;  }
        set;
    }
    /***
    * SortToggle - toggles the sorting of query from asc<-->desc
    ***/
    public void SortToggle() {
        SortDirection = SortDirection.equals('asc') ? 'desc NULLS LAST' : 'asc';
        // reset alpha filter and sort sequence when sorted field is changed
        if (SortFieldSave != SortField) {
            SortDirection = 'asc';
            AlphaFilter = 'All';
            SortFieldSave = SortField;
        }
        // run the query again
        BuildQuery();
    }
    /***
    * DoSomethingOne - do something with one selected User
    ***/
    public PageReference DoSomethingOne() {
        system.debug('SelectedOneUser: ' + SelectedOneUser);
        return null;
    }
    /***
    * DoSomethingMany - do something with many selected Users
    ***/
    public PageReference DoSomethingMany() {
        for (Id UserId : UserSelectedSet) {
            system.debug('Checked: ' + UserId);
        }
        return null;
    }
 
    public class UserSubclass {
        public Boolean aCheckBox {get;set;}
        public User  aUser {get;set;}
        // sub-class initialization
        public UserSubclass(User a, Boolean chk){
            aUser = a;
            aCheckBox = chk;
        }
    }
}