123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /**
- * 单行表达式编辑器
- * @author hjh
- */
- //表达式编辑器的唯一对外接口
- window.zlExpressEditor = {};
- //采用闭包的方式进行隔离
- (function () {
- //表达式执行器
- let expressExecutor;
- /**
- * 资源信息
- * */
- let resourceInfo = [];
- /**
- * 所有的叶子节点
- * */
- let allLeafNodes = [];
- /**
- * 枚举选项的所有配置信息
- * key:name
- * value:setting
- */
- let enumSettings = {};
- /**
- * 初始化编辑器环境[只以最后一次调用生效]
- * @param {any} setting
- */
- window.zlExpressEditor.InitEditorEnvironment = function (setting, runtime = false) {
- //资源信息
- let resource = setting.resource;
- allLeafNodes = [];
- //解析资源信息
- resourceInfo = EnvironmentHelper.ParseResource(resource);
- //提取叶子节点
- for (let info of resourceInfo) {
- let nodes = EnvironmentHelper.ExtractLeafNodes(info);
- allLeafNodes.push(...nodes);
- }
- //将所有的叶子节点按照文本的长度进行排序
- allLeafNodes = allLeafNodes.sort((a, b) => b._path.length - a._path.length);
- //将JS代码添加库到monaco
- let jscode = EnvironmentHelper.ChangeToJsLib(resourceInfo);
- //仅设计时才添加库
- if (!runtime && monaco != null) {
- monaco.languages.typescript.javascriptDefaults.addExtraLib(jscode, 'resource.js');
- }
- expressExecutor = new ExpressExecutor(jscode);
- };
- /**
- * 根据设置获取脚本环境配置
- * @param {any} setting
- * @returns
- */
- window.zlExpressEditor.GetEditorEnvironment = function (setting) {
- let env = {};
- //资源信息
- let resource = setting.resource;
- env.allLeafNodes = [];
- //解析资源信息
- env.resourceInfo = EnvironmentHelper.ParseResource(resource);
- //提取叶子节点
- for (let info of env.resourceInfo) {
- let nodes = EnvironmentHelper.ExtractLeafNodes(info);
- env.allLeafNodes.push(...nodes);
- }
- //将所有的叶子节点按照文本的长度进行排序
- env.allLeafNodes = env.allLeafNodes.sort((a, b) => b._path.length - a._path.length);
- //将JS代码添加库到monaco
- let jscode = EnvironmentHelper.ChangeToJsLib(env.resourceInfo);
- //仅设计时才添加库
- if (monaco != null) {
- monaco.languages.typescript.javascriptDefaults.addExtraLib(jscode, 'resource.js');
- }
- env.expressExecutor = new ExpressExecutor(jscode);
- return env;
- };
- /**
- * 创建单行表达式编辑器
- * @param {any} node html节点(div)
- * @param {any} setting 配置信息
- */
- window.zlExpressEditor.CreateSingleRowEditor = function (node, setting, changeCallback, env) {
- //debugger;
- //初始化资源树
- let _editor = monaco.editor.create(node, {
- minimap: {
- enabled: false
- },
- fontSize: 20,
- lineNumbers: 'off',
- language: setting.language ?? "javascript"
- });
- //将公共环境私有化【用于适配每个单行表达式不同的环境】
- _editor.resourceInfo = resourceInfo;
- _editor.allLeafNodes = allLeafNodes;
- _editor.expressExecutor = expressExecutor;
- if (env) {
- _editor.resourceInfo = env.resourceInfo;
- _editor.allLeafNodes = env.allLeafNodes;
- _editor.expressExecutor = env.expressExecutor;
- }
- if (setting.useCommonFunctions) {
- //启用基础函数库
- EnvironmentHelper.LoadExtraJsSource("./extra/commonFunctions.js");
- }
- //获取值
- _editor.GetJsCode = function () {
- return EnvironmentHelper.ChangeDisplayToCode(_editor.getModel().getValue(), _editor.allLeafNodes, enumSettings);
- //return _editor.getModel().getValue();
- };
- //设置值
- _editor.SetJsCode = function (jscode) {
- _editor.getModel().setValue(EnvironmentHelper.ChangeCodeToDisplay(jscode, _editor.allLeafNodes, enumSettings));
- //_editor.getModel().setValue(jscode);
- //todo:如果含有选项内容,则设置为只读,反之则设置为可写
- };
- //设置值
- _editor.GetFullJsCode = function () {
- return { display: _editor.getModel().getValue(), code: _editor.GetJsCode() };
- };
- //当内容变化的时候,调用内容变化回调
- if (changeCallback) {
- _editor.getModel().onDidChangeContent(e => changeCallback(e));
- }
- _editor.SetJsCode(setting.value);
- return _editor;
- };
- /**
- * 执行表达式代码
- * @param {any} jsCode
- */
- window.zlExpressEditor.ExecExpress = function (jsCode) {
- jsCode = EnvironmentHelper.ChangeCodeToDisplay(jsCode, allLeafNodes, enumSettings);
- return expressExecutor.Run(jsCode);
- };
- /**
- * 更新环境资源信息
- * @param {Array} updateData
- *
- * [{
- * paths:["path","path","path"],
- * value:obj
- * },{
- * paths:["path","path","path"],
- * value:obj
- * }]
- *
- */
- window.zlExpressEditor.UpdateResourceInfo = function (updateData) {
- if (updateData == null) {
- return;
- }
- //更新环境的JS
- let jsCode = "";
- updateData.forEach(p => {
- let target = resourceInfo;
- p.paths.forEach(pt => {
- target = target.find(i => i.id == pt);
- if (target == null) {
- //忽略并警告
- console.warn(`更新资源环境出错,找不到对应的path,${p.paths.join(".")}`);
- return;
- }
- if (target.children != null) {
- target = target.children;
- }
- });
- if (target != null) {
- target.propertyValue = p.value;
- jsCode += (target._path + " = " + target.GetValueDisplayString(target.propertyValue, target.propertType) + ";");
- }
- });
- //执行更新代码
- zlExpressEditor.ExecExpress(jsCode);
- };
- })();
|