feature: update expression browser and add plugin expression extensions

This commit is contained in:
Gary Sharp
2025-01-16 12:36:01 +11:00
parent 963970feeb
commit a3e1e1d030
23 changed files with 652 additions and 555 deletions
@@ -1,134 +0,0 @@
@model Disco.Web.Areas.Config.Models.DocumentTemplate.ExpressionBrowserModel
@{
Authorization.Require(Claims.Config.Show);
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Document Templates", MVC.Config.DocumentTemplate.Index(null), "Expression Browser");
Html.BundleDeferred("~/Style/jQueryUI/dynatree");
Html.BundleDeferred("~/ClientScripts/Modules/jQueryUI-DynaTree");
}
<div id="configurationDocumentTemplateExpressionBrowser">
Expressions within Disco ICT are based on the <a href="http://www.springframework.net/"
target="_blank">Spring.NET Framework</a>. Please refer to the <a href="http://www.springframework.net/doc-latest/reference/html/expressions.html"
target="_blank">Expression Evaluation</a> documentation.
<h2 id="DeviceScope">
Device Scope</h2>
<div id="deviceScopeTree" class="expressionTree">
</div>
<h2 id="JobScope">
Job Scope</h2>
<div id="jobScopeTree" class="expressionTree">
</div>
<h2 id="UserScope">
User Scope</h2>
<div id="userScopeTree" class="expressionTree">
</div>
<h2 id="Variables">
Variables
</h2>
<div id="variableScopeTree" class="expressionTree">
</div>
<h2 id="ExtensionLibraries">
Extension Libraries</h2>
<div id="extScopeTree" class="expressionTree">
</div>
</div>
<script type="text/javascript">
$(function () {
if (!document.DiscoFunctions) {
document.DiscoFunctions = {};
}
var typeLib = {};
var loadTypeUrl = '@(Url.Action(MVC.Config.DocumentTemplate.ExpressionBrowser()))';
var deviceScopeTree = $('#deviceScopeTree');
var jobScopeTree = $('#jobScopeTree');
var userScopeTree = $('#userScopeTree');
var variableScopeTree = $('#variableScopeTree');
var extScopeTree = $('#extScopeTree');
var lazyLoadNode = function (node) {
if (node.data.expressionType) {
node.setLazyNodeStatus(DTNodeStatus_Loading);
loadType(node, node.data.expressionType, node.data.staticDeclaredMembersOnly);
} else {
if (node.data.memberDescriptor) {
loadMember(node);
} else {
node.setLazyNodeStatus(DTNodeStatus_Ok);
}
}
}
var loadMember = function (memberNode) {
var previousUpdateMode = memberNode.tree.enableUpdate(false);
var memberDescriptor = memberNode.data.memberDescriptor;
// Return Type
memberNode.addChild({ title: 'Returns: ' + memberDescriptor.ReturnType, tooltip: memberDescriptor.ReturnExpressionType, isFolder: true, expressionType: memberDescriptor.ReturnExpressionType, isLazy: true, addClass: 'object' });
// Parameters
var parametersNode = memberNode.addChild({ title: 'Parameters', isFolder: true, addClass: 'parameter' });
for (var i = 0; i < memberDescriptor.Parameters.length; i++) {
var p = memberDescriptor.Parameters[i];
parametersNode.addChild({ title: p.Name + ' [' + p.ReturnType + ']', tooltip: p.ReturnExpressionType, addClass: 'object' });
}
memberNode.setLazyNodeStatus(DTNodeStatus_Ok);
memberNode.tree.enableUpdate(previousUpdateMode);
}
var typeLoaded = function (parentNode, typeDescriptor) {
var previousUpdateMode = parentNode.tree.enableUpdate(false);
for (var i = 0; i < typeDescriptor.Members.length; i++) {
var memberDescriptor = typeDescriptor.Members[i];
parentNode.addChild({ title: memberDescriptor.Name, tooltip: memberDescriptor.ReturnType, isFolder: true, addClass: memberDescriptor.Kind, memberDescriptor: memberDescriptor, isLazy: true });
}
parentNode.setLazyNodeStatus(DTNodeStatus_Ok);
parentNode.tree.enableUpdate(previousUpdateMode);
}
var loadType = function (parentNode, type, staticDeclaredMembersOnly) {
if (typeLib[type]) {
typeLoaded(parentNode, typeLib[type]);
} else {
var requestData = { type: type, StaticDeclaredMembersOnly: staticDeclaredMembersOnly };
$.getJSON(loadTypeUrl, requestData, function (data) {
typeLib[type] = data;
typeLoaded(parentNode, data);
});
}
}
var initVariable = function (name, type) {
variableScopeTree.dynatree('getRoot').addChild({ title: name, tooltip: type, isFolder: true, addClass: 'object', expressionType: type, isLazy: true });
}
var initExpressionLibrary = function (name, type) {
extScopeTree.dynatree('getRoot').addChild({ title: name, tooltip: type, isFolder: true, addClass: 'object', expressionType: type, staticDeclaredMembersOnly: true, isLazy: true });
}
// Init
deviceScopeTree.dynatree({ onLazyRead: lazyLoadNode });
loadType(deviceScopeTree.dynatree('getRoot'), '@(Model.DeviceType)');
jobScopeTree.dynatree({ onLazyRead: lazyLoadNode });
loadType(jobScopeTree.dynatree('getRoot'), '@(Model.JobType)');
userScopeTree.dynatree({ onLazyRead: lazyLoadNode });
loadType(userScopeTree.dynatree('getRoot'), '@(Model.UserType)');
variableScopeTree.dynatree({ onLazyRead: lazyLoadNode });
document.DiscoFunctions.expressionInitVariable = initVariable;
extScopeTree.dynatree({ onLazyRead: lazyLoadNode });
document.DiscoFunctions.expressionInitExpressionLibrary = initExpressionLibrary;
});
</script>
<script type="text/javascript">
$(function () {
@{
foreach (var variable in Model.Variables)
{
<text>document.DiscoFunctions.expressionInitVariable('@(variable.Key)', '@variable.Value');</text>
}
foreach (var variable in Model.ExtensionLibraries)
{
<text>document.DiscoFunctions.expressionInitExpressionLibrary('@(variable.Key)', '@variable.Value');</text>
}
}
});
</script>
@@ -1,306 +0,0 @@
#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Disco.Web.Areas.Config.Views.DocumentTemplate
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using Disco;
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
using Disco.Services.Web;
using Disco.Web;
using Disco.Web.Extensions;
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")]
[System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/DocumentTemplate/ExpressionBrowser.cshtml")]
public partial class ExpressionBrowser : Disco.Services.Web.WebViewPage<Disco.Web.Areas.Config.Models.DocumentTemplate.ExpressionBrowserModel>
{
public ExpressionBrowser()
{
}
public override void Execute()
{
#line 2 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Authorization.Require(Claims.Config.Show);
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Document Templates", MVC.Config.DocumentTemplate.Index(null), "Expression Browser");
Html.BundleDeferred("~/Style/jQueryUI/dynatree");
Html.BundleDeferred("~/ClientScripts/Modules/jQueryUI-DynaTree");
#line default
#line hidden
WriteLiteral("\r\n<div");
WriteLiteral(" id=\"configurationDocumentTemplateExpressionBrowser\"");
WriteLiteral(">\r\n Expressions within Disco ICT are based on the <a");
WriteLiteral(" href=\"http://www.springframework.net/\"");
WriteLiteral("\r\n target=\"_blank\"");
WriteLiteral(">Spring.NET Framework</a>. Please refer to the <a");
WriteLiteral(" href=\"http://www.springframework.net/doc-latest/reference/html/expressions.html\"" +
"");
WriteLiteral("\r\n target=\"_blank\"");
WriteLiteral(">Expression Evaluation</a> documentation.\r\n <h2");
WriteLiteral(" id=\"DeviceScope\"");
WriteLiteral(">\r\n Device Scope</h2>\r\n <div");
WriteLiteral(" id=\"deviceScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"JobScope\"");
WriteLiteral(">\r\n Job Scope</h2>\r\n <div");
WriteLiteral(" id=\"jobScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"UserScope\"");
WriteLiteral(">\r\n User Scope</h2>\r\n <div");
WriteLiteral(" id=\"userScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"Variables\"");
WriteLiteral(">\r\n Variables\r\n </h2>\r\n <div");
WriteLiteral(" id=\"variableScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"ExtensionLibraries\"");
WriteLiteral(">\r\n Extension Libraries</h2>\r\n <div");
WriteLiteral(" id=\"extScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n</div>\r\n<script");
WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(">\r\n $(function () {\r\n if (!document.DiscoFunctions) {\r\n docu" +
"ment.DiscoFunctions = {};\r\n }\r\n\r\n var typeLib = {};\r\n var l" +
"oadTypeUrl = \'");
#line 42 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(Url.Action(MVC.Config.DocumentTemplate.ExpressionBrowser()));
#line default
#line hidden
WriteLiteral("\';\r\n var deviceScopeTree = $(\'#deviceScopeTree\');\r\n var jobScopeTre" +
"e = $(\'#jobScopeTree\');\r\n var userScopeTree = $(\'#userScopeTree\');\r\n " +
" var variableScopeTree = $(\'#variableScopeTree\');\r\n var extScopeTree = " +
"$(\'#extScopeTree\');\r\n\r\n var lazyLoadNode = function (node) {\r\n " +
" if (node.data.expressionType) {\r\n node.setLazyNodeStatus(DTNodeS" +
"tatus_Loading);\r\n loadType(node, node.data.expressionType, node.d" +
"ata.staticDeclaredMembersOnly);\r\n } else {\r\n if (node." +
"data.memberDescriptor) {\r\n loadMember(node);\r\n " +
" } else {\r\n node.setLazyNodeStatus(DTNodeStatus_Ok);\r\n " +
" }\r\n }\r\n }\r\n var loadMember = function (memberN" +
"ode) {\r\n var previousUpdateMode = memberNode.tree.enableUpdate(false)" +
";\r\n var memberDescriptor = memberNode.data.memberDescriptor;\r\n " +
" // Return Type\r\n memberNode.addChild({ title: \'Returns: \' + memb" +
"erDescriptor.ReturnType, tooltip: memberDescriptor.ReturnExpressionType, isFolde" +
"r: true, expressionType: memberDescriptor.ReturnExpressionType, isLazy: true, ad" +
"dClass: \'object\' });\r\n // Parameters\r\n var parametersNode " +
"= memberNode.addChild({ title: \'Parameters\', isFolder: true, addClass: \'paramete" +
"r\' });\r\n for (var i = 0; i < memberDescriptor.Parameters.length; i++)" +
" {\r\n var p = memberDescriptor.Parameters[i];\r\n par" +
"ametersNode.addChild({ title: p.Name + \' [\' + p.ReturnType + \']\', tooltip: p.Ret" +
"urnExpressionType, addClass: \'object\' });\r\n }\r\n memberNode" +
".setLazyNodeStatus(DTNodeStatus_Ok);\r\n memberNode.tree.enableUpdate(p" +
"reviousUpdateMode);\r\n }\r\n var typeLoaded = function (parentNode, t" +
"ypeDescriptor) {\r\n var previousUpdateMode = parentNode.tree.enableUpd" +
"ate(false);\r\n for (var i = 0; i < typeDescriptor.Members.length; i++)" +
" {\r\n var memberDescriptor = typeDescriptor.Members[i];\r\n " +
" parentNode.addChild({ title: memberDescriptor.Name, tooltip: memberDescri" +
"ptor.ReturnType, isFolder: true, addClass: memberDescriptor.Kind, memberDescript" +
"or: memberDescriptor, isLazy: true });\r\n }\r\n parentNode.se" +
"tLazyNodeStatus(DTNodeStatus_Ok);\r\n parentNode.tree.enableUpdate(prev" +
"iousUpdateMode);\r\n }\r\n\r\n var loadType = function (parentNode, type" +
", staticDeclaredMembersOnly) {\r\n if (typeLib[type]) {\r\n " +
" typeLoaded(parentNode, typeLib[type]);\r\n } else {\r\n " +
"var requestData = { type: type, StaticDeclaredMembersOnly: staticDeclaredMembers" +
"Only };\r\n $.getJSON(loadTypeUrl, requestData, function (data) {\r\n" +
" typeLib[type] = data;\r\n typeLoaded(parent" +
"Node, data);\r\n });\r\n }\r\n }\r\n\r\n var initV" +
"ariable = function (name, type) {\r\n variableScopeTree.dynatree(\'getRo" +
"ot\').addChild({ title: name, tooltip: type, isFolder: true, addClass: \'object\', " +
"expressionType: type, isLazy: true });\r\n }\r\n var initExpressionLib" +
"rary = function (name, type) {\r\n extScopeTree.dynatree(\'getRoot\').add" +
"Child({ title: name, tooltip: type, isFolder: true, addClass: \'object\', expressi" +
"onType: type, staticDeclaredMembersOnly: true, isLazy: true });\r\n }\r\n\r\n " +
" // Init\r\n deviceScopeTree.dynatree({ onLazyRead: lazyLoadNode });\r\n" +
" loadType(deviceScopeTree.dynatree(\'getRoot\'), \'");
#line 106 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(Model.DeviceType);
#line default
#line hidden
WriteLiteral("\');\r\n\r\n jobScopeTree.dynatree({ onLazyRead: lazyLoadNode });\r\n load" +
"Type(jobScopeTree.dynatree(\'getRoot\'), \'");
#line 109 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(Model.JobType);
#line default
#line hidden
WriteLiteral("\');\r\n\r\n userScopeTree.dynatree({ onLazyRead: lazyLoadNode });\r\n loa" +
"dType(userScopeTree.dynatree(\'getRoot\'), \'");
#line 112 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(Model.UserType);
#line default
#line hidden
WriteLiteral(@"');
variableScopeTree.dynatree({ onLazyRead: lazyLoadNode });
document.DiscoFunctions.expressionInitVariable = initVariable;
extScopeTree.dynatree({ onLazyRead: lazyLoadNode });
document.DiscoFunctions.expressionInitExpressionLibrary = initExpressionLibrary;
});
</script>
<script");
WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(">\r\n $(function () {\r\n");
#line 123 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
foreach (var variable in Model.Variables)
{
#line default
#line hidden
WriteLiteral(" ");
WriteLiteral("document.DiscoFunctions.expressionInitVariable(\'");
#line 126 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(variable.Key);
#line default
#line hidden
WriteLiteral("\', \'");
#line 126 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(variable.Value);
#line default
#line hidden
WriteLiteral("\');");
WriteLiteral("\r\n");
#line 127 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
}
foreach (var variable in Model.ExtensionLibraries)
{
#line default
#line hidden
WriteLiteral(" ");
WriteLiteral("document.DiscoFunctions.expressionInitExpressionLibrary(\'");
#line 130 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(variable.Key);
#line default
#line hidden
WriteLiteral("\', \'");
#line 130 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
Write(variable.Value);
#line default
#line hidden
WriteLiteral("\');");
WriteLiteral("\r\n");
#line 131 "..\..\Areas\Config\Views\DocumentTemplate\ExpressionBrowser.cshtml"
}
#line default
#line hidden
WriteLiteral("\r\n });\r\n </script>");
}
}
}
#pragma warning restore 1591
@@ -0,0 +1,160 @@
@model Disco.Web.Areas.Config.Models.Expressions.BrowserModel
@{
Authorization.Require(Claims.Config.Show);
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Expression Browser");
Html.BundleDeferred("~/Style/jQueryUI/dynatree");
Html.BundleDeferred("~/ClientScripts/Modules/jQueryUI-DynaTree");
}
<div id="Config_Expressions_Browser">
Expressions within Disco ICT are based on the <a href="http://www.springframework.net/" target="_blank">Spring.NET Framework</a>. Please refer to the <a href="http://www.springframework.net/doc-latest/reference/html/expressions.html" target="_blank">Expression Evaluation</a> documentation.
<h2 id="DeviceScope">
Device Scope
</h2>
<div id="deviceScopeTree" class="expressionTree">
</div>
<h2 id="JobScope">
Job Scope
</h2>
<div id="jobScopeTree" class="expressionTree">
</div>
<h2 id="UserScope">
User Scope
</h2>
<div id="userScopeTree" class="expressionTree">
</div>
<h2 id="Variables">
Variables
</h2>
<div id="variableScopeTree" class="expressionTree">
</div>
<h2 id="ExtensionLibraries">
Extension Libraries
</h2>
<div id="extScopeTree" class="expressionTree">
</div>
@if (Model.PluginExtensionLibraries.Any())
{
<h2 id="PluginExtensionLibraries">
Plugin Extension Libraries
</h2>
<div id="pluginExtScopeTree" class="expressionTree">
</div>
}
</div>
<script id="expressionBrowserModel" type="application/json">
@Html.Raw(Json.Encode(Model))
</script>
@using (Html.BeginForm(MVC.API.Expressions.TypeDescriptor(), FormMethod.Post, new { id = "expressionBrowserForm" }))
{
@Html.AntiForgeryToken()
}
<script type="text/javascript">
$(function () {
if (!document.DiscoFunctions) {
document.DiscoFunctions = {};
}
const typeLib = {};
const model = JSON.parse($('#expressionBrowserModel').html());
function lazyLoadNode(node) {
if (node.data.expressionType) {
node.setLazyNodeStatus(DTNodeStatus_Loading);
loadType(node, node.data.expressionType, node.data.staticMembersOnly);
} else {
if (node.data.memberDescriptor) {
loadMember(node);
} else {
node.setLazyNodeStatus(DTNodeStatus_Ok);
}
}
}
function loadMember(memberNode) {
const previousUpdateMode = memberNode.tree.enableUpdate(false);
const memberDescriptor = memberNode.data.memberDescriptor;
// Return Type
memberNode.addChild({ title: 'Returns: ' + memberDescriptor.ReturnType, tooltip: memberDescriptor.ReturnExpressionType, isFolder: true, expressionType: memberDescriptor.ReturnExpressionType, isLazy: true, addClass: 'object' });
// Parameters
const parametersNode = memberNode.addChild({ title: 'Parameters', isFolder: true, addClass: 'parameter' });
for (let i = 0; i < memberDescriptor.Parameters.length; i++) {
const p = memberDescriptor.Parameters[i];
parametersNode.addChild({ title: p.Name + ' [' + p.ReturnType + ']', tooltip: p.ReturnExpressionType, addClass: 'object' });
}
memberNode.setLazyNodeStatus(DTNodeStatus_Ok);
memberNode.tree.enableUpdate(previousUpdateMode);
}
function typeLoaded(parentNode, typeDescriptor) {
const previousUpdateMode = parentNode.tree.enableUpdate(false);
for (let i = 0; i < typeDescriptor.Members.length; i++) {
const memberDescriptor = typeDescriptor.Members[i];
parentNode.addChild({ title: memberDescriptor.Name, tooltip: memberDescriptor.ReturnType, isFolder: true, addClass: memberDescriptor.Kind, memberDescriptor: memberDescriptor, isLazy: true });
}
parentNode.setLazyNodeStatus(DTNodeStatus_Ok);
parentNode.tree.enableUpdate(previousUpdateMode);
}
async function loadType(parentNode, type, staticMembersOnly) {
let typeDef = typeLib[type];
if (!typeDef) {
$form = $('#expressionBrowserForm');
const url = $form.attr('action');
const body = new FormData($form[0]);
body.append('type', type);
if (staticMembersOnly) {
body.append('staticMembersOnly', staticMembersOnly);
}
const response = await fetch(url, {
method: 'POST',
body: body
});
if (!response.ok) {
console.error('Failed to load type', response);
return;
}
typeDef = await response.json();
typeLib[type] = typeDef;
}
typeLoaded(parentNode, typeDef);
}
const deviceScopeTree = $('#deviceScopeTree');
deviceScopeTree.dynatree({ onLazyRead: lazyLoadNode });
loadType(deviceScopeTree.dynatree('getRoot'), model.DeviceType);
const jobScopeTree = $('#jobScopeTree');
jobScopeTree.dynatree({ onLazyRead: lazyLoadNode });
loadType(jobScopeTree.dynatree('getRoot'), model.JobType);
const userScopeTree = $('#userScopeTree');
userScopeTree.dynatree({ onLazyRead: lazyLoadNode });
loadType(userScopeTree.dynatree('getRoot'), model.UserType);
const variableScopeTree = $('#variableScopeTree');
variableScopeTree.dynatree({ onLazyRead: lazyLoadNode });
Object.keys(model.Variables).forEach(name => {
const type = model.Variables[name];
variableScopeTree.dynatree('getRoot').addChild({ title: name, tooltip: type, isFolder: true, addClass: 'object', expressionType: type, isLazy: true });
})
const extScopeTree = $('#extScopeTree');
extScopeTree.dynatree({ onLazyRead: lazyLoadNode });
Object.keys(model.ExtensionLibraries).forEach(name => {
const type = model.ExtensionLibraries[name];
extScopeTree.dynatree('getRoot').addChild({ title: name, tooltip: type, isFolder: true, addClass: 'object', expressionType: type, staticMembersOnly: true, isLazy: true });
})
const pluginExtScopeTree = $('#pluginExtScopeTree');
if (pluginExtScopeTree.length) {
pluginExtScopeTree.dynatree({ onLazyRead: lazyLoadNode });
Object.keys(model.PluginExtensionLibraries).forEach(name => {
const type = model.PluginExtensionLibraries[name];
pluginExtScopeTree.dynatree('getRoot').addChild({ title: name, tooltip: type, isFolder: true, addClass: 'object', expressionType: type, staticMembersOnly: true, isLazy: true });
})
}
});
</script>
@@ -0,0 +1,277 @@
#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Disco.Web.Areas.Config.Views.Expressions
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using Disco;
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
using Disco.Services.Web;
using Disco.Web;
using Disco.Web.Extensions;
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")]
[System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/Expressions/Browser.cshtml")]
public partial class Browser : Disco.Services.Web.WebViewPage<Disco.Web.Areas.Config.Models.Expressions.BrowserModel>
{
public Browser()
{
}
public override void Execute()
{
#line 2 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
Authorization.Require(Claims.Config.Show);
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Expression Browser");
Html.BundleDeferred("~/Style/jQueryUI/dynatree");
Html.BundleDeferred("~/ClientScripts/Modules/jQueryUI-DynaTree");
#line default
#line hidden
WriteLiteral("\r\n<div");
WriteLiteral(" id=\"Config_Expressions_Browser\"");
WriteLiteral(">\r\n Expressions within Disco ICT are based on the <a");
WriteLiteral(" href=\"http://www.springframework.net/\"");
WriteLiteral(" target=\"_blank\"");
WriteLiteral(">Spring.NET Framework</a>. Please refer to the <a");
WriteLiteral(" href=\"http://www.springframework.net/doc-latest/reference/html/expressions.html\"" +
"");
WriteLiteral(" target=\"_blank\"");
WriteLiteral(">Expression Evaluation</a> documentation.\r\n <h2");
WriteLiteral(" id=\"DeviceScope\"");
WriteLiteral(">\r\n Device Scope\r\n </h2>\r\n <div");
WriteLiteral(" id=\"deviceScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"JobScope\"");
WriteLiteral(">\r\n Job Scope\r\n </h2>\r\n <div");
WriteLiteral(" id=\"jobScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"UserScope\"");
WriteLiteral(">\r\n User Scope\r\n </h2>\r\n <div");
WriteLiteral(" id=\"userScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"Variables\"");
WriteLiteral(">\r\n Variables\r\n </h2>\r\n <div");
WriteLiteral(" id=\"variableScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n <h2");
WriteLiteral(" id=\"ExtensionLibraries\"");
WriteLiteral(">\r\n Extension Libraries\r\n </h2>\r\n <div");
WriteLiteral(" id=\"extScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n");
#line 36 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
#line default
#line hidden
#line 36 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
if (Model.PluginExtensionLibraries.Any())
{
#line default
#line hidden
WriteLiteral(" <h2");
WriteLiteral(" id=\"PluginExtensionLibraries\"");
WriteLiteral(">\r\n Plugin Extension Libraries\r\n </h2>\r\n");
WriteLiteral(" <div");
WriteLiteral(" id=\"pluginExtScopeTree\"");
WriteLiteral(" class=\"expressionTree\"");
WriteLiteral(">\r\n </div>\r\n");
#line 43 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
}
#line default
#line hidden
WriteLiteral("</div>\r\n<script");
WriteLiteral(" id=\"expressionBrowserModel\"");
WriteLiteral(" type=\"application/json\"");
WriteLiteral(">\r\n");
#line 46 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
Write(Html.Raw(Json.Encode(Model)));
#line default
#line hidden
WriteLiteral("\r\n</script>\r\n");
#line 48 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
using (Html.BeginForm(MVC.API.Expressions.TypeDescriptor(), FormMethod.Post, new { id = "expressionBrowserForm" }))
{
#line default
#line hidden
#line 50 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
Write(Html.AntiForgeryToken());
#line default
#line hidden
#line 50 "..\..\Areas\Config\Views\Expressions\Browser.cshtml"
}
#line default
#line hidden
WriteLiteral("<script");
WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(">\r\n $(function () {\r\n if (!document.DiscoFunctions) {\r\n docu" +
"ment.DiscoFunctions = {};\r\n }\r\n\r\n const typeLib = {};\r\n con" +
"st model = JSON.parse($(\'#expressionBrowserModel\').html());\r\n\r\n function " +
"lazyLoadNode(node) {\r\n if (node.data.expressionType) {\r\n " +
" node.setLazyNodeStatus(DTNodeStatus_Loading);\r\n loadType(node," +
" node.data.expressionType, node.data.staticMembersOnly);\r\n } else {\r\n" +
" if (node.data.memberDescriptor) {\r\n loadMembe" +
"r(node);\r\n } else {\r\n node.setLazyNodeStatus(D" +
"TNodeStatus_Ok);\r\n }\r\n }\r\n }\r\n function " +
"loadMember(memberNode) {\r\n const previousUpdateMode = memberNode.tree" +
".enableUpdate(false);\r\n const memberDescriptor = memberNode.data.memb" +
"erDescriptor;\r\n // Return Type\r\n memberNode.addChild({ tit" +
"le: \'Returns: \' + memberDescriptor.ReturnType, tooltip: memberDescriptor.ReturnE" +
"xpressionType, isFolder: true, expressionType: memberDescriptor.ReturnExpression" +
"Type, isLazy: true, addClass: \'object\' });\r\n // Parameters\r\n " +
" const parametersNode = memberNode.addChild({ title: \'Parameters\', isFolder: t" +
"rue, addClass: \'parameter\' });\r\n for (let i = 0; i < memberDescriptor" +
".Parameters.length; i++) {\r\n const p = memberDescriptor.Parameter" +
"s[i];\r\n parametersNode.addChild({ title: p.Name + \' [\' + p.Return" +
"Type + \']\', tooltip: p.ReturnExpressionType, addClass: \'object\' });\r\n " +
" }\r\n memberNode.setLazyNodeStatus(DTNodeStatus_Ok);\r\n memb" +
"erNode.tree.enableUpdate(previousUpdateMode);\r\n }\r\n function typeL" +
"oaded(parentNode, typeDescriptor) {\r\n const previousUpdateMode = pare" +
"ntNode.tree.enableUpdate(false);\r\n for (let i = 0; i < typeDescriptor" +
".Members.length; i++) {\r\n const memberDescriptor = typeDescriptor" +
".Members[i];\r\n parentNode.addChild({ title: memberDescriptor.Name" +
", tooltip: memberDescriptor.ReturnType, isFolder: true, addClass: memberDescript" +
"or.Kind, memberDescriptor: memberDescriptor, isLazy: true });\r\n }\r\n " +
" parentNode.setLazyNodeStatus(DTNodeStatus_Ok);\r\n parentNode" +
".tree.enableUpdate(previousUpdateMode);\r\n }\r\n\r\n async function loa" +
"dType(parentNode, type, staticMembersOnly) {\r\n let typeDef = typeLib[" +
"type];\r\n if (!typeDef) {\r\n $form = $(\'#expressionBrows" +
"erForm\');\r\n const url = $form.attr(\'action\');\r\n co" +
"nst body = new FormData($form[0]);\r\n body.append(\'type\', type);\r\n" +
" if (staticMembersOnly) {\r\n body.append(\'stati" +
"cMembersOnly\', staticMembersOnly);\r\n }\r\n\r\n const r" +
"esponse = await fetch(url, {\r\n method: \'POST\',\r\n " +
" body: body\r\n });\r\n\r\n if (!response.ok) {\r\n " +
" console.error(\'Failed to load type\', response);\r\n " +
" return;\r\n }\r\n\r\n typeDef = await response.j" +
"son();\r\n\r\n typeLib[type] = typeDef;\r\n }\r\n t" +
"ypeLoaded(parentNode, typeDef);\r\n }\r\n\r\n const deviceScopeTree = $(" +
"\'#deviceScopeTree\');\r\n deviceScopeTree.dynatree({ onLazyRead: lazyLoadNod" +
"e });\r\n loadType(deviceScopeTree.dynatree(\'getRoot\'), model.DeviceType);\r" +
"\n\r\n const jobScopeTree = $(\'#jobScopeTree\');\r\n jobScopeTree.dynatr" +
"ee({ onLazyRead: lazyLoadNode });\r\n loadType(jobScopeTree.dynatree(\'getRo" +
"ot\'), model.JobType);\r\n\r\n const userScopeTree = $(\'#userScopeTree\');\r\n " +
" userScopeTree.dynatree({ onLazyRead: lazyLoadNode });\r\n loadType(use" +
"rScopeTree.dynatree(\'getRoot\'), model.UserType);\r\n\r\n const variableScopeT" +
"ree = $(\'#variableScopeTree\');\r\n variableScopeTree.dynatree({ onLazyRead:" +
" lazyLoadNode });\r\n Object.keys(model.Variables).forEach(name => {\r\n " +
" const type = model.Variables[name];\r\n variableScopeTree.dynatr" +
"ee(\'getRoot\').addChild({ title: name, tooltip: type, isFolder: true, addClass: \'" +
"object\', expressionType: type, isLazy: true });\r\n })\r\n\r\n const ext" +
"ScopeTree = $(\'#extScopeTree\');\r\n extScopeTree.dynatree({ onLazyRead: laz" +
"yLoadNode });\r\n Object.keys(model.ExtensionLibraries).forEach(name => {\r\n" +
" const type = model.ExtensionLibraries[name];\r\n extScopeTr" +
"ee.dynatree(\'getRoot\').addChild({ title: name, tooltip: type, isFolder: true, ad" +
"dClass: \'object\', expressionType: type, staticMembersOnly: true, isLazy: true })" +
";\r\n })\r\n\r\n const pluginExtScopeTree = $(\'#pluginExtScopeTree\');\r\n " +
" if (pluginExtScopeTree.length) {\r\n pluginExtScopeTree.dynatree" +
"({ onLazyRead: lazyLoadNode });\r\n Object.keys(model.PluginExtensionLi" +
"braries).forEach(name => {\r\n const type = model.PluginExtensionLi" +
"braries[name];\r\n pluginExtScopeTree.dynatree(\'getRoot\').addChild(" +
"{ title: name, tooltip: type, isFolder: true, addClass: \'object\', expressionType" +
": type, staticMembersOnly: true, isLazy: true });\r\n })\r\n }\r\n " +
" });\r\n</script>\r\n");
}
}
}
#pragma warning restore 1591