diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/AuthenticatedBaseWebPage.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/AuthenticatedBaseWebPage.cs index b764913..f25d63e 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/AuthenticatedBaseWebPage.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/AuthenticatedBaseWebPage.cs @@ -17,6 +17,7 @@ public abstract class AuthenticatedBaseWebPage : BaseWebPage string tenantName = e.Context.Request.GetExtraData("TenantName"); if (!e.Context.Session.ContainsKey(tenantName + ".UserToken")) { + // !FIXME! this should always query the OMS for the appropriate login redirect (e.g. SAML) e.Context.Response.Redirect("~/" + e.Context.Request.PathVariables["tenant"] + "/d/login.htmld"); e.Cancel = true; } diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/BaseWebPage.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/BaseWebPage.cs index cc4da28..cffaad5 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/BaseWebPage.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/BaseWebPage.cs @@ -10,7 +10,31 @@ namespace Mocha.ServerApplication.HardcodedPages; public abstract class BaseWebPage : WebPage { - protected override IEnumerable GetHeaderControls() + protected override void OnInit(RenderEventArgs e) + { + base.OnInit(e); + + MochaWebApplication app = ((MochaWebApplication)e.Context.Application); + Oms oms = app.Oms; + + { + InstanceHandle c_Tenant = oms.GetInstance(KnownInstanceGuids.Classes.Tenant); + InstanceHandle i_Tenant = oms.GetInstancesOf(c_Tenant).First(); + + InstanceHandle r_Tenant__has__Application = oms.GetInstance(KnownRelationshipGuids.Tenant__has__Application); + InstanceHandle i_Application = oms.GetRelatedInstance(i_Tenant, r_Tenant__has__Application); + + if (i_Application != InstanceHandle.Empty) + { + + InstanceHandle r_Application__has_title__Translation = oms.GetInstance(KnownRelationshipGuids.Application__has_title__Translation); + string applicationTitle = oms.GetTranslationValue(i_Application, r_Application__has_title__Translation, "Mocha Application"); + Title = applicationTitle; + + } + } + } + protected override IEnumerable GetHeaderControls() { List ctls = new List(); ctls.Add(new HtmlLink("stylesheet", "text/css", "/madi/asset/ui-html/2024.27.5/css/mochaApp.css?plate=BMT216A&sha256-XjJJ2%2BcFxZXtxY579nwOKBNYdP1KUySxNDbxR4QGxvQ%3D")); diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/HomeWebPage.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/HomeWebPage.cs index 7a9db15..88d4352 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/HomeWebPage.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/HomeWebPage.cs @@ -14,12 +14,9 @@ public class HomeWebPage : AuthenticatedBaseWebPage protected override void OnInit(RenderEventArgs e) { base.OnInit(e); - - string tenantName = e.Context.Request.GetExtraData("TenantName"); - if (!e.Context.Session.ContainsKey(tenantName + ".UserToken")) - { - e.Context.Response.Redirect("~/" + e.Context.Request.PathVariables["tenant"] + "/d/login.htmld"); - } + + if (e.Cancel) + return; Console.WriteLine("req app path: " + e.Context.Request.Path); diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/LoginWebPage.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/LoginWebPage.cs index 3dbaf60..b26ae06 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/LoginWebPage.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/LoginWebPage.cs @@ -1,6 +1,7 @@ using MBS.Core; using MBS.Web; using MBS.Web.UI; +using MBS.Web.UI.HtmlControls; using MBS.Web.UI.WebControls; using Mocha.Core; @@ -9,6 +10,15 @@ namespace Mocha.ServerApplication.HardcodedPages; public class LoginWebPage : BaseWebPage { + public bool ProxyLogin { get; } + public LoginWebPage() + { + } + public LoginWebPage(bool proxyLogin) + { + ProxyLogin = proxyLogin; + } + protected override void InitializeInternal() { base.InitializeInternal(); @@ -100,12 +110,27 @@ text-align: center; new FormView.FormViewItem("User _name", new TextBox() { Name = "username" }), new FormView.FormViewItem("_Password", new TextBox(TextBoxType.Password) { Name = "password" } ) })); + if (ProxyLogin) + { + ((FormView)panel.ContentControls[2]).Items.Add(new FormView.FormViewItem("Proxy _User", new TextBox() { Name = "proxy_username" })); + } panel.ContentControls.Add(new Heading(3, loginFooterText)); litPasswordWarning = new Literal("

The user name or password is incorrect.

"); litPasswordWarning.Visible = _showPasswordWarning; panel.ContentControls.Add(litPasswordWarning); + if (!ProxyLogin) + { + // screw this + /* + panel.FooterControls.Add(new HtmlAnchor("proxy-login.htmld", null, "Proxy Login", null, null, new KeyValuePair[] + { + new KeyValuePair("margin-right", "8px") + })); + */ + } + panel.FooterControls.Add(new Button("_Log In") { ThemeColorPreset = ThemeColorPreset.Primary, UseSubmitBehavior = true }); Controls.Add(panel); diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/TenantedRoutingPage.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/TenantedRoutingPage.cs index f73f86c..abf6cf7 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/TenantedRoutingPage.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/HardcodedPages/TenantedRoutingPage.cs @@ -1,5 +1,8 @@ using System.Xml; using MBS.Core; +using MBS.Core.Drawing; +using MBS.Web; +using MBS.Web.UI.HtmlControls; using MBS.Web.UI.WebControls; using Mocha.Core; @@ -7,29 +10,150 @@ namespace Mocha.ServerApplication.HardcodedPages; public class TenantedRoutingPage : BaseWebPage { + public InstanceHandle Route { get; } public InstanceHandle ProcessedByCT { get; } - public TenantedRoutingPage(InstanceHandle processedByCT) + public TenantedRoutingPage(InstanceHandle route, InstanceHandle processedByCT) { + this.Route = route; this.ProcessedByCT = processedByCT; } - protected override void CreateChildControls() + protected override void OnInit(RenderEventArgs e) { - base.CreateChildControls(); + base.OnInit(e); + + Oms oms = ((MochaWebApplication)Application.Instance).Oms; + + InstanceHandle r_Route__secured_to__Domain = oms.GetInstance(KnownRelationshipGuids.Route__secured_to__Domain); + IEnumerable i_Domains = oms.GetRelatedInstances(this.Route, r_Route__secured_to__Domain); + if (i_Domains.Count() > 0) + { + InstanceHandle i_Domain_Anyone = oms.GetInstance(KnownInstanceGuids.SecurityDomains.Anyone); + if (!i_Domains.Contains(i_Domain_Anyone)) + { + // we have domains, and they are not Anyone + // so we need to check that our current user is logged in and has the appropriate domain + string tenantName = e.Context.Request.GetExtraData("TenantName"); + if (!e.Context.Session.ContainsKey(tenantName + ".UserToken")) + { + e.Context.Response.Redirect("~/" + e.Context.Request.PathVariables["tenant"] + "/d/login.htmld"); + e.Cancel = true; + return; + } + } + } + + InstanceHandle c_Tenant = oms.GetInstance(KnownInstanceGuids.Classes.Tenant); + InstanceHandle i_Tenant = oms.GetInstancesOf(c_Tenant).First(); + + InstanceHandle r_Tenant__has__Application = oms.GetInstance(KnownRelationshipGuids.Tenant__has__Application); + InstanceHandle i_Application = oms.GetRelatedInstance(i_Tenant, r_Tenant__has__Application); + + if (i_Application != InstanceHandle.Empty) + { + + InstanceHandle r_Application__has_title__Translation = oms.GetInstance(KnownRelationshipGuids.Application__has_title__Translation); + string applicationTitle = oms.GetTranslationValue(i_Application, r_Application__has_title__Translation, "Mocha Application"); + Title = applicationTitle; + + } + } + + protected override IEnumerable GetStyleClasses() + { + return base.GetStyleClasses().Union([ "uwt-header-visible" ]); + } + + protected override void CreateChildControls() + { + base.CreateChildControls(); Oms oms = ((MochaWebApplication)Application.Instance).Oms; InstanceHandle usesBuildResponseMethodBinding = oms.GetRelatedInstance(ProcessedByCT, oms.GetInstance(KnownRelationshipGuids.Control_Transaction_Method__uses__Build_Response_Method_Binding)); + InstanceHandle r_Tenant__has_mega__Menu = oms.GetInstance(KnownRelationshipGuids.Tenant__has_mega__Menu); + + InstanceHandle c_Tenant = oms.GetInstance(KnownInstanceGuids.Classes.Tenant); + InstanceHandle i_Tenant = oms.GetInstancesOf(c_Tenant).First(); + + InstanceHandle hasMegaMenu = oms.GetRelatedInstance(i_Tenant, r_Tenant__has_mega__Menu); + OmsContext context = oms.CreateContext(); PageRenderer renderer = new PageRenderer(context); + HtmlGenericControl navTop = new HtmlGenericControl("div"); + navTop.ClassList.Add("uwt-page-header"); + + HtmlGenericControl itm = new HtmlGenericControl("div"); + itm.ClassList.Add("uwt-header-item"); + itm.ClassList.Add("uwt-applicationmenu"); + + Button btn = new Button(); + btn.DropDown = new Container() + { + Controls = [ + new Container("div", [ "uwt-layout-box uwt-orientation-vertical" ]) + { + Controls = [ + new Container("div", [ "uwt-layout-item" ]) + { + Controls = [ new Image("data:image/png;base64,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") ] + }, + new Container("div", [ "uwt-layout-item" ]) + { + Controls = [ new Label("User Nam") ] + } + ] + }, + new Menu([ + new CommandMenuItem("Settings"), + new CommandMenuItem("Log Out", "~/d/logout.htmld") + ]) + ] + }; + itm.Controls.Add(btn); + + navTop.Controls.Add(itm); + + Controls.Add(navTop); + + HtmlGenericControl divContent = new HtmlGenericControl("div"); + divContent.ClassList.Add("uwt-page-content"); + InstanceHandle element = oms.Execute(context, usesBuildResponseMethodBinding); // writer.WriteRaw(String.Format("

Processed by CT: {0}

", oms.GetInstanceText(ProcessedByCT))); // writer.WriteRaw(String.Format("

Responds with Element: {0}

", oms.GetInstanceText(element))); Container ct = renderer.RenderElement(element); - Controls.Add(ct); - } + divContent.Controls.Add(ct); + + Controls.Add(divContent); + + DockableContainer ctRightSidebar = new DockableContainer + { + Position = CardinalDirection.Right, + Width = new Measurement(300, MeasurementUnit.Pixel) + }; + ctRightSidebar.StyleProperties["background-color"] = "#ffffff"; + ctRightSidebar.StyleProperties["border-left"] = "1px solid #ccc"; + + ctRightSidebar.Controls.Add(new Heading(1, "Edit Page")); + ctRightSidebar.Controls.Add(new FormView(new FormView.FormViewItem[] + { + new FormView.FormViewItem("Test Property", new TextBox()) + })); + + Container ctButtonContainer = new Container(); + ctButtonContainer.StyleProperties["margin-top"] = "32px"; + ctButtonContainer.ClassList.Add("uwt-layout uwt-layout-box uwt-orientation-vertical uwt-spacing-eighth"); + + ctButtonContainer.Controls.Add(new Button("Clone Page")); + ctButtonContainer.Controls.Add(new Button("Exit Edit Mode")); + + ctRightSidebar.Controls.Add(ctButtonContainer); + + Controls.Add(ctRightSidebar); + } } diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/MochaWebApplication.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/MochaWebApplication.cs index 4c515ed..74eaecf 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/MochaWebApplication.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/MochaWebApplication.cs @@ -85,62 +85,154 @@ public abstract class MochaWebApplication : WebApplication e.Handled = true; return; } - if (parts.Length >= 2) + if (e.Context.Request.Path == "/favicon.ico") { - string tenantName = "super"; - if (parts[1] != "madi") + return; + } + else + { + if (parts.Length >= 2) { - tenantName = parts[1]; - } - else - { - if (parts[2] == "authgwy") + string tenantName = "super"; + if (parts[1] != "madi") { - tenantName = parts[3]; + tenantName = parts[1]; + } + else + { + if (parts[2] == "authgwy") + { + tenantName = parts[3]; + } + } + + e.Context.SetExtraData("TenantName", tenantName); + + TenantHandle tenant = app.Oms.GetTenantByName(tenantName); + if (tenant == TenantHandle.Empty) + { + UpdateRoutes(null, e.Server); + + StreamWriter sw = new StreamWriter(e.Context.Response.Stream); + sw.WriteLine("

Not Found

"); + sw.WriteLine("

The requested URL was not found on this server.

"); + sw.WriteLine("

Please contact your Mocha applications administrator for further assistance.

"); + sw.Flush(); + e.Handled = true; + return; + } + else + { + UpdateRoutes(tenantName, e.Server); + + e.Context.Request.SetExtraData("TenantName", tenantName); + + app.Oms.SelectTenant(tenant); } } - - e.Context.Request.SetExtraData("TenantName", tenantName); - - TenantHandle tenant = app.Oms.GetTenantByName(tenantName); - if (tenant == TenantHandle.Empty) + if (parts.Length == 2) { - StreamWriter sw = new StreamWriter(e.Context.Response.Stream); - sw.WriteLine("

Not Found

"); - sw.WriteLine("

The requested URL was not found on this server.

"); - sw.WriteLine("

Please contact your Mocha applications administrator for further assistance.

"); - sw.Flush(); + Oms.SelectTenant(Oms.GetTenantByName(parts[1])); + InstanceHandle c_Tenant = Oms.GetInstance(KnownInstanceGuids.Classes.Tenant); + InstanceHandle i_Tenant = Oms.GetInstancesOf(c_Tenant).First(); + + InstanceHandle r_Tenant__has_initiating__Route = Oms.GetInstance(KnownRelationshipGuids.Tenant__has_initiating__Route); + + InstanceHandle i_Route = Oms.GetRelatedInstance(i_Tenant, r_Tenant__has_initiating__Route); + if (i_Route != InstanceHandle.Empty) + { + string targetUrl = Oms.GetAttributeValue(i_Route, Oms.GetInstance(KnownAttributeGuids.Text.TargetURL)); + e.Context.Response.Redirect(targetUrl.Replace("{tenant}", parts[1])); + } + else + { + e.Context.Response.Redirect("~/" + parts[1] + "/d/home.htmld"); + } e.Handled = true; - return; } - else - { - app.Oms.SelectTenant(tenant); - } - } - if (parts.Length == 2) - { - Oms.SelectTenant(Oms.GetTenantByName(parts[1])); - InstanceHandle c_Tenant = Oms.GetInstance(KnownInstanceGuids.Classes.Tenant); - InstanceHandle i_Tenant = Oms.GetInstancesOf(c_Tenant).First(); - - InstanceHandle r_Tenant__has_initiating__Route = Oms.GetInstance(KnownRelationshipGuids.Tenant__has_initiating__Route); - - InstanceHandle i_Route = Oms.GetRelatedInstance(i_Tenant, r_Tenant__has_initiating__Route); - if (i_Route != InstanceHandle.Empty) - { - string targetUrl = Oms.GetAttributeValue(i_Route, Oms.GetInstance(KnownAttributeGuids.Text.TargetURL)); - e.Context.Response.Redirect(targetUrl.Replace("{tenant}", parts[1])); - } - else - { - e.Context.Response.Redirect("~/" + parts[1] + "/d/home.htmld"); - } - e.Handled = true; } } - protected override void OnServerCreated(WebServerCreatedEventArgs e) + private void UpdateRoutes(string tenantName, WebServer server) + { + TenantHandle tenant = TenantHandle.Empty; + if (tenantName != null) + { + tenant = Oms.GetTenantByName(tenantName); + } + + server.Routes.Clear(); + server.Routes.Add(new WebRoute("/favicon.ico", new WebHandler(delegate (WebContext ctx) + { + ctx.Response.ResponseCode = 200; + ctx.Response.ResponseText = "OK"; + + string dataUri = /* data:image/png;base64, */ "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAABoAAAAaAGj5no8AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABSVJREFUSImNlltsVVUQhv9Za+1bT0ugUDxU0UQkIYABIyEkkogPKgKiiMVQEQ0ookkTCwYhEetRTDARxaokEG9cFAQVUUQwMdoXoyICClg1xEgEmh6KxfacfVtrjQ+l9Vg56Dyu+ef7Z7L3XrOJmXHRIKLVs53xjqNGuMKpFY4ACXFKGHt88abOQ/gPAJXLP3MrXQqpHvF9p85VzhWOo+A4ElJKCEEgEAD8Zhk7TJy8sOC1/Kn/ZZDLkaD9aFSOetr33MDznDbX83Z5Un2jPNXlSgmSVEWgiQDfbi1fYrQJU20eP15zcm1TE9uyBi9NI++swBYpxZ2B750OAm+58jq3LlrP6Y7cWPcYjupSwIEHJzj5mkJ9au3qNNXZRKfb88ab39D8S/wvg1yOBPZjG4C6wPNaqnx/1kNvdf5ROtl1NOZGJd3JStjNk1cc+rk3ty83ttoa+34cp9dHcfLOT4NO1Pc28rfBrbQEjDVKyS8GJGZqwx7u66I09j8/cbhw3BYImhuQOjr64c+7AeCTl0Z6lHf2RnE6pRjHS+rXnngBAETfA2WsAtBW4ZrZ5eAA4FVW1mYC/8sBQXCN8sTo3vNbGn6JSYrZrqvaXKlWvd5weW2fgWY8CiAA4bHG7Xy2HPzH9dePzLju4orAG5ipDH4IKr2O0vzNTUfOKkcuV46s8MkuBQCRu4EUgHkATg+rxdZy8MOvTB4jlLfU81WSCYK1VRVOx/C79hzvrxuc9d+WQrQJoe7ZMYekEBmMAzAEwEeL1nN6IfjXL066hIkeUEKck0K9TwG3Vs14t/VC2msXfZsKgQ8FoaZ7UO04wYRRvZxy3Z9Lw26QOMjQG6HS1upb3vu9nBYA2NJXDMDCjBLMqOk5RXu5gpsePVwY/1DLRqQc44zMXwzeg7J5ZgbY1qhyos3zsxmvxp9YGQSrMhV+1g88BL4H64WIt0yDFALMHGmt9115774lpbVaGxhjYIwhRYQ8M0Di/CTnI/H5aaVtR6r1VXGSDhVSQBCBmaG1gRAEZlpnjB7WvzmjbY3WBtZwXhFwhAEwYxKAN/oMtO6SsbvdEVoJIZ4kIjAD2lgoqXsMwEOtMQf7G0SpnpRqjTSOj4mVu/E9CO0AZm6YQE7fmAnWJDpaE6apieIEYZwgDCMUwwiFYohCMTpVKMQjCt3px6XwDQ9OcJIkmZkkuv3sqOJhAWYG4w0A2dPDMLdX2LCl489Oxt1JlFRGUaLDMEYxjFEsRigWIxQKYVshDNtuWPnd4VIDByfr4zjNRnH6ZlMTWwEAkGgGEILxbG4qVfeKl72W71r4avvyKEruC8M46ek+QqEYcXcxRiEKF5TCN9172eAwCldHcdwdWtsMlFx2T82gpQw8B+CLaoupDXs4XnWbXOc66tNl78YfvLywptYjWyfJyZKkAxT7uzODNHUX0tWazWcDO8/sbXOr9iWpnpIkunHFzmTtPwxARLnpeAdAHRgtMLiDFGYxcLfrOq6jZJdSskOQSpREJYiGWvBgWP5Bw27g1DQlqZmSar3t8Q9tfe8q/fs7YGbMoXkogkC4EwpHAKxAATet2J3o3DQa4FVgCOCDrXPOV13FzCDozg6n3mjeqq3NWmu3VFvcX7qn/72Tieip6VjCQA5ABkAewE4AB4jxKwQqAQw8/1rPBJAF0EWElU/sRnP/n4CySz83jS4DoRGE+ei5DC8UpwFsgkRz0y7+f0u/f+yYQ7K1iPGWcTUIbk8RQgIOjcrgWN12Nher/wvVoI5LIvFkKAAAAABJRU5ErkJggg=="; + byte[] data = Convert.FromBase64String(dataUri); + + ctx.Response.ContentType = "image/png"; + ctx.Response.Headers["Content-Length"] = data.Length.ToString(); + + ctx.Response.Stream.Write(data, 0, data.Length); + }))); + + // ? this feels hacky... somehow it gets deselected + // ? (probably due to Firefox fetching /robots.txt ...) + Oms.SelectTenant(tenant); + + IEnumerable routes = []; + if (tenant != TenantHandle.Empty) + { + InstanceHandle c_Route = Oms.GetInstance(KnownInstanceGuids.Classes.Route); + routes = Oms.GetInstancesOf(c_Route); + } + + if (routes.Count() > 0) + { + Console.WriteLine("cup: using tenanted WebRoutes"); + foreach (InstanceHandle route in routes) + { + string targetUrl = Oms.GetAttributeValue(route, Oms.GetInstance(KnownAttributeGuids.Text.TargetURL)); + InstanceHandle processedByCT = Oms.GetRelatedInstance(route, Oms.GetInstance(KnownRelationshipGuids.Route__processed_by__Control_Transaction_Method)); + server.Routes.Add(new WebRoute(targetUrl, new TenantedRoutingPage(route, processedByCT))); + } + + // FIXME: hack + server.Routes.Add(new WebRoute("/{tenant}/d/login.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/login.htmld"))); + server.Routes.Add(new WebRoute("/{tenant}/d/logout.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/logout.htmld"))); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/login.htmld", new LoginWebPage())); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/proxy-login.htmld", new LoginWebPage(true))); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/signup.htmld", new LoginWebPage())); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/logout.htmld", new WebHandler(delegate (WebContext ctx) + { + ctx.Session.Clear(); + ctx.Response.Redirect("~/" + ctx.Request.PathVariables["tenant"]); + }))); + server.Routes.Add(new WebRoute("/madi/asset/{name}/{version}/{path}", new AssetWebHandler())); + server.Routes.Add(new WebRoute("/{tenant}/attachment/{iid}/{accesskey}", new AttachmentWebHandler())); + } + else + { + Console.WriteLine("cup: no tenanted WebRoutes found; using hardcoded ones for now"); + server.Routes.Add(new WebRoute("/{tenant}/d/home.htmld", new HomeWebPage())); + // server.Routes.Add(new WebRoute("/{tenant}/d/welcome.htmld", new WelcomePage())); + server.Routes.Add(new WebRoute("/{tenant}/d/signup.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/signup.htmld"))); + server.Routes.Add(new WebRoute("/{tenant}/d/login.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/login.htmld"))); + server.Routes.Add(new WebRoute("/{tenant}/d/logout.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/logout.htmld"))); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/login.htmld", new LoginWebPage())); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/proxy-login.htmld", new LoginWebPage(true))); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/signup.htmld", new LoginWebPage())); + server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/logout.htmld", new WebHandler(delegate (WebContext ctx) + { + ctx.Session.Clear(); + ctx.Response.Redirect("~/" + ctx.Request.PathVariables["tenant"]); + }))); + server.Routes.Add(new WebRoute("/madi/asset/{name}/{version}/{path}", new AssetWebHandler())); + server.Routes.Add(new WebRoute("/{tenant}/attachment/{iid}/{accesskey}", new AttachmentWebHandler())); + } + } + + protected override void OnServerCreated(WebServerCreatedEventArgs e) { base.OnServerCreated(e); @@ -150,49 +242,7 @@ public abstract class MochaWebApplication : WebApplication // e.Server.Routes.Add(new WebRoute("/{tenant}", new RedirectWebHandler("~/{tenant}/d/home.htmld"))); // FIXME: these routes should be loaded from the tenant; requires Mocha.Web.mcl - InstanceHandle c_Route = Oms.GetInstance(KnownInstanceGuids.Classes.Route); - IEnumerable routes = Oms.GetInstancesOf(c_Route); - if (routes.Count() > 0) - { - Console.WriteLine("cup: using tenanted WebRoutes"); - foreach (InstanceHandle route in routes) - { - string targetUrl = Oms.GetAttributeValue(route, Oms.GetInstance(KnownAttributeGuids.Text.TargetURL)); - InstanceHandle processedByCT = Oms.GetRelatedInstance(route, Oms.GetInstance(KnownRelationshipGuids.Route__processed_by__Control_Transaction_Method)); - e.Server.Routes.Add(new WebRoute(targetUrl, new TenantedRoutingPage(processedByCT))); - } - - // FIXME: hack - e.Server.Routes.Add(new WebRoute("/{tenant}/d/login.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/login.htmld"))); - e.Server.Routes.Add(new WebRoute("/{tenant}/d/logout.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/logout.htmld"))); - e.Server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/login.htmld", new LoginWebPage())); - e.Server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/signup.htmld", new LoginWebPage())); - e.Server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/logout.htmld", new WebHandler(delegate (WebContext ctx) - { - ctx.Session.Clear(); - ctx.Response.Redirect("~/" + ctx.Request.PathVariables["tenant"]); - }))); - e.Server.Routes.Add(new WebRoute("/madi/asset/{name}/{version}/{path}", new AssetWebHandler())); - e.Server.Routes.Add(new WebRoute("/{tenant}/attachment/{iid}/{accesskey}", new AttachmentWebHandler())); - } - else - { - Console.WriteLine("cup: no tenanted WebRoutes found; using hardcoded ones for now"); - e.Server.Routes.Add(new WebRoute("/{tenant}/d/home.htmld", new HomeWebPage())); - // e.Server.Routes.Add(new WebRoute("/{tenant}/d/welcome.htmld", new WelcomePage())); - e.Server.Routes.Add(new WebRoute("/{tenant}/d/signup.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/signup.htmld"))); - e.Server.Routes.Add(new WebRoute("/{tenant}/d/login.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/login.htmld"))); - e.Server.Routes.Add(new WebRoute("/{tenant}/d/logout.htmld", new RedirectWebHandler("~/madi/authgwy/{tenant}/logout.htmld"))); - e.Server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/login.htmld", new LoginWebPage())); - e.Server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/signup.htmld", new LoginWebPage())); - e.Server.Routes.Add(new WebRoute("/madi/authgwy/{tenant}/logout.htmld", new WebHandler(delegate (WebContext ctx) - { - ctx.Session.Clear(); - ctx.Response.Redirect("~/" + ctx.Request.PathVariables["tenant"]); - }))); - e.Server.Routes.Add(new WebRoute("/madi/asset/{name}/{version}/{path}", new AssetWebHandler())); - e.Server.Routes.Add(new WebRoute("/{tenant}/attachment/{iid}/{accesskey}", new AttachmentWebHandler())); - } + Console.WriteLine("Mocha User Interface Service started - http://localhost:{0}", DefaultPort); } diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/PageRenderer.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/PageRenderer.cs index 3b28df3..f50fb04 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/PageRenderer.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/PageRenderer.cs @@ -1,5 +1,6 @@ using System; using MBS.Web; +using MBS.Web.UI.HtmlControls; using MBS.Web.UI.WebControls; using Mocha.Core; @@ -13,24 +14,64 @@ public class PageRenderer Context = context; } + private InstanceHandle do_NotEnterable, do_WideText; + + public bool Initialized { get; private set; } = false; + public void Initialize() + { + if (Initialized) + return; + + do_NotEnterable = Context.Oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.NotEnterable); + do_WideText = Context.Oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.WideText); + + Initialized = true; + } + public Container RenderElement(InstanceHandle element) { + Initialize(); + Oms oms = Context.Oms; - Container ct = new Container(); + HtmlGenericControl table = new HtmlGenericControl("table"); + table.ClassList.Add("uwt-formview"); InstanceHandle r_Element__has__Element_Content = oms.GetInstance(KnownRelationshipGuids.Element__has__Element_Content); - + InstanceHandle r_Element_Content__has__Element_Content_Display_Option = oms.GetInstance(KnownRelationshipGuids.Element_Content__has__Element_Content_Display_Option); + IEnumerable elementContents = oms.GetRelatedInstances(element, r_Element__has__Element_Content); foreach (InstanceHandle elementContent in elementContents) { - Control ctl = RenderElementContent(elementContent); - ct.Controls.Add(ctl); + IEnumerable displayOptions = oms.GetRelatedInstances(elementContent, r_Element_Content__has__Element_Content_Display_Option); + HtmlGenericControl tr = new HtmlGenericControl("tr"); + tr.ClassList.Add("uwt-formview-item"); + + HtmlGenericControl tdContent = new HtmlGenericControl("td"); + tdContent.ClassList.Add("uwt-formview-item-content"); + + if (!displayOptions.Contains(do_WideText)) + { + HtmlGenericControl tdLabel = new HtmlGenericControl("td"); + tdLabel.ClassList.Add("uwt-formview-item-label"); + tdLabel.Controls.Add(new Label("Control Label")); + tr.Controls.Add(tdLabel); + } + else + { + tdContent.Attributes["colspan"] = "2"; + } + + Control ctl = RenderElementContent(elementContent, displayOptions); + tdContent.Controls.Add(ctl); + tr.Controls.Add(tdContent); + + table.Controls.Add(tr); } - return ct; + return table; } - private Control RenderElementContent(InstanceHandle elementContent) + private Control RenderElementContent(InstanceHandle elementContent, IEnumerable displayOptions) { Oms oms = Context.Oms; @@ -39,21 +80,37 @@ public class PageRenderer InstanceHandle c_NumericAttribute = oms.GetInstance(KnownInstanceGuids.Classes.NumericAttribute); InstanceHandle c_DateAttribute = oms.GetInstance(KnownInstanceGuids.Classes.DateAttribute); - InstanceHandle r_Element_Content__has__Element_Content_Display_Option = oms.GetInstance(KnownRelationshipGuids.Element_Content__has__Element_Content_Display_Option); InstanceHandle r_Element_Content__has__Instance = oms.GetInstance(KnownRelationshipGuids.Element_Content__has__Instance); - IEnumerable displayOptions = oms.GetRelatedInstances(elementContent, r_Element_Content__has__Element_Content_Display_Option); InstanceHandle ecInstance = oms.GetRelatedInstance(elementContent, r_Element_Content__has__Instance); + Control? ctl = null; if (oms.IsInstanceOf(ecInstance, c_TextAttribute)) { - InstanceHandle a_Value = oms.GetInstance(KnownAttributeGuids.Text.Value); - - TextBox ctl = new TextBox(); - ctl.Value = oms.GetAttributeValue(ecInstance, a_Value); - return ctl; + InstanceHandle r_Derived_Element_Content__update_with__Executable_returning_Work_Data = oms.GetInstance(KnownRelationshipGuids.Derived_Element_Content__update_with__Executable_returning_Work_Data); + InstanceHandle updateWithERWD = oms.GetRelatedInstance(elementContent, r_Derived_Element_Content__update_with__Executable_returning_Work_Data); + if (updateWithERWD != InstanceHandle.Empty) + { + InstanceHandle workdata = oms.Execute(Context, updateWithERWD); + string value = Context.GetWorkData(workdata); + if (displayOptions.Contains(do_NotEnterable)) + { + Literal lbl = new Literal(value); + ctl = lbl; + } + else + { + TextBox txt = new TextBox(); + txt.Value = value; + ctl = txt; + } + } } - return new Label(String.Format("No implementaton for EC instance type {0}", oms.GetGlobalIdentifier(oms.GetParentClass(ecInstance)))); + if (ctl == null) + { + ctl = new Label(String.Format("No implementaton for EC instance type {0}", oms.GetGlobalIdentifier(oms.GetParentClass(ecInstance)))); + } + return ctl; } } diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/Program.cs b/mocha-dotnet/src/app/Mocha.ServerApplication/Program.cs index 540013a..45dc67c 100644 --- a/mocha-dotnet/src/app/Mocha.ServerApplication/Program.cs +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/Program.cs @@ -58,13 +58,27 @@ public class Program : MochaWebApplication TenantHandle t_super = oms.GetTenantByName("super"); { + // FIXME! : selecting tenant doesn't seem to be working, routes get overwritten / not created oms.SelectTenant(t_super); + + InstanceHandle c_Application = oms.GetInstance(KnownInstanceGuids.Classes.Application); + InstanceHandle i_Application = oms.CreateInstanceOf(c_Application, new Guid("{773f6c6e-6cef-4a04-b333-ac097c0ab705}")); + + InstanceHandle c_Alerynn_Test_Class = oms.CreateClass("Alerynn Test Class", new Guid("{bb1b32ff-55fe-4de7-a0c4-2e0a9d8de63b}")); + InstanceHandle i_Alerynn_Test_Class = oms.CreateInstanceOf(c_Alerynn_Test_Class, new Guid("{d82182d5-451c-453f-9635-af07305b10ee}")); + InstanceHandle c_Tenant = oms.GetInstance(KnownInstanceGuids.Classes.Tenant); InstanceHandle i_Tenant = oms.GetInstancesOf(c_Tenant).First(); + InstanceHandle r_Tenant__has__Application = oms.GetInstance(KnownRelationshipGuids.Tenant__has__Application); + oms.AssignRelationship(i_Tenant, r_Tenant__has__Application, c_Application); + InstanceHandle i_English = oms.GetInstance(KnownInstanceGuids.Languages.English); InstanceHandle r_Tenant__has_login_header__Translation = oms.GetInstance(KnownRelationshipGuids.Tenant__has_login_header__Translation); InstanceHandle r_Tenant__has_login_footer__Translation = oms.GetInstance(KnownRelationshipGuids.Tenant__has_login_footer__Translation); + InstanceHandle r_Application__has_title__Translation = oms.GetInstance(KnownRelationshipGuids.Application__has_title__Translation); + oms.SetTranslationValue(i_Application, r_Application__has_title__Translation, i_English, "Mocha super"); + oms.SetTranslationValue(i_Tenant, r_Tenant__has_login_header__Translation, i_English, "Welcome to your New Tenant"); oms.SetTranslationValue(i_Tenant, r_Tenant__has_login_footer__Translation, i_English, "Please enter your user name and password to continue."); @@ -73,6 +87,68 @@ public class Program : MochaWebApplication InstanceHandle i_User1 = oms.CreateInstanceOf(c_User); oms.SetAttributeValue(i_User1, a_UserName, "superuser"); + + InstanceHandle a_Name = oms.GetInstance(KnownAttributeGuids.Text.Name); + InstanceHandle a_Value = oms.GetInstance(KnownAttributeGuids.Text.Value); + + OmsMethodBuilder mb = new OmsMethodBuilder(oms); + BuildAttributeMethod ba = mb.CreateBuildAttributeMethod(c_Alerynn_Test_Class, "get", "Welcome Message", AccessModifier.Public, true, a_Value, "This is the Super User tenant"); + ReturnAttributeMethodBinding ba_ramb = ba.CreateMethodBinding(oms); + + + // create the Welcome Page for Alerynn: Infinite Universe + InstanceHandle c_TextAttribute = oms.GetInstance(KnownInstanceGuids.Classes.TextAttribute); + InstanceHandle c_Element = oms.GetInstance(KnownInstanceGuids.Classes.Element); + InstanceHandle c_DerivedElementContent = oms.GetInstance(KnownInstanceGuids.Classes.DerivedElementContent); + + InstanceHandle a_AlerynnWelcome1 = oms.CreateInstanceOf(c_TextAttribute); + // oms.SetAttributeValue(a_AlerynnWelcome1, a_Value, "Welcome to Alerynn: Infinite Universe!"); + + InstanceHandle r_Element__has__Element_Content = oms.GetInstance(KnownRelationshipGuids.Element__has__Element_Content); + InstanceHandle r_Element_Content__has__Instance = oms.GetInstance(KnownRelationshipGuids.Element_Content__has__Instance); + InstanceHandle r_Derived_Element_Content__has__Derived_EC_Display_Option = oms.GetInstance(KnownRelationshipGuids.Element_Content__has__Element_Content_Display_Option); + + InstanceHandle el_AlerynnWelcome1 = oms.CreateInstanceOf(c_Element); + oms.SetAttributeValue(el_AlerynnWelcome1, a_Name, "alerynn welcome page"); + + InstanceHandle do_WideText = oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.WideText); + InstanceHandle do_NotEnterable = oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.NotEnterable); + InstanceHandle do_Required = oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.Required); + + InstanceHandle ec_AlerynnWelcome1 = oms.CreateInstanceOf(c_DerivedElementContent); + oms.AssignRelationship(ec_AlerynnWelcome1, r_Element_Content__has__Instance, a_AlerynnWelcome1); + oms.AssignRelationship(el_AlerynnWelcome1, r_Element__has__Element_Content, ec_AlerynnWelcome1); + oms.AssignRelationship(ec_AlerynnWelcome1, oms.GetInstance(KnownRelationshipGuids.Derived_Element_Content__update_with__Executable_returning_Work_Data), ba_ramb.Handle); + oms.AssignRelationship(ec_AlerynnWelcome1, r_Derived_Element_Content__has__Derived_EC_Display_Option, new InstanceHandle[] + { + do_WideText, + do_NotEnterable, + // do_Required + }); + + BuildUIResponseMethod buir = mb.CreateBuildUIResponseMethod(c_Tenant, String.Empty, "Welcome Page", AccessModifier.Public, true, el_AlerynnWelcome1); + BuildResponseMethodBinding brmb = buir.CreateMethodBinding(oms); + + ControlTransactionMethod ct = mb.CreateControlTransactionMethod(c_Tenant, String.Empty, "Welcome Page", AccessModifier.Public, true, InstanceHandle.Empty, brmb); + + InstanceHandle r_Route__processed_by__Control_Transaction_Method = oms.GetInstance(KnownRelationshipGuids.Route__processed_by__Control_Transaction_Method); + + InstanceHandle a_TargetURL = oms.GetInstance(KnownAttributeGuids.Text.TargetURL); + InstanceHandle c_Route = oms.GetInstance(KnownInstanceGuids.Classes.Route); + + InstanceHandle route = oms.CreateInstanceOf(c_Route); + + oms.SetAttributeValue(route, a_TargetURL, "/{tenant}/d/home.htmld"); + + InstanceHandle i_Domain_Anyone = oms.GetInstance(KnownInstanceGuids.SecurityDomains.Anyone); + InstanceHandle i_Domain_AuthenticatedUsers = oms.GetInstance(KnownInstanceGuids.SecurityDomains.AuthenticatedUsers); + InstanceHandle r_Route__secured_to__Domain = oms.GetInstance(KnownRelationshipGuids.Route__secured_to__Domain); + oms.AssignRelationship(route, r_Route__secured_to__Domain, [i_Domain_AuthenticatedUsers]); + + oms.AssignRelationship(route, r_Route__processed_by__Control_Transaction_Method, ct.Handle); + + InstanceHandle r_Tenant__has_initiating__Route = oms.GetInstance(KnownRelationshipGuids.Tenant__has_initiating__Route); + oms.AssignRelationship(i_Tenant, r_Tenant__has_initiating__Route, route); } TenantHandle t_wdoms = oms.CreateTenant("wdoms"); @@ -97,16 +173,34 @@ public class Program : MochaWebApplication TenantHandle t_alerynn1 = oms.CreateTenant("alerynn"); { oms.SelectTenant(t_alerynn1); + + InstanceHandle c_Application = oms.GetInstance(KnownInstanceGuids.Classes.Application); + InstanceHandle i_Application = oms.CreateInstanceOf(c_Application, new Guid("{32582607-1198-4e11-a283-b7f56e26f164}")); + + InstanceHandle c_Alerynn_Test_Class = oms.CreateClass("Alerynn Test Class", new Guid("{bb1b32ff-55fe-4de7-a0c4-2e0a9d8de63b}")); + InstanceHandle i_Alerynn_Test_Class = oms.CreateInstanceOf(c_Alerynn_Test_Class, new Guid("{d82182d5-451c-453f-9635-af07305b10ee}")); + InstanceHandle c_Tenant = oms.GetInstance(KnownInstanceGuids.Classes.Tenant); InstanceHandle i_Tenant = oms.GetInstancesOf(c_Tenant).First(); InstanceHandle i_English = oms.GetInstance(KnownInstanceGuids.Languages.English); InstanceHandle r_Tenant__has_login_header__Translation = oms.GetInstance(KnownRelationshipGuids.Tenant__has_login_header__Translation); InstanceHandle r_Tenant__has_login_footer__Translation = oms.GetInstance(KnownRelationshipGuids.Tenant__has_login_footer__Translation); + InstanceHandle r_Application__has_title__Translation = oms.GetInstance(KnownRelationshipGuids.Application__has_title__Translation); + InstanceHandle r_Tenant__has__Application = oms.GetInstance(KnownRelationshipGuids.Tenant__has__Application); + oms.SetTranslationValue(i_Application, r_Application__has_title__Translation, i_English, "Alerynn: Infinite Universe"); + oms.AssignRelationship(i_Tenant, r_Tenant__has__Application, i_Application); + oms.SetTranslationValue(i_Tenant, r_Tenant__has_login_header__Translation, i_English, "Alerynn: Infinite Universe"); oms.SetTranslationValue(i_Tenant, r_Tenant__has_login_footer__Translation, i_English, "Welcome to the Nest!"); InstanceHandle a_Name = oms.GetInstance(KnownAttributeGuids.Text.Name); + InstanceHandle a_Value = oms.GetInstance(KnownAttributeGuids.Text.Value); + + OmsMethodBuilder mb = new OmsMethodBuilder(oms); + BuildAttributeMethod ba = mb.CreateBuildAttributeMethod(c_Alerynn_Test_Class, "get", "Welcome Message", AccessModifier.Public, true, a_Value, "Welcome to Alerynn: Infinite Universe!"); + ReturnAttributeMethodBinding ba_ramb = ba.CreateMethodBinding(oms); + InstanceHandle c_User = oms.GetInstance(KnownInstanceGuids.Classes.User); InstanceHandle a_UserName = oms.GetInstance(KnownAttributeGuids.Text.UserName); @@ -119,22 +213,33 @@ public class Program : MochaWebApplication // create the Welcome Page for Alerynn: Infinite Universe InstanceHandle c_TextAttribute = oms.GetInstance(KnownInstanceGuids.Classes.TextAttribute); InstanceHandle c_Element = oms.GetInstance(KnownInstanceGuids.Classes.Element); - InstanceHandle c_ElementContent = oms.GetInstance(KnownInstanceGuids.Classes.ElementContent); + InstanceHandle c_DerivedElementContent = oms.GetInstance(KnownInstanceGuids.Classes.DerivedElementContent); InstanceHandle a_AlerynnWelcome1 = oms.CreateInstanceOf(c_TextAttribute); + // oms.SetAttributeValue(a_AlerynnWelcome1, a_Value, "Welcome to Alerynn: Infinite Universe!"); InstanceHandle r_Element__has__Element_Content = oms.GetInstance(KnownRelationshipGuids.Element__has__Element_Content); InstanceHandle r_Element_Content__has__Instance = oms.GetInstance(KnownRelationshipGuids.Element_Content__has__Instance); + InstanceHandle r_Derived_Element_Content__has__Derived_EC_Display_Option = oms.GetInstance(KnownRelationshipGuids.Element_Content__has__Element_Content_Display_Option); InstanceHandle el_AlerynnWelcome1 = oms.CreateInstanceOf(c_Element); oms.SetAttributeValue(el_AlerynnWelcome1, a_Name, "alerynn welcome page"); - InstanceHandle ec_AlerynnWelcome1 = oms.CreateInstanceOf(c_ElementContent); + InstanceHandle do_WideText = oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.WideText); + InstanceHandle do_NotEnterable = oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.NotEnterable); + InstanceHandle do_Required = oms.GetInstance(KnownInstanceGuids.ElementContentDisplayOptions.Required); + + InstanceHandle ec_AlerynnWelcome1 = oms.CreateInstanceOf(c_DerivedElementContent); oms.AssignRelationship(ec_AlerynnWelcome1, r_Element_Content__has__Instance, a_AlerynnWelcome1); oms.AssignRelationship(el_AlerynnWelcome1, r_Element__has__Element_Content, ec_AlerynnWelcome1); + oms.AssignRelationship(ec_AlerynnWelcome1, oms.GetInstance(KnownRelationshipGuids.Derived_Element_Content__update_with__Executable_returning_Work_Data), ba_ramb.Handle); + oms.AssignRelationship(ec_AlerynnWelcome1, r_Derived_Element_Content__has__Derived_EC_Display_Option, new InstanceHandle[] + { + do_WideText, + do_NotEnterable, + // do_Required + }); - OmsMethodBuilder mb = new OmsMethodBuilder(oms); - BuildUIResponseMethod buir = mb.CreateBuildUIResponseMethod(c_Tenant, String.Empty, "Welcome Page", AccessModifier.Public, true, el_AlerynnWelcome1); BuildResponseMethodBinding brmb = buir.CreateMethodBinding(oms); @@ -148,6 +253,11 @@ public class Program : MochaWebApplication InstanceHandle route = oms.CreateInstanceOf(c_Route); oms.SetAttributeValue(route, a_TargetURL, "/{tenant}/d/welcome.htmld"); + + InstanceHandle i_Domain_Anyone = oms.GetInstance(KnownInstanceGuids.SecurityDomains.Anyone); + InstanceHandle i_Domain_AuthenticatedUsers = oms.GetInstance(KnownInstanceGuids.SecurityDomains.AuthenticatedUsers); + InstanceHandle r_Route__secured_to__Domain = oms.GetInstance(KnownRelationshipGuids.Route__secured_to__Domain); + oms.AssignRelationship(route, r_Route__secured_to__Domain, [i_Domain_Anyone]); oms.AssignRelationship(route, r_Route__processed_by__Control_Transaction_Method, ct.Handle); diff --git a/mocha-dotnet/src/app/Mocha.ServerApplication/assets b/mocha-dotnet/src/app/Mocha.ServerApplication/assets new file mode 120000 index 0000000..17d0247 --- /dev/null +++ b/mocha-dotnet/src/app/Mocha.ServerApplication/assets @@ -0,0 +1 @@ +/home/beckermj/Documents/Projects/mochapowered/mocha-dotnet/mocha-dotnet/src/app/Mocha.ServerApplication/bin/Debug/net8.0/assets \ No newline at end of file diff --git a/mocha-dotnet/src/assets/ui-html/base/controls/Button.js b/mocha-dotnet/src/assets/ui-html/base/controls/Button.js index 48076c4..dc5a1f9 100644 --- a/mocha-dotnet/src/assets/ui-html/base/controls/Button.js +++ b/mocha-dotnet/src/assets/ui-html/base/controls/Button.js @@ -2,7 +2,7 @@ function Button(parentElement) { this.ParentElement = parentElement; - if (this.ParentElement.tagName == "A") + if (this.ParentElement.tagName.toLowerCase() == "a") { console.log(parentElement); this.ParentElement.addEventListener("click", function(e) @@ -17,6 +17,24 @@ function Button(parentElement) } }); } + else if (this.ParentElement.tagName.toLowerCase() == "div") + { + this.DropDownButtonElement = this.ParentElement.children[1]; + this.DropDownContentElement = this.ParentElement.children[2]; + this.DropDownButtonElement.NativeObject = this; + + this.DropDownButtonElement.addEventListener("click", function (e) + { + System.ClassList.Toggle(this.NativeObject.DropDownContentElement, "uwt-visible"); + e.preventDefault(); + e.stopPropagation(); + return false; + }); + } + else + { + console.log("unknown parent element tag: '" + this.ParentElement.tagName + "'"); + } return; this.ButtonElement = this.ParentElement.children[0]; diff --git a/mocha-dotnet/src/assets/ui-html/css/common/uwt-dockable.less b/mocha-dotnet/src/assets/ui-html/css/common/uwt-dockable.less new file mode 100644 index 0000000..48d99c7 --- /dev/null +++ b/mocha-dotnet/src/assets/ui-html/css/common/uwt-dockable.less @@ -0,0 +1,81 @@ +.uwt-dockable +{ + position: fixed; + z-index: 5; + + &> div.uwt-gripper + { + position: absolute; + padding: 2px; + background-color: #ccc; + &:hover + { + background-color: #aaa; + } + &:active + { + background-color: #333; + } + } + &.uwt-dock-left + { + left: 0px; + right: auto; + top: 0px; + bottom: 0px; + &> div.uwt-gripper + { + top: 0px; + right: 0px; + bottom: 0px; + cursor: ew-resize; + } + } + &.uwt-dock-top + { + left: 0px; + right: 0px; + top: 0px; + bottom: auto; + &> div.uwt-gripper + { + left: 0px; + right: 0px; + bottom: 0px; + cursor: ns-resize; + } + } + &.uwt-dock-right + { + left: auto; + right: 0px; + top: 0px; + bottom: 0px; + &> div.uwt-gripper + { + top: 0px; + left: 0px; + bottom: 0px; + cursor: ew-resize; + } + } + &.uwt-dock-bottom + { + left: 0px; + right: 0px; + top: auto; + bottom: 0px; + &> div.uwt-gripper + { + top: 0px; + right: 0px; + left: 0px; + cursor: ns-resize; + } + } + + &> div.uwt-header, &> div.uwt-content + { + padding: 16px; + } +} \ No newline at end of file diff --git a/mocha-dotnet/src/assets/ui-html/css/common/uwt-layout-box.less b/mocha-dotnet/src/assets/ui-html/css/common/uwt-layout-box.less index c74c683..e442b80 100644 --- a/mocha-dotnet/src/assets/ui-html/css/common/uwt-layout-box.less +++ b/mocha-dotnet/src/assets/ui-html/css/common/uwt-layout-box.less @@ -4,15 +4,48 @@ div.uwt-layout.uwt-layout-box &.uwt-orientation-horizontal { flex-direction: row; + &.uwt-spacing-eighth > * + { + margin-right: 4.5px; + } + &.uwt-spacing-quarter > * + { + margin-right: 9px; + } + &.uwt-spacing-half > * + { + margin-right: 18px; + } + &.uwt-spacing-whole > * + { + margin-right: 36px; + } } &.uwt-orientation-vertical { flex-direction: column; + &.uwt-spacing-eighth > * + { + margin-bottom: 4.5px; + } + &.uwt-spacing-quarter > * + { + margin-bottom: 9px; + } + &.uwt-spacing-half > * + { + margin-bottom: 18px; + } + &.uwt-spacing-whole > * + { + margin-bottom: 36px; + } } - &> div.uwt-layout-item + &> * { flex-grow: 1; + margin: 0px; } justify-content: center; diff --git a/mocha-dotnet/src/assets/ui-html/css/suv.css b/mocha-dotnet/src/assets/ui-html/css/suv.css new file mode 100644 index 0000000..8f80080 --- /dev/null +++ b/mocha-dotnet/src/assets/ui-html/css/suv.css @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2024 Michael Becker + * + * This file is part of Mocha.NET. + * + * Mocha.NET is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Mocha.NET is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mocha.NET. If not, see . + */ + +body +{ + background-image: linear-gradient(90deg, #804b00, #da9e45); +} \ No newline at end of file diff --git a/mocha-dotnet/src/assets/ui-html/images/mocha-24x24.png b/mocha-dotnet/src/assets/ui-html/images/mocha-24x24.png new file mode 100644 index 0000000..c843598 Binary files /dev/null and b/mocha-dotnet/src/assets/ui-html/images/mocha-24x24.png differ diff --git a/mocha-dotnet/src/assets/ui-html/images/mocha.svg b/mocha-dotnet/src/assets/ui-html/images/mocha.svg new file mode 100644 index 0000000..eda3a6d --- /dev/null +++ b/mocha-dotnet/src/assets/ui-html/images/mocha.svg @@ -0,0 +1,16 @@ + + +