Ein Widget kann einen Parameter für andere Widgets bereitstellen. Damit andere Widgets es als Parameterquelle auswählen können, muss es das korrekte Interface implementieren.
In diesem Beispiel wird das TopUserProfilesWidget
erstellt, das die erste 3 Benutzerprofile anzeigt und den geklickten Eintrag als Parameter bereitstellt.
Steuerelement
TopUserProfilesWidget
implementiert das Interface IProvideWidgetParameter
mit Widget Parametertyp OrmsWidgetParameter
. Damit werden alle Widgets TopUserProfilesWidgets
als Prameterquelle selektieren können, die den Parametertyp benötigen. Falls das Widget die Datentabelle im Voraus bekannt geben wird, muss das Widget das Interface IProvideOrmsWidgetParameter<>
implementieren.
[Serializable]
public class TopUserProfilesWidget : Widget, IProvideWidgetParameter<OrmsWidgetParameter>
{
public TopUserProfilesWidget() : base()
{
Id = "669B0B80-6CFC-4388-AA09-FBAC5BC4D213".ToGuid();
ToolboxName = "TopUserProfiles";
Icon = "bank_building";
ControllerName = nameof(TopUserProfilesWidget);
Height = 300;
HeightType = EnumWidgetHeightType.Pixel;
CssClass = "top-user-profiles";
}
public override string GetTSClassName()
{
return "BA.Ui.Widgets.TopUserProfilesWidget";
}
}
View Model
Das View Model beinhaltet in dem Fall eine Liste von Tuple<string, OrmData>
, mit den EntityTitle
und die OrmData
für den Parameter im Browser.
public class TopUserProfilesWidgetViewModel
{
public List<(string EntityTitle, OrmData ormData)> TopUserProfiles;
public TopUserProfilesWidgetViewModel()
{
TopUserProfiles = new List<(string EntityTitle, OrmData ormData)>();
}
}
h2. Controller
Der Controller wird die erste 3 BenutzerProfile aus der DB lesen und in das ViewModel ablegen.
public class TopUserProfilesWidgetController : WidgetControllerBase
{
public ActionResult Index()
{
TopUserProfilesWidgetViewModel viewModel = new TopUserProfilesWidgetViewModel();
IQueryable<OrmUserProfile> query = API.Api.ORM.GetQuery<OrmUserProfile>();
foreach (OrmUserProfile uProfile in query.OrderBy(ff => ff.LastName).Take(3))
{
OrmData uProfileData = new OrmData()
{
OrmTypeGuid = uProfile.OrmType,
OrmGuid = uProfile.Oid,
CacheId = uProfile.RecordCacheId,
TemporaryKey = uProfile.TemporaryKey
};
viewModel.TopUserProfiles.Add((uProfile.EntityTitle, uProfileData));
}
return PartialView(viewModel);
}
}
View
/Views/TopUserProfilesWidget/Index.cshtml
@model BA.Core.Models.TopUserProfilesWidgetViewModel
<div>
<ul>
@foreach ((string entityTitle, BA.Core.Configuration.Pages.Parameters.OrmData ormData) in Model.TopUserProfiles)
{
string jsonOrmData = Newtonsoft.Json.JsonConvert.SerializeObject(ormData);
<li data-ormdata="@jsonOrmData">@entityTitle</li>
}
</ul>
</div>
Script
Die TypeScript Klasse überschreibt die OnContentLoaded
Funktion, um die Click-Events auf die Einträge abzufangen. Wenn ein Eintrag geklickt wird, wird den Parameter vom TopUserProfilesWidget
aktualisiert und alle Widgets, die ihn konsumieren, werden darauf reagieren.
module BA.Ui.Widgets {
"use strict";
export class TopUserProfilesWidget extends Widget {
public override OnContentLoaded(): void {
let othis: TopUserProfilesWidget = this;
$(this.GetWidgetJQIdSelector() + “ ul li”).click(function () {
let parameter: BA.Ui.Widgets.Parameters.OrmsWidgetParameter = new BA.Ui.Widgets.Parameters.OrmsWidgetParameter();
parameter.Orms.push($(this).data(“ormdata”));
othis.SetProvidedParameter(“OrmsWidgetParameter”, parameter);
});
}
}
}
Eine Alternative ist das Objekt OrmData
im Browser zu nutzen. In dem Fall kann man damit eine Instanz von OrmData
in .ts erstellen.
Die Funktion SetProvidedParameter
bekommt den Name des Parametertyps als String
und den neuen Parameter.
Ergebnisse
Nun kann das Widget in einer Seite konfiguriert werden. Als Beispiel wird es mit einem HelloWorldWidget
konfiguriert, das von TopUserProfilesWidget
den Parameter liest.
Beim Laden kann das HelloWorldWidget
keinen Parameter lesen, wenn nichts angeklickt war.
Auf „Abraham Alder“ Klicken: