Unless you have generated strongly typed classes, looking up Optionset values for the selected value or any other value, is one of the most annoying things to do as a developer. You can use the bookmarklet below to display Optionset values, along with the Optionset text for all the Optionsets on a form. You can drag the minified source to your bookmark bar, for creating the bookmarklet.
This is how a sample contact form looks after executing the bookmarklet.
Unminified
(function () { var contentPanels = Array.from(document.querySelectorAll('iframe')).filter(function (d) { return d.style.visibility !== 'hidden' }); if (contentPanels && contentPanels.length > 0) { var Xrm = contentPanels[0].contentWindow.Xrm; var frameDocument = contentPanels[0].contentWindow.document; Xrm.Page.ui.controls.forEach(function (c) { if (c.getControlType() !== 'optionset') return; var attribute = c.getAttribute(); var selectedOptionValue = attribute.getValue(); var options = attribute.getOptions(); var isClearOptions = options.some(function (o) { return o.text.indexOf(' (') === -1; }); if (isClearOptions) { c.clearOptions(); } options.forEach(function (o) { if (o.text && o.text.indexOf(' (') === -1) { o.text = o.text + ' (' + o.value + ')'; } c.addOption(o); }); if (selectedOptionValue && isClearOptions) { attribute.setValue(selectedOptionValue); } }); } else { alert('Entity form not detected'); } })();
Minified
javascript:(function(){var contentPanels=Array.from(document.querySelectorAll('iframe')).filter(function(d){return d.style.visibility!=='hidden'});if(contentPanels&&contentPanels.length>0){var Xrm=contentPanels[0].contentWindow.Xrm;var frameDocument=contentPanels[0].contentWindow.document;Xrm.Page.ui.controls.forEach(function(c){if(c.getControlType()!=='optionset') return;var attribute=c.getAttribute();var selectedOptionValue=attribute.getValue();var options=attribute.getOptions();var isClearOptions=options.some(function(o){return o.text.indexOf(' (')===-1;});if(isClearOptions){c.clearOptions();} options.forEach(function(o){if(o.text&&o.text.indexOf(' (')===-1){o.text=o.text+' ('+o.value+')';} c.addOption(o);});if(selectedOptionValue&&isClearOptions){attribute.setValue(selectedOptionValue);}});}else{alert('Entity form not detected');}})();void 0;
Awesome bookmarklet!
But you should not control text.indexOf(‘ (‘) === -1 this. Some time option set text contains ‘(‘ like “English(U.K)”.
In my scenario I never have any option sets that have a bracket in the text. I put that line in so that even if you run the bookmarklet multiple times it would still produce the same text. It is a choice between a character that looks nice and removing the capability to run the bookmarklet multiple times and producing the same result. What solution do you suggest?
If you change if (o.text && o.text.indexOf(‘ (‘) === -1) to if (o.text ), it will work even if you click multiple times like before.
One other reason I did it this way, is not to delete and re-add the options when I see a “(” in the options. This signals to me that it has already been processed and I don’t need to append the text and values again. It probably doesn’t make a huge difference in performance if I do it all again I guess.