161 lines
6.8 KiB
Plaintext
161 lines
6.8 KiB
Plaintext
@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>
|