|
|
Here’s a usability solution that was necessitated by my desire to present a logical, workable solution to my end-user. I’m still learning jQuery so my solution may not be the most elegant – but it works. I welcome any improvements!
The Setup
I have a SharePoint site that is displaying the results of an SQL stored procedure. I’m using Quest Web Parts for SharePoint – qSIListView part which is part of their fine System Integration web parts package. The great thing about these web parts is that I can create a stored procedure on a database and then use the Filter capabilities of the qSIListView to supply the stored procedure with the parameter values. It’s a pretty slick solution and very easy to configure. My problem is that when you use the filter fields as the Parameter input fields, only the “Equals” operator has any meaning. I can select “Begins with” or “Contains” but it will only just pass the parameter value and not the operator. That means that my End User will be presented with a lot of false options. To avoid the confusion, I would like to present the user with one operator - “Equals”, or in the case where I’m trying to do some wild card matching in SQL, I would remove all but “Contains”. You get my point. The problem is that the Web Parts do not have the ability to filter out the operator selections. I’ve submitted this change idea to Quest for future versions but in the mean time, I needed to find a solution. My solution was to use jQuery.

Solution
There are many posts out on the web about using jQuery to manipulate the SharePoint interface. One of the best sites for jQuery on SharePoint can be found on EndUserSharePoint.com. The solution I am talking about today can be used in any web environment, including SharePoint. Essentially, my short script removes all <option> elements from all select boxes that match a certain text value. This effectively narrows the choices presented to the User to only the valid choices, Exclude from search and Equals.
To do this, I placed a Content Editor Web Part (CEWP) onto my page and pasted my script in it. In the script, I use jQuery to select all <OPTION> elements of the page and remove them if they contain any of the invalid choices. The script is pretty straight forward. I have jQuery stored in a script library on my SharePoint site. This library provides read-access to all users on the site. It is also a common place to store all of my scripts. A good post on creating a script library can be found on here.
Once I load the document, I have search for all matching <OPTION> elements and remove them.
<script src="http://mysharepointdomain.com/scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
$("option").remove(":contains('Does not equal')");
$("option").remove(":contains('Contains')");
$("option").remove(":contains('Starts with')");
$("option").remove(":contains('Ends with')");
$("option").remove(":contains('Is empty')");
$("option").remove(":contains('Is not empty')");
});
</script>
That’s it! The end result looks like this.

As I said earlier, this is a pretty simple solution to a problem that I was having. Now, every time I use filter fields to supply parameter values, I can be assured that I have presented my User with valid options.
I welcome any feedback!
I received an email yesterday that made it official! I’m presenting at SharePoint Saturday – Ozarks on June 12, 2010! This is special for me because this was my first SharePoint Saturday, and it really stoked the passion that I have about developing SharePoint solutions. I’m presenting What I Wish I Knew Before I Implemented SharePoint presentation that I have done at other conferences.
Keep track of all the chatter around the conference. Follow the hash tag #spsozarks on Twitter.
Oh, I know I just moved and all but seriously, since we’re on the topic of the Ozarks. If you would like to have a charismatic SharePoint Consultant take great care of your clients, and your business is somewhere close to Springfield, MO. Let’s talk!
I’ll be bringing the Mood Dudes so be prepared to duck!
Every so often, I come across sites that have the default Heading entries on the Quick Launch deleted. I decided to write them down here in case I ever needed to put them back. It’s also handy to be able to navigate to the All Items link in a site with no Quick Launch. This is really for my reference but I hope this helps someone else out!
Default Quick Launch Heading Paths
View All Site Content
/[web url]/_layouts/viewlsts.aspx
Documents
/[web url]/_layouts/viewlsts.aspx?BaseType=1
Lists
/[web url]/_layouts/viewlsts.aspx?BaseType=0
Discussions
/[web url]/_layouts/viewlsts.aspx?BaseType=0&ListTemplate=108
Sites
/[web url]/_layouts/viewlsts.aspx?ShowSites=1
People and Groups
/[web url]/_layouts/people.aspx
Recycle Bin
/[web url]/_layouts/recyclebin.aspx
 Me and my Alter Ego!
If you were in any of my presentations in Kansas City, Indianapolis, Omaha or New Orleans and caught a flying Mood Dude, take a picture of you and your new friend and send it to Mood Dudes and I will post it up here on the site.
Let’s see how creative you can get!

