Show/Hide Multiple Web Parts

You have 4 web parts on the page but when the page loads you only see the first web part, ‘Overdue Tasks’. A dynamically created menu of all the task web parts is on the left.

When you click on ‘My Tasks’, ‘Overdue Tasks’ is hidden and ‘My Tasks’ appears in its place

Clicking on ‘All Tasks’ shows the All Tasks Web part

When you edit the page, you can see all 4 web parts and easily modify or reorder them.

Technical Expertise and Permissions needed:

  • Create views for a list
  • Add and Modify web parts on a page
  • Copy/paste some code into a content editor web part

Here I was again, trying to figure out how to show multiple views of the same list on my page. I had a task list and I wanted to show tasks for the current person (My Tasks), Overdue Tasks, High Priority Tasks and a Final view of all the tasks on the same page.

Problem is, there is a limited amount of real estate on the page to show all these views at once. I have in the past made multiple pages and placed one web part on each and made a menu that allowed me to go back and forth, the only problem is now I have to wait for a page load each time.

Fix:
I need some javascript or jquery to d hide all the webparts and only show me the one web part I want to see. My solution also has to do the following:

  • Be easy used by non-technical users
  • Work no matter how many web parts are included
  • Not hide the web parts in ‘edit page’ mode

Here is what I came up with:

I created views for Overdue Tasks, and High Priority in my task list. (All Tasks and My Tasks are created by default)

I created 4 web parts of the task list in one column on my page. I set there width to 600 px each gave each one a title with the word “Task” in it (my keyword). I set there chrome type to title only and I changed their view to one of the four views I wanted to show.

Next I added a content editor web part and added the following code:

<script type=text/javascript>
////////////////////////////////////////// User Chosen Parameters ///////////////////////////////////////////////
var displayFirst=false			// Show the first web part on load
var menuTitle="" 				//Title of the top menu. If empty, spacing will be removed
var keyWord="Department"		//The keyword in the title of all web parts used in this code.  ie any web part with the word 'Tasks' will be hidden and added to the menu
var menuType="DropDown" 		//Enter 'List' or 'DropDown'
//--------------------------------------------------------------------------------------------------------------------------------------------------
</script>

<div class=content id=jLoadDiv></div>

<script type=text/javascript>
if(typeof jQuery=="undefined"){
	var jQPath="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/";
	document.write("<script src='",jQPath,"jquery.js' type='text/javascript'><\/script>");
}
</script>

<script type=text/javascript>
$("document").ready(function(){
  if(menuTitle!="")
  {$("#jLoadDiv").append("<p class='ms-WPHeader'><H3 class='ms-standardheader ms-WPTitle'>"+menuTitle+"</h3></p>")}
  hideZones(1,displayFirst);
});

function show(item)
{
 hideZones(0,false); //hide all web parts
 var webPart
 if(menuType=="List"){webPart=item.id}
 else if(menuType=="DropDown"&&item!="none"){webPart=item}
 else if(menuType=="DropDown"&&item=="none"){return false;}
 document.getElementById(webPart).style.display=""; //Show selected web part
}

function hideZones(writeMenu,displayFirst)
{
    var menu=""
	var menuDD=""
	if (displayFirst==false)
		{menuDD="<option value='none'>--- Select an Item ---</option>"}
    var listTitle = $("td:contains('"+keyWord+"')");//make an array of the titles of the web parts

    $.each(listTitle, function(i,e)
	{
		var listZone=listTitle[i];
		var wpnum
		if (listTitle[i].title.length!=0){
		//slice off the table title and select the web part number
		wpnum="MSOZoneCell_WebPartWPQ"+listZone.id.substring(15);
        //If not in edit mode, hide the web parts
		if (displayFirst==false)
		{
		  document.getElementById(wpnum).style.display="none";
		}
		else
		{
		  displayFirst=false;
		}
		var Title=listZone.title.split(" - ")// get rid of the description by splitting on the " - " and only showing the first part
		menu=menu+"<li><a href='javascript:show("+wpnum+");'>"+Title[0]+"</a></li>"
		menuDD=menuDD+"<option value="+wpnum+">"+Title[0]+"</a></option>"
		}
	});
    if (writeMenu==1&&menuType=="List")
		{$("#jLoadDiv").append("<ul>"+menu+"</ul>")}
	else if (writeMenu==1&&menuType=="DropDown")
		{$("#jLoadDiv").append("<select onchange='javascript:show(this.value)' id='webShowHide'>"+menuDD+"</select>")}
} //end function
</script>

The code has three options:

var keyWord=”Tasks” – Put the keyword thats in all your web part titles here

var displayFirst=true – Leave this true if you want the first web part to show up on load

var menuTitle=”Whatever you want the title of your menu to be”

Viola!
Now the code will go out and add any web part that has your keyword in the title to a menu and then hide it. When you click on the menu item all the web parts will be hidden except for that web part (view).

UPDATE:
1 Fix has been added.
The webpart description has been filtered out so it won’t show up in the menu

There is a new menu type at the type, since several people asked for a drop down instead of a list for the menu.

At the top of the code, change:
var menuType=”List” – to show the menu as a list
var menuType=”DropDown” – to show a drop down list with all your selected web parts

Drop Down Menu


