PortaleOrdiniGruppo/PortalStudio/portalstudio/expression_builder.jsp
2025-03-24 15:28:26 +01:00

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>&nbsp;
<button onclick="CloseWindow()" accesskey="c" class="bottoni2"><u>C</u>ancel</button>
</td>
</tr>
</table>
</body>
</html>