I am literally heading out the door to the airport to catch a flight to New Orleans for SharePoint Saturday! I will be presenting, “What I Wish I Knew BEFORE I Implemented SharePoint”. I really enjoy this presentation and I hope that anyone attending will enjoy it as much as I do.
NewOrleansTech.net wrote a great article about it.
If you can come and join us – do! I’d love to meet you!
OK – Off to the airport!
One of the reasons I like developing for SharePoint is that I get to work with many different technologies and platforms. When I am designing a custom list for (display, edit or new), There are times where I may have a delimited string in a field that I want to display differently on the screen. Since the forms are all XSL style sheets, it is helpful to have a few XSL templates to process the data.
I wrote this XSL template so I could wrap some HTML around any element in a delimited list. This is specifically geared towards XSL 1.0. In XSL 2.0, I would most likely use tokenize. I’m not an expert at XSL so if anyone has any suggestions that would improve this template, please leave comments.
<xsl:template name="split-string">
<xsl:param name="list" />
<xsl:param name="delimiter" />
<xsl:param name="id" />
<xsl:if test="normalize-space($list)">
<xsl:variable name="newlist">
<xsl:choose>
<xsl:when test="contains($list, $delimiter)">
<xsl:value-of select="normalize-space($list)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(normalize-space($list), $delimiter)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="first" select="substring-before($newlist, $delimiter)" />
<xsl:variable name="remaining" select="substring-after($newlist, $delimiter)" />
<!-- This is where you need to put the display code -->
<a>
<xsl:attribute name="href">./Attachments/<xsl:value-of select="$id" />/<xsl:value-of select="$first" /></xsl:attribute>
<xsl:attribute name="target">_blank</xsl:attribute>
<img src="~/_layouts/images/doclink.gif" width="16" height="16" alt="" border="0" />
<xsl:value-of select="$first" />
</a>
<!-- end display code -->
<xsl:if test="$remaining">
<!-- I put a little display code here also -->
<br />
<!-- end display code -->
<xsl:call-template name="split-string">
<xsl:with-param name="list" select="$remaining" />
<xsl:with-param name="delimiter">
<xsl:value-of select="$delimiter"/>
</xsl:with-param>
<xsl:with-param name="id"><xsl:value-of select="$id" /></xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
You can add or remove variables depending on what you need. In the above example code, I had a semi-colon list of email attachment file names that were attached to the list. I wanted to create a ‘clickable’ link to each file, which is why I needed the ID field. Normally, you wouldn’t need the ID field.
This is how I called the template in my XSL:
<xsl:call-template name="split-string">
<xsl:with-param name="list"><xsl:value-of select="@EmailAttachmentNames" /></xsl:with-param>
<xsl:with-param name="delimiter">;</xsl:with-param>
<xsl:with-param name="id"><xsl:value-of select="@ID" /></xsl:with-param>
</xsl:call-template>
After the Superbowl, where the “Who Dat Nation” conquered the Indianapolis Colts, CBS previewed a new program called Undercover Boss. It is an intriguing concept. Take the CEO/President of a company and have them work undercover for their own company. I DVR’d it and had the opportunity to watch the first episode last night. In this episode, the President/COO of Waste Management worked at five different locations doing different jobs, from recycling, to port-a-potty cleaning, to riding a trash truck, to picking up trash in a land fill. Along the way, he got to experience how his decisions and policies as an Executive affected the front-line employees in his company. He was even “fired” by one person for not picking up trash fast enough. The one thing that he kept saying was, “I didn’t know”. He didn’t realize that the cost cutting measures they instituted created a situation where one lady was actually doing the work of three to four individuals, but getting paid as admin staff. He found out that lady truck drivers had to pee in a coffee can because of the production quotas they had implemented. He found out that some employees were being docked two minutes of pay for each minute they were late. He also found out that he had some real good and loyal employees. Employees who needed recognition. Employees who had good attitudes and ideas. Employees who were the face of his company to their customers.
So – how does this relate to SharePoint? One thing I love about SharePoint is that it is a social computing platform. It enables team building. It encourages collaboration. It enables the flow of information to flow efficiently in many directions. Used effectively, C-Level Executives don’t have to say – “I didn’t know.”
Here are some ideas on how Management can leverage SharePoint in their company.
- Executive blogs. I don’t care what company you work for, all employees are interested in what the Executive Team is doing to make sure that they have jobs in the future. It doesn’t take much time for a CEO or President to jot down a few notes about the direction of the company. It is commonly known that successful companies have leaders who are visionary, and communicate that vision to the company. When employees feel that they play an active part in that vision, they are more productive and loyal. When employees see the CEO communicating his personal thoughts in a blog, managment becomes more real instead of some faceless entity handing down edicts.
- Surveys. Want to know what people think about a certain subject? Ask them. SharePoint has surveys right out of the box! And, they are easy to create.
- BI. SharePoint has some pretty good BI tools. With Dashboards, LOB data integration, Excel services, and workflow, among others, SharePoint is positioned to be an efficient platform for surfacing BI data.
- Search. How many times have you known a piece of information exists in the company but you can’t find it, so you recreate it. How many hours do you spend searching for the right piece of information? Sam Goodner has blogged about what CEO’s don’t want to hear. He also talks about what they do want to hear. In one of his examples, he documents how it costs $28,125 per year per employee because of poor findability in their company. Now I don’t know if these are actual numbers but think about it, can you quantify your informational findability?
- Workflow. Whether you use the OOB workflows or create your own with Designer or Visual Studio, processes can be automated making your business more efficient.
- My Sites. While this is most likely one of the most controversial parts of SharePoint in an organization, if an organization embraces My Sites, you will have realized the 360 degree aspect of social computing. What happens when I need to know who in my company is an expert on a certain subject? I can do a People Search to find someone who is an expert on that subject? I can then visit their site and find papers and such that they have published on the subject. I can establish a relationship with them and invite them to collaborate something I am working on. Just think of the possibilities for organizations that have offices throughout the world.
These are just some ideas. Look around you. Social computing has taken hold in our everyday lives. With Facebook, Twitter, LinkedIn and FourSquare becoming household words, employees are expecting that same type of interactivity and socialization in their company. Executives that embrace these technologies and actively participate in these technologies, will never again have to say, “I didn’t know…”.
Normally, I write solutions to problems. This time around, I need some suggestions to get ideas on how to design a solution to a problem.
The credit department where I work accumulates/produces documents to support the credit limit they grant our customers. We have categorized them as :
- Financial Statements
- Agency Reports
- Parent Guarantees
- Other
We have defined a content type for each of these types of documents. With each of these documents, one common field is the Company Name field that describes the company that the document refers to.
The Company is unique in it’s structure. Each Company can be a Parent company or it can be the Parent to other companies. I created a Company list that had the fields Name and Parent where Parent was a lookup field type to the Company list. We currently have the list populated by about 4500 company names with the parent relationships defined.
List: Company
- Company Name, Text Field (required)
- Parent, Lookup of Company List (Company Name field) (not required)
In the document list that contains the four content types, each content type has a Company field that is a lookup to the Company List.
When we were discussing how to design this “application”, the user talked about how he would like to have a view where he could see all documents that related to a company, whether these documents applied directly to the company or one of it’s subsidiaries. Another requirement would be that the documents for one particular company would be easy to find/view.
As for volume, each company (so far at 4500) will have at minimum 1 of each document types but more than likely will contain 10 – 20 documents with a small growth rate. There is no document disposition being considered. From their standpoint, once a document goes into the system, it becomes a historical record for that company. So – we’re looking at about 45,000-90,000 documents initially and it will grow.
My original thought was that to stay within the 2000 item soft limit per view, I would create a folder in the Document Library for each Company created in the Company list. I would then have the users save their documents in the folder that corresponded to the company name. To achieve the view of the data where they could see all documents that applied to the parent and child companies, I would use the relationships defined in the Company list to create a custom view using the DataView Web Part.
So – here are my questions:
- Do I need a separate folder for each company? Am I limiting myself?
- If we just use a Company Name field using the lookup list, would we run into performance problems?
- If we do use the folder, is there a way to automate the creation of the folder when I create a new Company in the Company List.
- If we do use folders, is there a way to prevent documents from being created outside of the folders?
- Can a document inherit a property from it’s parent? (i.e. could a document get it’s company name by being saved into a specific folder with the right company name?
- (If folder) How do I prevent users from saving documents into the document library outside of a folder?
I’m sure there are more questions that I need to be asking. It has been so long since I worked in Designer or the Web interface. I’ve been living in Visual Studio for the last year. Leave comments / remarks / insults. Anything is appreciated.
 SharePoint Saturday was a huge success. I had a lot of fun. To all of the organizers – this was truly one of the best organized conferences I have attended. The speaker dinner was a blast and the venue was perfect for the creativity that SharePoint encourages! Thank you! If you ever do another one, I hope I am fortunate to present again.
For all who attended my presentation – I Wish I Knew That (What I Wish I Knew Before I Implemented SharePoint), you can download my slide deck by going to my Presentation Notes page. If you were one of the lucky few to capture a Happy Mood Dude, take a picture of yourself with it and send it to me. I’d love to post it on the site.
|
Contact Me 
David Petersen MCSD, MCTS
|
Recent Comments