336 lines
15 KiB
Plaintext
336 lines
15 KiB
Plaintext
<%@page extends="com.zucchetti.PortalStudio.PortalStudioBaseEditors" %><%@ page import="com.zucchetti.PortalStudio.*" %><%@ page import="com.zucchetti.SPBridge.*" %><%@ page import="com.zucchetti.sitepainter.SPPrxycizer" %><!doctype html>
|
|
<html style="height:100%;">
|
|
<head>
|
|
<title>Expression Builder</title>
|
|
<script src='../<%=SPPrxycizer.proxycizedPath("stdFunctions.js")%>'></script>
|
|
<script src='../<%=SPPrxycizer.proxycizedPath("controls.js")%>'></script>
|
|
<link rel="stylesheet" href="../filewindow.css" type="text/css">
|
|
<!-- monaco editor -->
|
|
<link rel="stylesheet" data-name="vs/editor/editor.main" href="../monaco/resources/editor.main.css" />
|
|
<style>
|
|
#formatterBtn {
|
|
flex:0 1 100%;
|
|
font-weight: bold;
|
|
color:lightgray;
|
|
line-height: 20px;
|
|
cursor: pointer;
|
|
}
|
|
#formatterBtn:hover {
|
|
font-weight: bold;
|
|
color:white;
|
|
}
|
|
</style>
|
|
<%
|
|
Sitepainter sp=new Sitepainter(request);
|
|
sp.setContentType(response);
|
|
|
|
String pTable = sp.getParameter("pTable","");
|
|
String tool = sp.getParameter("tool","");
|
|
%>
|
|
<script type="text/javascript">
|
|
function getOpener() {
|
|
return GetOpener();
|
|
if(!Empty(SPModalLayerId) && SPModalLayerId =='kvBuildSPModalLayer') return window.parent.spModalLayer[window.frameElement.id].getOpenerRef();
|
|
return (window.opener?window.opener:(window.caller?window.caller:window.parent));
|
|
}
|
|
|
|
function CloseWindow(){
|
|
if (window.closeFrame) closeFrame();
|
|
else if (!Empty(SPModalLayerId)) getOpener().closeSPModalLayer();
|
|
else window.close()
|
|
}
|
|
|
|
var tool = '<%=JSPLib.ToJSValue(tool)%>';
|
|
var ReturnObjectId=null;
|
|
var callerFunction=null;
|
|
var SPModalLayerId=null;
|
|
var functionsToView=[];
|
|
var fieldsOfTable=[];
|
|
var parametersOfQueries=[];
|
|
var variablesToView=[];
|
|
var object_prefix=null;
|
|
var object_postfix=null;
|
|
|
|
function Init() {
|
|
ReturnObjectId = '<%=JSPLib.ToJSValue(sp.getParameter("ExpressionID",""))%>';
|
|
callerFunction = '<%=JSPLib.ToJSValue(sp.getParameter("callerFunction",""))%>';
|
|
SPModalLayerId = '<%=JSPLib.ToJSValue(sp.getParameter("SPModalLayerId",""))%>';
|
|
if(tool=='ctrlsExpressions'){
|
|
functionsToView = getOpener().GetObjsForExpBuilder();
|
|
}else{
|
|
functionsToView = getOpener().GetFunctionsForExpBuilder();
|
|
fieldsOfTable = getOpener().getFieldsOfTables();
|
|
parametersOfQueries = getOpener().getParametersOfQueries();
|
|
variablesToView = getOpener().GetVariablesForExpBuilder();
|
|
}
|
|
document.getElementById("description").innerHTML = '';
|
|
window.focus();
|
|
InitCategories();
|
|
UpdateCategory();
|
|
startEditor();
|
|
}
|
|
|
|
function InitCategories() {
|
|
var categorie=document.getElementById("categories");
|
|
//[{name:"functionsName",desc:"Description Functions",prefix:"[",postfix:"()]",functions:[["nome","parametri","descrizione lunga"],["nome2","parametri","descrizione lunga"]]}]
|
|
for (var i=0; functionsToView && i<functionsToView.length;i++) {
|
|
categorie.options[categorie.options.length] = new Option(functionsToView[i].desc,functionsToView[i].name,false,false);
|
|
}
|
|
//[{name:"variablesName",desc:"Description Functions",prefix:"",postfix:"",functions:[["nome","parametri","descrizione lunga"],["nome2","parametri","descrizione lunga"]]}]
|
|
for (var i=0; variablesToView && i<variablesToView.length;i++) {
|
|
categorie.options[categorie.options.length] = new Option(variablesToView[i].desc,variablesToView[i].name,false,false);
|
|
}
|
|
//[{name:"tabella",desc:"tabellina",prefix:"tabella.",postfix:"",fields:[["nome","descrizione"],["nome2","descrizione2"]]}}]
|
|
for (var i=0; fieldsOfTable && i<fieldsOfTable.length; i++) {
|
|
categorie.options[categorie.options.length] = new Option("Fields of "+fieldsOfTable[i].desc,fieldsOfTable[i].name + "_fields",false,false);
|
|
// I parametri vengono visualizzati solo nel Report Editor e nella voce sottostante a quella della query a cui appartengono.
|
|
if (typeof(parametersOfQueries) != 'undefined' && parametersOfQueries[i].fields.length > 0) {
|
|
categorie.options[categorie.options.length] = new Option("Parameters of "+parametersOfQueries[i].desc,parametersOfQueries[i].name + "_parameters",false,false);
|
|
}
|
|
}
|
|
categorie.selectedIndex=0;
|
|
}
|
|
|
|
function addObject() {
|
|
if (document.getElementById("objectlist").selectedOptions?.length>0) {
|
|
var object = document.getElementById("objectlist").selectedOptions[0].value;
|
|
m_bUpdated=true;
|
|
}
|
|
}
|
|
|
|
function UpdateCategory() {
|
|
if (document.getElementById("categories").selectedOptions?.length>0) {
|
|
var category = document.getElementById("categories").selectedOptions[0].value;
|
|
var objlist = document.getElementById("objectlist");
|
|
objlist.innerHTML = '';
|
|
var index,items;
|
|
if ((index=LibJavascript.Array.indexOf(fieldsOfTable,category,function(el){return el.name + "_fields"==category;}))>-1) {
|
|
items=fieldsOfTable[index].fields;
|
|
if (items) {
|
|
document.getElementById("AvailableObjects").innerHTML = 'Fields';
|
|
for (var i=0; i<items.length; i++) {
|
|
if(LRTrim(items[i][1]) ==''){
|
|
objlist.options[objlist.options.length] = new Option(items[i][0], items[i][0], false, false);
|
|
} else {
|
|
objlist.options[objlist.options.length] = new Option(items[i][0]+" : "+items[i][1], items[i][0], false, false);
|
|
}
|
|
object_prefix=fieldsOfTable[index].prefix;
|
|
object_postfix=fieldsOfTable[index].postfix;
|
|
if (items.length>0)
|
|
objlist.selectedIndex=0;
|
|
}
|
|
}
|
|
} else if ((index=LibJavascript.Array.indexOf(parametersOfQueries,category,function(el){return el.name + "_parameters"==category;}))>-1) {
|
|
items=parametersOfQueries[index].fields;
|
|
if (items) {
|
|
document.getElementById("AvailableObjects").innerHTML = 'Fields';
|
|
for (var i=0; i<items.length; i++) {
|
|
if(LRTrim(items[i][1]) ==''){
|
|
objlist.options[objlist.options.length] = new Option(items[i][0], items[i][0], false, false);
|
|
} else {
|
|
objlist.options[objlist.options.length] = new Option(items[i][0]+" : "+items[i][1], items[i][0], false, false);
|
|
}
|
|
object_prefix="";
|
|
object_postfix=parametersOfQueries[index].postfix;
|
|
if (items.length>0)
|
|
objlist.selectedIndex=0;
|
|
}
|
|
}
|
|
}
|
|
else if ((index=LibJavascript.Array.indexOf(functionsToView,category,function(el){return el.name==category;}))>-1) {
|
|
items=functionsToView[index].functions;
|
|
if (items) {
|
|
document.getElementById("AvailableObjects").innerHTML = 'Functions';
|
|
for (var i=0; i<items.length; i++) {
|
|
objlist.options[objlist.options.length] = new Option(items[i][0]+items[i][1], items[i][0], false, false);
|
|
}
|
|
object_prefix=functionsToView[index].prefix;
|
|
object_postfix=functionsToView[index].postfix;
|
|
if (items.length>0)
|
|
objlist.selectedIndex=0;
|
|
}
|
|
} else if ((index=LibJavascript.Array.indexOf(variablesToView,category,function(el){return el.name==category;}))>-1) {
|
|
items=variablesToView[index].functions;
|
|
if (items) {
|
|
document.getElementById("AvailableObjects").innerHTML = 'Variables';
|
|
for (var i=0; i<items.length; i++) {
|
|
if(LRTrim(items[i][1]) ==''){
|
|
objlist.options[objlist.options.length] = new Option(items[i][0], items[i][0], false, false);
|
|
} else {
|
|
objlist.options[objlist.options.length] = new Option(items[i][0]+" : "+items[i][1], items[i][0], false, false);
|
|
}
|
|
}
|
|
object_prefix=variablesToView[index].prefix;
|
|
object_postfix=variablesToView[index].postfix;
|
|
if (items.length>0)
|
|
objlist.selectedIndex=0;
|
|
}
|
|
}
|
|
UpdateDescription();
|
|
}
|
|
}
|
|
|
|
function UpdateDescription() {
|
|
if(document.getElementById("objectlist").selectedOptions?.length>0) {
|
|
var category = document.getElementById("categories").selectedOptions[0].value;
|
|
var index;
|
|
var func;
|
|
if ((index=LibJavascript.Array.indexOf(functionsToView,category,function(el){return el.name==category;}))>-1) {
|
|
func = document.getElementById("objectlist").options.selectedIndex;
|
|
document.getElementById("description").innerHTML = functionsToView[index].functions[func][2];
|
|
} else if ((index=LibJavascript.Array.indexOf(variablesToView,category,function(el){return el.name==category;}))>-1) {
|
|
func = document.getElementById("objectlist").options.selectedIndex;
|
|
document.getElementById("description").innerHTML = variablesToView[index].functions[func][2];
|
|
}
|
|
else if ((index=LibJavascript.Array.indexOf(fieldsOfTable,category,function(el){return el.name + "_fields" == category;}))>-1){
|
|
func = document.getElementById("objectlist").options.selectedIndex;
|
|
var descr=fieldsOfTable[index].fields[func][0]+(LRTrim(fieldsOfTable[index].fields[func][1]) ==''?'':' : '+LRTrim(fieldsOfTable[index].fields[func][1]));
|
|
descr+=' - '+fieldsOfTable[index].fields[func][2]+(Empty(fieldsOfTable[index].fields[func][3])?'':' - Index: '+fieldsOfTable[index].fields[func][3])
|
|
document.getElementById("description").innerHTML = descr;
|
|
}
|
|
else if ((index=LibJavascript.Array.indexOf(parametersOfQueries,category,function(el){return el.name + "_parameters" == category;}))>-1){
|
|
func = document.getElementById("objectlist").options.selectedIndex;
|
|
var descr=parametersOfQueries[index].fields[func][0]+(LRTrim(parametersOfQueries[index].fields[func][1]) ==''?'':' : '+LRTrim(parametersOfQueries[index].fields[func][1]));
|
|
descr+=' - '+parametersOfQueries[index].fields[func][2]+(Empty(parametersOfQueries[index].fields[func][3])?'':' - Index: '+parametersOfQueries[index].fields[func][3])
|
|
document.getElementById("description").innerHTML = descr
|
|
}
|
|
}
|
|
else
|
|
document.getElementById("description").innerHTML = '';
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body style="border:0;overflow:hidden;margin:0;background-color:#E4E4E4; height:100%;" onload="Init()">
|
|
<table border="0" width="100%" height="100%" cellpadding="0" cellspacing="0" align="center">
|
|
<tr>
|
|
<td class="titoli" colspan="2" align="center" onselectstart="return false" style="height:15px;">
|
|
<div style="display:flex">
|
|
<div style="flex:1 0 97%";>E<u>x</u>pression</div>
|
|
<% out.print((tool.equals("visualquery")) ? "<div id='formatterBtn' title='Format Document'>{ }</div>" : ""); %>
|
|
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="contenuto" id="expBuilderContainer" colspan="2" style="height:15%">
|
|
<script type="module">
|
|
import { configureMonacoWorkers, runExpressionBuilderEditor, getEditor, restartEditor, getMonaco } from "../monaco/monacoLoader.js";
|
|
|
|
function startEditor(){
|
|
configureMonacoWorkers()
|
|
.then(() => {return runExpressionBuilderEditor("expBuilderContainer", tool)})
|
|
.then(() => {
|
|
var editor = getEditor();
|
|
var monaco = getMonaco();
|
|
|
|
// set the code
|
|
let editorValue = getOpener().GetExpressionFromId(ReturnObjectId);
|
|
let initialValue = editorValue;
|
|
editor.setValue(editorValue);
|
|
editor.setPosition({ lineNumber: 1, column: (editorValue.length + 1) });
|
|
editor.focus();
|
|
|
|
// set theme
|
|
let z_ac_style = localStorage.getItem("zucchetti_ac_style");
|
|
let ac_style = !Empty(z_ac_style) ? JSON.parse(z_ac_style) : { theme: "Default Light Modern" };
|
|
monaco.editor.setTheme(ac_style.theme);
|
|
|
|
// add Functions
|
|
Ctrl("objectlist").addEventListener("dblclick", function(){
|
|
let object = document.getElementById("objectlist").selectedOptions[0].value;
|
|
let pos = editor.getPosition();
|
|
let objectSize = (object_prefix+object+object_postfix).length
|
|
let editOperation = {
|
|
range: {
|
|
startLineNumber: pos.lineNumber,
|
|
startColumn: pos.column,
|
|
endLineNumber: pos.lineNumber,
|
|
endColumn: pos.column
|
|
},
|
|
text: object_prefix+object+object_postfix,
|
|
forceMoveMarkers: true
|
|
};
|
|
editor.getModel().pushEditOperations([], [editOperation], () => []);
|
|
editor.setPosition({ lineNumber: pos.lineNumber, column: pos.column+objectSize });
|
|
editor.focus();
|
|
});
|
|
|
|
// Insert
|
|
Ctrl("insert").addEventListener("click", function(){
|
|
let currValue = editor.getValue();
|
|
if (currValue != initialValue) {
|
|
// insert the text without formatting
|
|
getOpener()[callerFunction](ReturnObjectId, currValue.replace(/\r\n[\t]+/g,""));
|
|
}
|
|
CloseWindow();
|
|
});
|
|
|
|
// Formatter button
|
|
document.getElementById("formatterBtn")?.addEventListener("click", () => {
|
|
editor.trigger('anyString', 'editor.action.formatDocument');
|
|
});
|
|
// Resize
|
|
window.onresize = function() {
|
|
let el = document.getElementsByClassName("monaco-editor")[0];
|
|
el.style.display = 'none';
|
|
restartEditor().then((result) => {
|
|
editor = result;
|
|
}).catch((error) => {
|
|
console.error(error);
|
|
});
|
|
};
|
|
|
|
|
|
});
|
|
}
|
|
window.startEditor = startEditor;
|
|
</script>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="contenuto" style="width:45%;height:30%">
|
|
<table border="0" width="100%" height="100%" cellpadding="0" cellspacing="0">
|
|
<tr>
|
|
<td class="titoli" align="center" onselectstart="return false">Ca<u>t</u>egories</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="width:100%;height:100%">
|
|
<select class="" id="categories" size="8" style="width:100%;height:100%" onclick="UpdateCategory()" onchange="UpdateCategory()" accesskey="t">
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="contenuto" style="width:55%;height:30%">
|
|
<table border="0" width="100%" height="100%" cellpadding="0" cellspacing="0">
|
|
<tr>
|
|
<td class="titoli" align="center" onselectstart="return false">A<u>v</u>ailable <span id="AvailableObjects">functions</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td style="width:100%;height:100%">
|
|
<select class="" id="objectlist" size="7" style="width:100%;height:100%" ondblclick="addObject()" onclick="UpdateDescription()" onchange="UpdateDescription()" accesskey="v">
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="titoli" colspan="2" align="center" onselectstart="return false" style="height:15px;">D<u>e</u>scription</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="contenuto" colspan="2" style="height:80px">
|
|
<div class="" id="description" style="padding: 2px; height:100%;background-color:white;overflow:auto;" accesskey="e"></div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="footer" colspan="2" height="20" valign="middle" align="center" nowrap>
|
|
<button accesskey="i" class="bottoni" id="insert"><u>I</u>nsert</button>
|
|
<button onclick="CloseWindow()" accesskey="c" class="bottoni2"><u>C</u>ancel</button>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|