Knowledge Base Article
Hi sameburn , JackLacava
I am running into some trouble here and hoping I might get your advice. I'm trying to create a dashboard that dynamically selects the type of component to display (it can either be a button or a combo box). I was leveraging an example from the 2023 dynamic dashboards which works beautifully, but when I try the same thing, it doesn't actually generate the parameters. Here's what I'm seeing in my results:
Here's what I'm seeing if I run the Dynamic Form example from Wave 2023 using the same parameter with the referenced code - it seems to create that parameter as expected. I've tried fiddling with the GetDynamicParametersForDynamicComponent function but nothing I change there seems to actually generate these parameters. Any ideas would be greatly appreciated!
using OneStream.Shared.Common;
using OneStream.Shared.Engine;
using OneStream.Shared.Wcf;
using OneStream.Shared.Database;
using OneStreamWorkspacesApi.V800;
using OpenXmlPowerTools;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
using System.Text.RegularExpressions;
namespace Workspace.__WsNamespacePrefix.__WsAssemblyName
{
internal static class DynamicFormDashboard
{
internal static XFLoadDashboardTaskResult OnLoadDynamicFormDashboard(SessionInfo si, DashboardExtenderArgs args)
{
if (args.LoadDashboardTaskInfo.Reason == LoadDashboardReasonType.Initialize && args.LoadDashboardTaskInfo.Action == LoadDashboardActionType.BeforeFirstGetParameters)
{
using (var dbConnApp = BRApi.Database.CreateApplicationDbConnInfo(si))
{
var tableExists = DbSql.DoesTableExist(dbConnApp, "DynamicFormItems");
if (!tableExists)
{
var sql = @"IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DynamicFrmItems]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[DynamicFrmItems](
[ComponentType] [nvarchar](50) NOT NULL,
[Text] [nvarchar](100) NOT NULL,
[Required] [bit] NOT NULL,
[BoundParameterName] [nvarchar](100) NOT NULL,
[SortOrder] [int] NOT NULL
)
END";
BRApi.Database.ExecuteActionQuery(dbConnApp, sql, null, false, false);
}
}
}
return new XFLoadDashboardTaskResult(); ;
}
internal static WsDynamicComponentCollection Get_0000_GeneratedForm_DynamicComponents(SessionInfo si, IWsasDynamicDashboardsApiV800 api, DashboardWorkspace workspace,
DashboardMaintUnit maintUnit, WsDynamicDashboardEx dynamicDashboardEx, Dictionary<string, string> customSubstVarsAlreadyResolved)
{
var wsDynCompMembers = new List<WsDynamicDbrdCompMemberEx>();
var formItemsTable = GetDynamicFormItemsTable(si);
if (formItemsTable?.Rows.Count > 0)
{
foreach (DataRow drFormItem in formItemsTable.Rows)
{
var compName = drFormItem["ComponentType"].ToString() switch
{
"TextBox" => "txt_DynamicFormBase",
"CheckBox" => "chk_DynamicFormBase",
"ComboBox" => "cbx_DynamicFormBase",
"DateSelector" => "dpk_DynamicFormBase",
"RadioButton" => "rbg_DynamicFormBase"
};
var text = drFormItem["Text"].ToString() ?? string.Empty;
var nameSuffix = Regex.Replace(text, @"\s+", "");
var templateSubVars = new Dictionary<string, string>
{
{ "DynamicComponentItem_Text", text },
{ "DynamicComponentItem_BoundParameter", drFormItem["BoundParameterName"].ToString() }
};
var wsDynCompMemberEx = BuildDynamicComponentFromStoredComponent(si, api, workspace, maintUnit, dynamicDashboardEx, compName, nameSuffix, templateSubVars, WsDynamicItemStateType.MinimalWithTemplateParameters);
if (wsDynCompMemberEx != null)
{
// Set Formatting
if ((bool)drFormItem["Required"])
{
var comp = wsDynCompMemberEx.DynamicComponentEx.DynamicComponent.Component;
var format = new ComponentDisplayFormatBuilder(comp.DisplayFormat);
format.SetValue(ComponentDisplayFormatBuilder.constLabelTextColor, XFColors.Firebrick.Name);
comp.DisplayFormat = format.FormatString;
}
wsDynCompMembers.Add(wsDynCompMemberEx);
}
}
}
return new WsDynamicComponentCollection(dynamicDashboardEx, wsDynCompMembers);
}
private static WsDynamicDbrdCompMemberEx BuildDynamicComponentFromStoredComponent(SessionInfo si, IWsasDynamicDashboardsApiV800 api, DashboardWorkspace workspace, DashboardMaintUnit maintUnit,
WsDynamicDashboardEx dynamicDashboardEx, string storedComponentName, string nextLevelNameSuffixToAdd, Dictionary<string, string> nextLevelTemplateSubstVarsToAdd, WsDynamicItemStateType dynamicItemStateType)
{
var storedComp = EngineDashboardComponents.GetComponent(api.DbConnAppOrFW, workspace.UniqueID, maintUnit.UniqueID, storedComponentName, false, true);
if (storedComp != null)
{
var wsDynamicCompEx = api.GetDynamicComponentForDynamicDashboard(si, workspace, dynamicDashboardEx, storedComp, nextLevelNameSuffixToAdd, nextLevelTemplateSubstVarsToAdd, TriStateBool.TrueValue, dynamicItemStateType);
if (wsDynamicCompEx != null)
{
var wsDynCompMember = new WsDynamicDbrdCompMember();
return new WsDynamicDbrdCompMemberEx(wsDynCompMember, wsDynamicCompEx);
}
}
return null;
}
private static DataTable GetDynamicFormItemsTable(SessionInfo si)
{
var sql = "SElECT * FROM DynamicFrmItems ORDER BY SortOrder ASC";
using (var dbConnApp = BRApi.Database.CreateApplicationDbConnInfo(si))
{
return BRApi.Database.ExecuteSql(dbConnApp, sql, null, false);
}
}
internal static XFSelectionChangedTaskResult OnSubmitGeneratedFormClick(SessionInfo si, DashboardExtenderArgs args)
{
var taskResult = new XFSelectionChangedTaskResult(true, true, string.Empty);
var sb = new StringBuilder();
var boundParameters = GetDynamicFormItemsTable(si).AsEnumerable()
.Where(x => !string.IsNullOrWhiteSpace(x["BoundParameterName"].ToString()))
.Select(x => x["BoundParameterName"].ToString())
.ToList();
foreach (var boundParameter in boundParameters)
{
var kvp = args.SelectionChangedTaskInfo.CustomSubstVars.FirstOrDefault(x => x.Key.XFEqualsIgnoreCase(boundParameter));
sb.AppendLine($"{kvp.Key}: {kvp.Value}");
}
taskResult.Message = sb.ToString();
return taskResult;
}
}
}