24 Responses to “Show/Hide Multiple Web Parts”

  1. SharePoint Links for 2009-07-20 | MarkSimon.de Says:

    [...] Show/Hide Multiple Web Parts A tutorial on how to to create a view/web part toggle menu in SharePoint [...]

  2. Dana Says:

    I desperately need to accomplish this same thing – but am definitely not a “techie” person. I can follow all your instructions perfectly – except all of the content editor webpart code is not visible.

    Would it be possible for you to share? This is phenomenal! Thanks for any assistance you can provide.

    • wyly Says:

      Dana,

      If you are not seeing all the code, the best option is to ’select copy to clipboard’ or ‘view plain’ at the top of the code box then copy and paste to your Content Editor Web Part. Hope this helps!

  3. chris Says:

    interesting…. a ‘codeless solution’ that requires 30+ lines of javascript. Does ‘codeless’ mean only no server-side code?

    • wyly Says:

      Codeless means you don’t have to break out the visual studio and custom create a new web part.

      Just copy and paste some javascript. This means you a: don’t have to know how to code, or b: have any other special permissions other than being able to add a content editor web part to the page.

  4. Matt Says:

    I have one list that I made several views out of. I created a webpart page and put your code in a CEWP. My keyword is “Issues” for all of my views and have changed this in your code to reflect that… However, the only thing this code does is put numbers within the CEWP. I see 02. 03. 04. 10. 11. Can you give me any advice?

    • Matt Says:

      If you highlight all of the code that’s on the page, it grabs the numbers associated with that line of code too. That was what my problem was and I’d like to thank Byron for helping me with it. One more suggestion, would it be possible to just get the title of the webpart and not the description of the list too? All of my links for the different views work but the links all have the view name – Description of the list. Problem is that it says the same thing many times over and gums up the page a bit. Any fixes for that?

  5. Marz Says:

    Hi, when the code is used for displaying an image, it just displays the web part title and its description. The image is not being displayed. How can the code be modified.

    • wyly Says:

      Interesting!

      I just tested it on an image and it did work, though I did see the description as well as the title. If it is not hiding/displaying the image for you I would recomend trying another list and see if it’s only the images, because it worked for me. I will make some code that strips the description.

    • wyly Says:

      The newest iteration of the code now strips the description from the menu item.

  6. Kenneth Says:

    Yippie! I got this working on my first attempt. Thanks! A couple of questions…

    var displayFirst=false doesn’t seem to work. I still get the “first” (alphabetic? or just the first webpart in the zone?) one displayed. Is there something else I need to do to start up with nothing more than the ‘menu’ that your script generates in the content editor webpart?

    Also, the content editor webpart eats up a lot of whitespace on the page. I’ve got Chrome set to Title Only, which works for my needs, but then there is a pretty big white space before the menu draws, and then one after the menu array. I’d like to tighten this up a little. Any suggestions? Better still, any thoughts on how to replace the array menu with a “standard” pulldown? That would take up minimal space, but give me virtually unlimited choices in this feature.

    Thanks again!

    • wyly Says:

      The displayFirst=false now works. thanks for bringing that to my attention. The webparts are displayed top to bottom I believe, at least that is how it works for me. you are the second person to suggest the dropdown… It would not be hard, perhaps I will attempt it in the next few days.

    • wyly Says:

      All your suggestions are a reality! If you leave the title field blank, the white space will disapear, and you now have an option for a drop down or a list to drive the menu.

  7. Shawn Says:

    Is there a way to not show any tasks at all until a task type is selected? That is, is there a way to keep the 4 on the right side hidden until a link on the left is selected?

    • wyly Says:

      Yes,

      Find the variable at the top of the script that says:

      var displayFirst=true

      set it to false and nothing will show up till a menu item is selected.

      The default code above should do that. Try coping and pasting it in if you have an older version.

  8. Jono Says:

    Excellent Post. Nice work!

  9. 6 Quick Ways to easily “Juice” your SharePoint Pages (Re-post) | Wahid's Blog Says:

    [...] Go to: http://wyly.wordpress.com/2009/05/22/showhide-multiple-web-parts/ [...]

  10. Jim Says:

    I can’t figure out how to make the drop-down work with the chrome set to “Normal” and “Border-Only” on the webparts. This script works great when I leave the chrome set to default, but all of the web parts on my page need to have borders.

    When in edit mode, the drop-down and script work as if not in edit mode. When exited out of edit-mode, the drop-down is empty, and all webparts automatically appear on the page with borders.

    • wyly Says:

      Jim,

      I confirmed part of what you found, here is what you can do:

      When the chrome type is set to “none” or “border only” no title appears. The reason is that this prevents the code from working properly since it looks for a table cell titled with the key word. In the above mentioned chrome types this table cell does not exist since the title does not exist.

      So you must have a title however the boder is optional. If you need a border, select the chrome type “title and border” and the code will work correctly.

  11. Jim Says:

    Thank you for this cool script and for your hlpe with it! I am now trying to stretch out its application to include multiple web part zones. I am trying to create a Sharepoint page that has several zones, each containing several web parts. The script works well with the first web part zone, but I can not control different areas of the page independently.

    I have added a separate content editor web part to each web part zone. Each content editor web part contains this script with a different keyword and drop down list relative to its web part zone. However, if I try to make a selection in a drop-down list, it changes the content across zones.

    I am unable to only change the content in the zone that each script resides in. I have tried changing the variable names to make them unique in each zone, but the effect is the same. I have spent a lot of time looking at the code, but I have not been able to determine what I could modify that would make the script web part zone specific.

    • Jim Says:

      Nevermind, I figured out my original question. I simply added a “2″ to the end of all of the variable names, and it applied only to the current zone. This script works very well!

Leave a Reply