Not sure if this is still relevant, seeing as no-one has a working solution yet.
I built this guy a little while ago, we only work-flowed the opportunity entity, it's easy to jack up and make dynamic.
Add a popup button to your button block that calls the asp via custom content:
HERE'S THE ASP PAGE:
<!-- #include file ="../sagecrm.js"-->
///////////////////////////////////////////////////////////
try
{
//Declare variables
var SID
var OppoId
var OppoRec
var WinID
var WfRec
var WfID
var StateId
var StateName
var StateRec
var StateDesc
var contentBlock = CRM.GetBlock("content");
//Get context and records
//Session ID
SID = Request.QueryString("SID");
//Opportunity ID and associated workflow record - you can elaborate and define other entities too
OppoId = CRM.GetContextInfo("Opportnity","oppo_opportunityID");
if (!OppoId){
OppoId = Request.QueryString("Key7");}
OppoRec = CRM.FindRecord("Opportunity", "Oppo_opportunityid ="+OppoId);
if (!OppoRec.eof){
WinID = OppoRec.oppo_workflowID;}
//Get workflow Records: Workflow, state, description etc.
WfRec = CRM.FindRecord("WorkflowInstance", "wkin_instanceid ="+WinID);
if (!WfRec.eof){
WfID = WfRec.wkin_workflowid;
StateId = WfRec.wkin_currentstateID;}
var StateRec = CRM.FindRecord("WorkflowState","wkst_stateID="+StateId);
if (!StateRec.eof){
Statename = StateRec.WkSt_name;
StateDesc = StateRec.Wkst_description
if(StateDesc == undefined){
//If state description is undefined pass a generic message
StateDesc = "Sorry I can't help any more right now. Kindly inform your admin to update the workflow description"}}
//Start buiding HTML to inject into page
//overlay prevents unecessary hyperlinking/clicks etc.
var strDiagram ='<div id="target-div">Loading Please Wait. . .</div>';
//create Onload Function to inject code
strDiagram +="";
//populate ontent block and call page
contentBlock.contents = strDiagram;
CRM.AddContent(contentBlock.Execute());
Response.Write(CRM.GetPage());
}
catch(exception)
{
//Your Error handling code code goes here
Response.Write(CRM.GetTabs());
Response.Write('<table class="content"><tbody><tr><td colspan="2" class="gridhead"><b>There has been an error</b></td></tr></tbody></table>');
Response.Write("<table><tbody><tr><td class="row1"><b>Error Name:</b> </td><td class="row1">"+exception.name+"</td></tr></tbody></table>")
Response.Write("<table><tbody><tr><td class="row1"><b>Error Number:</b> </td><td class="row1">"+exception.number+"</td></tr></tbody></table>")
Response.Write("<table><tbody><tr><td class="row1"><b>Error Number:</b> </td><td class="row1">"+(exception.number & 0xFFFF)+"</td></tr></tbody></table>")
Response.Write("<table><tbody><tr><td class="row2"><b>Error Description:</b></td><td class="row2">"+exception.description+"</td></tr></tbody></table>");
}
finally
{
//End Section
Response.Write(EndBody);
Response.End();
}
%>