Grab this badge here!
The official blog of the Microsoft SharePoint Product Group
A lot of people have asked me how to create a button which enables if and only if a single item is selected. This isn’t something we have out of the box, but the code to get this functionality is pretty simple. I’m going to assume that you’re generally familiar with SharePoint, CustomActions, and customizing the Ribbon – if that’s not the case, you’d probably be better off researching those things before delving into this.
Basically, the enabling behavior all boils down to the following few lines of code:
EnabledScript="javascript:function singleEnable() { var items = SP.ListOperation.Selection.getSelectedItems(); var ci = CountDictionary(items); return (ci == 1); } singleEnable();"
What this does is query to get the dictionary of selected items, and if the size of the dictionary is 1 it returns true (enable), otherwise it will return false (disable). Technically, I should have used Script on Demand to call into the SP.* namespace, but since I’m calling this from the Ribbon I have a high confidence that SP.js has been loaded already.
With nothing selected:
With one item selected:
Clicking the button:
And with more than one item selected:
You could also change this to enable only if no items were selected, or if any number of items were selected. The way to make those kinds of changes should be relatively self-explanatory.
The full CustomAction code for a sample Ribbon button which enables when one item is selected is at the end of this post. The code assumes the following:
<CustomAction Id="EnableSingleSelectButton" Location="CommandUI.Ribbon" > <CommandUIExtension> <CommandUIDefinitions> <CommandUIDefinition Location="Ribbon.Documents.New.Controls._children"> <Button Id="Ribbon.Documents.New.EnableSingleSelectButton" Alt="Button enabled on single selection" Sequence="35" LabelText="Single Select" Image32by32="/_layouts/SharePointProject1/DemoButton.png" Command="SingleSelectButton" TemplateAlias="o1" /> </CommandUIDefinition> </CommandUIDefinitions> <CommandUIHandlers> <CommandUIHandler Command="SingleSelectButton" CommandAction="javascript:alert('There is only one thing selected!');" EnabledScript="javascript:function singleEnable() { var items = SP.ListOperation.Selection.getSelectedItems(); var ci = CountDictionary(items); return (ci == 1); } singleEnable();" /> </CommandUIHandlers> </CommandUIExtension> </CustomAction>
Hi! In my scenario I'm need to read some fields from current item and this operation is async (in JavaScript its look like clientContext.executeQueryAsync(...)). How I can set EnabledScript after async query has fired?