Some time we need to create dynamic tab. This we can achieve with below way :-
1) By CSS
2) By <apex:dynamicComponent
DEMO 1:- By CSS
Page :-
<apex:page controller="DynamicTabController" sidebar="false" standardStylesheets="false" showHeader="false"> <head> <style type="text/css"> .black_overlay{ display: none; position: absolute; top: 0%; left: 0%; width: 100%; height: 100%; background-color:#F8F8F8 ; z-index:1001; -moz-opacity: 0.8; opacity:.80; filter: alpha(opacity=80); } .white_content { display: none; position: relative; z-index:1002; overflow: auto; } #layer1 { position: absolute; visibility: hidden; width: 800px; height: 450px; left: 50%; top: 20%; background-color: #ccc; border: 1px solid #000; padding: 10px; overflow:scroll; } #close { float: right; } .tabs { position: relative; min-height: 550px; /* This part sucks */ clear: both; margin: 25px 0; } .tab { float: left; } .tab label { background: #eee; padding: 10px; border: 1px solid #ccc; margin-left: -1px; position: relative; left: 1px; } .tab [type=radio] { display: none; } .content { position: absolute; top: 28px; left: 0; background: white; right: 0; bottom: 0; padding: 20px; border: 1px solid #ccc; overflow: auto; } [type=radio]:checked ~ label { background: white; border-bottom: 1px solid white; z-index: 2; } [type=radio]:checked ~ label ~ .content { z-index: 1; } </style> </head> <apex:form style="none"> <center> <div class="tabs"> <apex:repeat value="{!lstAccount}" var="acc"> <div class="tab"> <input type="radio" id="tab-{!acc.Name}" name="tab-group-1" checked="True" /> <label for="tab-{!acc.Name}">{!acc.Name}</label> <div class="content"> <table width="100%"> <apex:repeat value="{!$ObjectType.Account.FieldSets.Account_FieldSet}" var="fieldSet"> <tr> <td> {!fieldSet.Label} </td> <td> <apex:inputField value="{!acc[fieldSet]}"/> </td> </tr> </apex:repeat> </table> </div> </div> </apex:repeat> </div> </center> </apex:form> </apex:page>
public with sharing class DynamicTabController { public List<Account> lstAccount{get;set;} public DynamicTabController() { lstAccount=new List<Account>(); String query = 'SELECT '; for(Schema.FieldSetMember f : this.getFields()) { query += f.getFieldPath() + ', '; } query += ' Id FROM Account limit 5 '; System.debug('query ------>'+query ); lstAccount = Database.query(query); } public List<Schema.FieldSetMember> getFields() { return SObjectType.Account.FieldSets.Account_FieldSet.getFields(); } }
Live Demo Link :-
http://amitblog-developer-edition.ap1.force.com/apex/DynamicTab
DEMO 2:- <apex:dynamicComponent >
Page :-
Class:-<apex:page controller="dynamicComponentDemoController"> <apex:form > <apex:pageBlock > <apex:pageBlockButtons location="bottom"> <apex:inputText value="{!newTabName}"/> <apex:commandButton value="Add Tab" action="{!addTab}"/> </apex:pageBlockButtons> <apex:dynamicComponent componentValue="{!tabPanel}"/> <apex:dynamicComponent componentValue="{!MyPanel}"/> </apex:pageBlock> </apex:form> </apex:page>
public with sharing class dynamicComponentDemoController { public static Component.Apex.tabPanel MyPanel {get;set;} public dynamicComponentDemoController () { MyPanel = new Component.Apex.tabPanel(); MyPanel.switchType = 'client'; List<Account> lstAccount = [select id,name,industry from account limit 5]; integer idx = 0; for(Account acc : lstAccount ) { idx ++; Component.Apex.Tab tab = new Component.Apex.Tab(); tab.id = 'tab_First'+string.valueof(idx); tab.label = acc.Name; /* Component.Apex.CommandButton command = new Component.Apex.CommandButton(); command.value='Save'; command.expressions.action='{!save}'; tab.childComponents.add(command); Component.Apex.InputText t = new Component.Apex.InputText(); t.expressions.value ='{!c.status}' ; tab.childComponents.add(t); */ Component.Apex.outputText f = new Component.Apex.outputText(); f.value = 'Industry :-'+acc.industry ; tab.childComponents.add(f); MyPanel.childComponents.add(tab); } } public void addTab() { names.add(newTabName); } string[] names = new string[0]; public String newTabName { get; set; } public Component.Apex.TabPanel getTabPanel() { Component.Apex.TabPanel panel = new Component.Apex.TabPanel(); panel.switchType = 'client'; for(integer idx = 0; idx < names.size(); idx++) { Component.Apex.Tab tab = new Component.Apex.Tab(); tab.id = 'tab'+string.valueof(idx); tab.label = names[idx]; Component.Apex.CommandButton command = new Component.Apex.CommandButton(); command.value='Save'; command.expressions.action='{!save}'; tab.childComponents.add(command); Component.Apex.outputText f = new Component.Apex.outputText(); f.value = 'Description'; tab.childComponents.add(f); Component.Apex.InputText t = new Component.Apex.InputText(); t.expressions.value ='{!c.status}' ; tab.childComponents.add(t); panel.childComponents.add(tab); } return panel; } public void save() { } }
Live Demo Link :- http://amitblog-developer-edition.ap1.force.com/dynamicComponentDemo
Very helpful code for dynamic tab using css..thanks Amit
ReplyDeleteYour Welcome Raj
DeleteHi Amit, I want to display same object details fields on different tabs for "create new record" page. how will I do it?
Deletefor example I have lead object with fifty custom fields, displaying in single form with different sections won't be user friendly, so instead I want to create each section as tab. how will I achieve this? appreciate your help. Thanks