Rounded Corners on Web Parts

The Holy Grail of SharePoint branding - at least as far as I’m concerned – is rounded corners on Web Parts. Every design that comes in has this at first. As mentioned yesterday there are examples of doing this for the web part’s title - I’ve done this using Madalina’s instructions and Heather Solomon has some instructions too.

However, as far as I know nobody has yet figured out a way of putting rounded corners on the bottom corners of web parts. The HTML they have does not suit them to do this via CSS. The only idea I’ve had previously was to use ControlAdapters to modify the output of of the Web Part itself. And I’m pretty sure you’d have to write an adapter per web parts. That kind of sucks; no customer is going to be in a hurry to pay for that.

Well, when I was looking at putting borders around an entire web part zone, I had a thought. What we really need to do is insert elements into our page. jQuery can do that sort of thing. Could I use jQuery to find each web part and wrap some tags around it? Continue reading

Rounded Corners on Web Part Zones

Curiously, one of my more popular blog posts is about putting rounded corners on things in SharePoint. It does seem that this is a pretty popular question. As a side note, Heather Solomon has a post about doing this for web part titles, though I followed Madalina’s instructions.

Anyway, one design requirement that come up repeatedly is rounded borders on Web Parts. I swear, it comes up with every design – and it isn’t possible (although I have an idea – more on that tomorrow). What you can do, though, is have a rounded border about the entire web part zone… Continue reading

Using jQuery to fix the removal of the Title column of a list

SharePoint List items all have a Title column (although it’s display name might be changed to something else). This Title column is a string, which is unfortunate as sometimes you really don’t need a string column on a list; this was the need I faced.

You can make a Title column not required:

turn-off-title-requirement

Also, if you go to the ‘Advanced Settings’ page of your list and ‘Allow management of Content Types’ you can then go into your content types and Hide the Title column. This is okay – but the Title column is still there – it’s just being displayed with “(no title)”… Continue reading

Clean up SharePoint’s UI with jQuery

So, the case management system I’m working on has a ‘Mailbox’ library. Really, it’s just an email enabled document library, with the address set to the name of the case. Anyway, when emails are received into this list, we’d like to show the subject, sender, cc, to addresses, and so on. It turns out that email enabling a document library does in fact add columns for those properties (but they’re not automatically added to the default view).

mailbox-page-default

Neat! Until you start looking at the code itself – then it sucks… Continue reading

Use jQuery to populate and hide fields in an EditForm.aspx

We’ve got an interesting requirement. We’re using a SharePoint list to store documents which are related to K2 SmartObjects. One of my colleagues is building a custom user control that’s going to show information from this SmartObjects, and associated documents. We want to allow users to

  • click to add a document to our smart object entity
  • upload a file to a library
  • fill in some details
  • automatically associate that file by a GUID

Sounds complicated? Actually, it’s not so hard! Continue reading

Get query string parameters with Regular Expressions (in JavaScript)!

I’ve said it before, but not quite so explicitly – it’s easiest to get query string parameters with a regular expression. I keep seeing big JavaScript functions looping through and splitting the parameters up, and that might be fine if you want to store those and use them repeatedly – but if not, regexes are your friend.

This function will the value of a parameter. If the parameter requested isn’t in the query string, it returns null.If the parameter doesn’t have a value (e.g. debug in ...&debug&...) it returns an empty string.

function GetQueryParam(parameter){
var p = escape(unescape(parameter));
var regex = new RegExp("[?&]" + p + "(?:=([^&]*))?","i");
var match = regex.exec(window.location.search);
var value = null;
if( match != null ){
value = match[1];
}
return value;
}

Notes on the Microsoft.SharePoint.WebControls.DateTimeControl

It’s quite nice that this control is available to use in my own pages/web parts, but there  are issues:

Here we have in microcosm my problems with Microsoft and date/times – an assumption of the local region, and date time controls that would never be empty, right? I had exactly these same problems when writing an Outlook 2003 to SharePoint 2007 integration too. Makes me a bit annoyed! Especially as we have nullable types! Quit screwing around with DateTimes being structs, make them objects and just return me a bloody null if nothing has been selected!

ASP.NET CustomErrors can’t capture HTTP 401s…

It’s been a mad few weeks, so sorry for the posts tailing off a bit. Anyway, let’s get back into it with an interesting (and fairly short) problem.

ASP.NET applications can have custom error pages for the different HTTP responses. For example, you can have a custom “404 – Page not found”. Now, this can be a good idea, particularly for errors that produce stack traces or provide potentially sensitive information about the workings of your code. Or, heck, maybe you just want to present a nice looking error page. Continue reading

Forms Based Authentication User Management – bah!

SharePoint supports Forms Based Authentication. I suspect this isn’t news to anyone – if nothing else, I’ve posted about articles describing setting it up.

However, what SharePoint doesn’t do is give you a way of administering these users. In those articles about setting it up they all recommend using the Visual Studio ‘Configure Website’ tool. This works, but it isn’t pretty, and I wouldn’t want customers using it!

Now, it is a shame the SharePoint doesn’t have this facility – we’ve got the membership provider framework abstracting the actual storage of user details (SQL database? Active Directory? Flat file? Who cares? It all looks the same through the provider’s interface). Further, the membership provider interface gives you admin functions that you might want – like list, create, delete, update.

Thus, it seems to me that an obvious thing to provide is a user interface for administering the contents of that MembershipProvider. Sadly, it doesn’t. I suppose the problem is that a developer could extend the membership provider interface or something, but it is a pain. I figured that I can’t be the only person suffering this pain, so I decided to check on Codeplex.

(Don’t get me started on the performance of the codeplex site.)

The Community Kit for SharePoint has an FBA management, well, sub-project, I guess. I tried installing it, but soon found myself asking the same question as Wouter Van Vugt – what is the quality of this project? I mean, it installed okay, but I immediately got a NullReferenceException when I tried to use it. Looking into the code, I found some oddities too – like why is the list of users being filtered to those assigned rights to a site? Surely this should just be administered at the site collection level (well, technically, at the web-app level, but they’re usually the same thing)? That just seems an unnecessary complexity. And the Datasource control used for this lacks create, update and delete – so no clever Gridview usage.

There is also another codeplex project – Forms Base Authentication Tools and Utils for SharePoint 2007 – but it’s been in beta for over a year, and has very little activity, so I don’t know what the state of this is.

All of which, ultimately, brings me around to the idea that I’ll have to write my own (though I’m checking to see if Wouter started to do that, as he seems to have come to the same conclusion). And, actually, the crux of it isn’t a SharePoint thing – such a facility would be easy if there was a DataSource control that wrapped the MembershipProvider. I may just write a datasource to do this.