diff --git a/const.js b/const.js index bb6d1e4c..9fab90a4 100644 --- a/const.js +++ b/const.js @@ -257,7 +257,7 @@ var chat = { ONSTORM_SELECT: "onstorm_select", ONACTION_NOSTORM: "onaction_nostorm", ONACTION_NOTOOL: "onaction_notool", ONACTION_TOUCH: "onaction_touch", ONACTION_CMD: "onaction_cmd", ONACTION_REMOVE: "onaction_remove", ONOPENSEARCH: "onopensearch", ONSEARCH_FOCUS: "onsearch_focus", ONCOMMAND_FOCUS: "oncommand_focus", ONTHEMECHANGE: "onthemechange", ONLAYOUT: "onlayout", ONUNLOAD: "onunload", ONWEBPACK: "onwebpack", - ONTOAST: "ontoast", ONDEBUG: "ondebug", ONSHARE: "onshare", ONPRINT: "onprint", + ONTOAST: "ontoast", ONSHARE: "onshare", ONPRINT: "onprint", ONDEBUGS: "ondebugs", _INIT: "_init", _DELAY_INIT: "_delay_init", _TRANS: "_trans", _STYLE: "_style", _ENGINE: "_engine", _SEARCH: "_search", _NAMES: "_names", _TOAST: "_toast", diff --git a/frame.js b/frame.js index 3d4582d4..bf1f3774 100644 --- a/frame.js +++ b/frame.js @@ -272,33 +272,38 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }) }, _status: function(can, list, status, msg) { status = status||can._status, can.onmotion.clear(can, status); var keys = {} + var fileline = can.base.trimPrefix((can.Conf("_fileline")||"").split("?")[0], "/require/") can.core.List((can.base.Obj(list, can.core.Value(can, [chat.ONEXPORT, mdb.LIST]))||[]).concat(can.misc.Search(can, log.DEBUG)==ice.TRUE? [ - {name: html.HEIGHT, value: can.ConfHeight()}, {name: html.WIDTH, value: can.ConfWidth()}, - ]: []), function(item) { item = can.base.isString(item)? {name: item}: item + can.Conf("_fileline") && {name: nfs.SOURCE, value: fileline, onclick: function(event) { can.onkeymap.prevent(event) + var ls = can.misc.SplitPath(can, fileline); if (event.metaKey) { + can.user.open(can.misc.MergePodCmd(can, {pod: can.ConfSpace(), cmd: web.CODE_VIMER, path: ls[0], file: ls[1]})) + } else { + can.onappend._float(can, web.CODE_VIMER, ls) + } + }}, + {name: html.HEIGHT, value: can.ConfHeight(), onclick: function(event) { can.onappend._float(can, {index: "can.view", _target: can._fields||can._target}) }}, + {name: html.WIDTH, value: can.ConfWidth(), onclick: function(event) { can.onappend._float(can, {index: "can.data", _target: can}) }}, + ]: []), function(item) { if (!item) { return } item = can.base.isString(item)? {name: item}: item if (item && item.name == web.SPACE && item.value) { item.value = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: item.value}), item.value) } if (can.base.beginWith(item.value, nfs.PS, ice.HTTP)) { item.value = can.page.Format(html.A, item.value, item.value.split("?")[0]) } if (keys[item.name]) { return can.Status(item.name, item.value) } keys[item.name] = item msg && item.name == cli.COST && (item.value = msg.Option(ice.MSG_COST)||item.value) - msg && item.name == nfs.SIZE && (item.value = can.base.Size(item.value||msg._xhr.responseText.length)) + msg && item.name == "msg" && (item.value = can.base.Size(item.value||msg._xhr.responseText.length)) can.page.Append(can, status, [{view: html.ITEM, list: [ {text: [can.page.Color(can.user.trans(can, item.name, null, html.INPUT)), html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value == undefined? "": (item.value+"").trim())+"", html.SPAN, item.name]}, - ], onclick: function(event) { - if (item.name == mdb.COUNT) { - can.onappend._float(can, {index: ctx.CONFIG}, [can.ConfIndex()]) - } else if (can.base.isIn(item.name, mdb.TIME)) { + ], onclick: item.onclick||function(event) { + if (can.base.isIn(item.name, mdb.TIME)) { can.onappend._float(can, {index: "can.debug"}, ["log", can.ConfIndex()]) + } else if (item.name == mdb.COUNT) { + can.onappend._float(can, {index: ctx.CONFIG}, [can.ConfIndex()]) } else if (can.base.isIn(item.name, cli.COST)) { can.onappend._float(can, {index: "can.toast"}, [can.ConfIndex()]) - } else if (can.base.isIn(item.name, nfs.SIZE)) { + } else if (can.base.isIn(item.name, "msg")) { can.onappend._float(can, {title: "msg(报文)", index: ice.CAN_PLUGIN, display: "/plugin/story/json.js"}, [], function(sub) { sub.run = function(event, cmds, cb) { var _msg = can.request(event); _msg.result = [JSON.stringify(msg)], cb(_msg) } }) } else if (item.name == ice.LOG_TRACEID) { can.onappend._float(can, web.CODE_XTERM, ["sh", item.value, "grep "+item.value+" var/log/bench.log | grep -v grep | grep -v '"+item.value+" $'"]) - } else if (can.base.isIn(item.name, html.HEIGHT)) { - can.onappend._float(can, {index: "can.view", _target: can._fields||can._target}) - } else if (can.base.isIn(item.name, html.WIDTH)) { - can.onappend._float(can, {index: "can.data", _target: can}) } else { can.user.copy(event, can, item.value) } @@ -426,22 +431,17 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { item._enter = function(event, value) { if (event.ctrlKey) { run(event, mdb.MODIFY, [key, value]) } } can.onmotion.modifys(can, event.target, function(event, value, old) { run(event, mdb.MODIFY, [key, value]) }, item) }, onmouseout: function() { - can.page.SelectChild(can, can._option, html.DIV_ITEM_TEXT, function(target) { - can.page.ClassList.del(can, target, "will") - }) + can.page.SelectChild(can, can._option, html.DIV_ITEM_TEXT, function(target) { can.page.ClassList.del(can, target, "will") }) }, onmouseover: function(event) { can.page.SelectChild(can, can._option, html.DIV_ITEM_TEXT, function(target) { can.page.ClassList.set(can, target, "will", can.page.ClassList.has(can, target, key)) }) }, title: can.user.trans(can, can.Option(key) == undefined? key: "click to detail", null, html.INPUT), _init: function(target) { key == ctx.ACTION && can.onappend.mores(can, target, data, msg.IsDetail()? 10: html.TABLE_BUTTON) - var list = can.page.Select(can, target, html.INPUT, function(target) { - var _icon = can.Conf("feature._icons."+target.name)||icon[target.name]; if (_icon) { return target } - }) - can.core.List(list, function(target) { can.onappend.style(can, "icons", target) - var _icon = can.Conf("feature._icons."+target.name)||icon[target.name] + var list = can.page.Select(can, target, html.INPUT, function(target) { var _icon = can.Conf("_icons."+target.name)||icon[target.name]; if (_icon) { return target } }) + can.core.List(list, function(target) { can.onappend.style(can, "icons", target); var _icon = can.Conf("_icons."+target.name)||icon[target.name] can.page.insertBefore(can, [{icon: _icon, title: can.user.trans(can, target.name), onclick: target.onclick||function(event) { - can.Update(can.request(event, data), [ctx.ACTION, target.name]), can.onkeymap.prevent(event) + can.Update(can.request(event, data, {_toast: ice.PROCESS}), [ctx.ACTION, target.name]), can.onkeymap.prevent(event) }}], target.nextSibling, target.parentNode) }) can.page.SelectOne(can, target, html.SPAN, function(span) { can.core.List(span.style, function(key) { target.style[key] = span.style[key] }) }) @@ -579,12 +579,15 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { if (meta.inputs && meta.inputs.length > 0 || meta.meta) { can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, _cb, target, field); return res } var value = can.onengine.plugin(can, meta.index); if (value) { can.onappend._plugin(can, value, meta, function(sub, meta, skip) { value.meta && value.meta._init && value.meta._init(sub, meta), _cb(sub, meta, skip) }, target, field); return res } - can.runAction(can.request({}, {_method: http.GET, pod: meta.space})._caller(), ctx.COMMAND, [meta.index], function(msg) { msg.Table(function(value) { can.onappend._plugin(can, value, meta, _cb, target, field) })}); return res + can.runAction(can.request({}, {_method: http.GET, pod: meta.space})._caller(), ctx.COMMAND, [meta.index], function(msg) { + if (msg.Length() == 0) { can.onappend._plugin(can, {index: "can._plugin", style: html.HIDE}, meta, _cb, target, field) } + msg.Table(function(value) { can.onappend._plugin(can, value, meta, _cb, target, field) }) + }); return res }, _plugin: function(can, value, meta, cb, target, field) { can.base.Copy(meta, value, true) meta.type = meta.type||chat.STORY, meta.name = meta.name||value.meta&&value.meta.name||"", meta.help = meta.help||value.help||"", meta.height = meta.height||can.ConfHeight(), meta.width = meta.width||can.ConfWidth() meta.inputs = can.base.getValid(meta.inputs, can.base.Obj(value.list))||[], meta.feature = can.base.getValid(meta.feature, can.base.Obj(value.meta))||{} - meta.args = can.base.getValid(can.base.Obj(meta.args), can.base.Obj(meta.arg), can.base.Obj(value.args), can.base.Obj(value.arg))||[] + meta.index = value.index||meta.index, meta.args = can.base.getValid(can.base.Obj(meta.args), can.base.Obj(meta.arg), can.base.Obj(value.args), can.base.Obj(value.arg))||[] can.onappend._init(can, meta, [chat.PLUGIN_STATE_JS], function(sub, skip) { sub.run = function(event, cmds, cb) { if (can.base.isFunc(value)) { diff --git a/index.css b/index.css index cf119487..0e5699a2 100644 --- a/index.css +++ b/index.css @@ -105,7 +105,7 @@ table.content th.select[data-asc="0"] i.bi-sort-up { display:none; } table.content td { padding:var(--table-padding); } table.content td input.icons { display:none; } table.content td i:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); cursor:pointer; } -table.content td i { padding:var(--input-padding); } +table.content td i { padding:var(--input-padding); font-size:20px; } body:not(.mobile) fieldset.plugin:not(.plug):not(.float):not(.full):not(.cmd)>div.output>table.content td input.icons { display:unset; } body:not(.mobile) fieldset.plugin:not(.plug):not(.float):not(.full):not(.cmd)>div.output>table.content td i { display:none; } table.content.checkbox th:first-child { text-align:center; padding:var(--table-padding); position:sticky; left:2px; z-index:1; } @@ -128,7 +128,7 @@ iframe { height:var(--iframe-height); width:100%; } /* fieldset */ fieldset>legend { box-shadow:var(--box-shadow); } fieldset>form.option>div.item:not(.icon) { margin-right:var(--button-margin); box-shadow:var(--box-shadow); } -fieldset.story:not(.float)>form.option>div.item.icons:not(.icon) { margin-right:0; } +/* fieldset.story:not(.float)>form.option>div.item.icons:not(.icon) { margin-right:0; } */ fieldset>form.option>div.item.textarea { width:100%; height:var(--textarea-height); } fieldset>form.option>div.item.text.cmd { width:100%; } fieldset>form.option>div.item.text.cmd>input { background-color:var(--code-bg-color); color:var(--code-fg-color); width:100%; } diff --git a/panel/action.js b/panel/action.js index c66b1896..1f0024f3 100644 --- a/panel/action.js +++ b/panel/action.js @@ -2,12 +2,12 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM), list = can.misc.SearchHash(can) can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN, item.mode = can.Mode(); if (item.deleted == ice.TRUE) { return next() } item.width = can.ConfWidth()-can.Conf(html.MARGIN_X); if (item.style == html.OUTPUT) { item.width = can.ConfWidth()-2*html.PLUGIN_MARGIN-2*html.PLUGIN_PADDING } - if (msg.Length() == 1) { - item.height = can.ConfHeight()-(can.user.isMobile? 1: 1)*html.ACTION_HEIGHT-can.Conf(html.MARGIN_Y) - } - can.onappend.plugin(can, item, function(sub, meta, skip) { can._plugins = (can._plugins||[]).concat([sub]), can.onimport._tabs(can, sub, meta), skip || next() + if (msg.Length() == 1) { item.height = can.ConfHeight()-(can.user.isMobile? 1: 1)*html.ACTION_HEIGHT-can.Conf(html.MARGIN_Y) } + can.onappend.plugin(can, item, function(sub, meta, skip) { + can._plugins = (can._plugins||[]).concat([sub]), can.onimport._tabs(can, sub, meta), skip || next() sub.onaction._close = function() { can.onengine.signal(can, chat.ONACTION_REMOVE, can.request({river: river, storm: storm}, item)), can.page.Remove(can, sub._target) } - sub.run = function(event, cmds, cb) { return can.run(can.request(event, {pod: meta.space||meta.pod}), [river, storm, meta.id||meta.index].concat(cmds), cb) } + sub.run = function(event, cmds, cb) { return can.run(can.request(event, {pod: meta.space||meta.pod}), + (can.base.beginWith(meta.index, "can.")? []: [river, storm, meta.id||meta.index]).concat(cmds), cb) } sub.onexport.output = function() { can.page.style(can, sub._output, html.MAX_HEIGHT, "") } }) }, function() { if (can.isCmdMode()) { return } can.user.mod.isCmd = false diff --git a/panel/footer.js b/panel/footer.js index c94388a3..9a8b0842 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -51,7 +51,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {}, oncommand_focus: function(can) { can.page.Select(can, can._output, ["div.cmd", html.INPUT], function(target) { can.onmotion.focus(can, target) }) }, ondebugs: function(can, msg) { can.runAction(msg, msg.Option(ctx.ACTION), [msg.Option(ctx.INDEX)], function(_msg) { _msg.Table(function(item) { can.onappend._float(can, item, can.base.Obj(item.args, []), function(sub) { - sub.run = function(event, cmds, cb) { can.run(can.request(event, {_method: http.POST, space: sub.Conf(web.SPACE)}), [ctx.ACTION, msg.Option(ctx.ACTION), ctx.RUN].concat(cmds), cb) } + sub.run = function(event, cmds, cb) { can.run(can.request(event, {_method: http.POST, pod: sub.ConfSpace()}), [ctx.ACTION, msg.Option(ctx.ACTION), ctx.RUN].concat(cmds), cb) } }) }) }) }, }) @@ -130,13 +130,8 @@ Volcanos(chat.ONPLUGIN, { can.onappend.style(can, "view") }), console: shy("网页终端", { - prompt: function(can, msg, arg, meta) { msg.detail = [] - msg._can.onimport.grow(msg._can, msg, "only", ["\r", - can.base.Time(null, "[%H:%M:%S]"), "can$ "].join("")) - }, - resize: function(can, msg, arg, meta) { msg.detail = [] - meta.prompt(can, msg, arg, meta) - }, + prompt: function(can, msg, arg, meta) { msg.detail = [], msg._can.onimport.grow(msg._can, msg, "only", ["\r", can.base.Time(null, "[%H:%M:%S]"), "can$ "].join("")) }, + resize: function(can, msg, arg, meta) { msg.detail = [], meta.prompt(can, msg, arg, meta) }, input: function(can, msg, arg, meta) { can = msg._can, msg.detail = [], can._list = can._list||[] var text = atob(arg[0]); function grow(text) { can.onimport.grow(can, msg, "only", text) } if (text == "\r") { var cmd = can._list.join("") @@ -154,7 +149,7 @@ Volcanos(chat.ONPLUGIN, { grow(text), can._list = (can._list||[]).concat(text) } }, - }, [ice.CMD], function(can, msg, arg) { msg._can.Option("cmd", "") + }, [ice.CMD], function(can, msg, arg) { msg._can.Option(ice.CMD, "") msg.Display("/plugin/local/code/xterm.js") }), runtime: shy("网页环境", [mdb.KEY], function(can, msg, arg) { diff --git a/plugin/state.js b/plugin/state.js index 2d25d103..1b096117 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -50,7 +50,7 @@ Volcanos(chat.ONIMPORT, { can.page.Append(can, div, [{text: arg}]), can._output.scrollTop = div.offsetTop, div.scrollBy(0, 10000), true })) { can.onappend.board(can, arg) } }, - _open: function(can, msg, arg) { can.user.opens(arg), can.Update() }, + _open: function(can, msg, arg) { can.user.opens(arg) }, _close: function(can, msg) { can.user.close() || history.back() }, change: function(event, can, name, value, cb, data) { return can.page.SelectArgs(can, can._option, "", function(input) { if (input.name != name || value == input.value) { return } can.page.Select(can, input.parentNode, "span.value", function(target) { target.innerText = value }) @@ -80,6 +80,7 @@ Volcanos(chat.ONIMPORT, { Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", "切换全屏", "共享工具", "生成链接", function(can) { if (!can.isCmdMode()) { return "打开链接" } }, function(can) { if (can.isCmdMode()) { return "打开首页" } }, function(can) { if (can.ConfSpace() || can.isCmdMode() && can.misc.Search(can, ice.POD)) { return "打开空间" } }, + function(can) { if (can.misc.Search(can, log.MSG_DEBUG)) { return "查看源码" } }, ["视图", "参数", function(can) { if (can._action.innerHTML) { return "操作" } }, function(can) { if (can._status.innerHTML) { return "状态" } }, @@ -94,8 +95,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", function(can) { if (can.Conf("_help")) { return "查看文档" } }, "查看脚本", "查看源码", "查看通知", "查看视图", "查看数据", "会话存储", "本地存储", - "查看报文", "查看配置", "查看日志", - "删除工具", + "查看报文", "查看配置", "查看日志", "删除工具", ], ], _engine: function(event, can, button) { can.Update(event, [ctx.ACTION, button].concat(can.Input())) }, @@ -122,6 +122,8 @@ Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", }) }, "远程控制": function(event, can) { can.onaction.keyboard(event, can) }, "共享工具": function(event, can) { var meta = can.Conf(); can.onmotion.share(can.request(event, {pod: can.ConfSpace()}), can, [], [mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input())]) }, + "打开首页": function(event, can) { can.user.open(location.origin) }, + "打开空间": function(event, can) { can.user.open(can.misc.MergePodCmd(can, {pod: can.ConfSpace()||can.misc.Search(can, ice.POD)})) }, "打开链接": function(event, can) { can.user.open(can.onexport.link(can)) }, "生成链接": function(event, can) { can.onmotion.share(event, can, [], [web.LINK, can.user.copy(event, can, can.onexport.link(can))]) }, "生成脚本": function(event, can) { var args = can.Input().join(lex.SP), list = [ @@ -156,12 +158,9 @@ Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", }) }, "清空数据": function(event, can) { can.onmotion.clear(can, can._output) }, - "打开首页": function(event, can) { can.user.open(location.origin) }, - "打开空间": function(event, can) { can.user.open(can.misc.MergePodCmd(can, {pod: can.ConfSpace()||can.misc.Search(can, ice.POD)})) }, - - "查看文档": function(event, can) { can.requests(event, {action: ice.HELP}), can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, - "查看脚本": function(event, can) { can.onappend._float(can, web.CODE_INNER, can.misc.SplitPath(can, can.sub._path)) }, - "查看源码": function(event, can) { can.requests(event, {action: nfs.SOURCE}), can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, + "查看文档": function(event, can) { can.requests(event, {action: ice.HELP}), can.onengine.signal(can, chat.ONDEBUGS, can.requestPodCmd(event)) }, + "查看脚本": function(event, can) { can.onappend._float(can, web.CODE_VIMER, can.misc.SplitPath(can, can.sub._path)) }, + "查看源码": function(event, can) { can.requests(event, {action: nfs.SOURCE}), can.onengine.signal(can, chat.ONDEBUGS, can.requestPodCmd(event)) }, "查看通知": function(event, can) { can.onappend._float(can, {index: "can.toast"}, [can.ConfIndex()]) }, "查看视图": function(event, can) { can.onappend._float(can, {index: "can.view", _target: can._fields||can._target}) }, "查看数据": function(event, can) { can.onappend._float(can, {index: "can.data", _target: can}) }, @@ -172,7 +171,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", sub.run = function(event, cmds, cb) { var _msg = can.request(event); _msg.result = [JSON.stringify(msg)], cb(_msg) } }) }, - "查看配置": function(event, can) { can.requests(event, {action: ctx.CONFIG}), can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, + "查看配置": function(event, can) { can.requests(event, {action: ctx.CONFIG}), can.onengine.signal(can, chat.ONDEBUGS, can.requestPodCmd(event)) }, "查看日志": function(event, can) { var logid = can.Status("log.id"); can.onappend._float(can, web.CODE_XTERM, ["sh", logid, "grep "+logid+" var/log/bench.log | grep -v grep | grep -v '"+logid+" $'"]) }, "打包页面": function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) }, "删除工具": function(event, can) { can.onaction._close(event, can) }, diff --git a/proto.js b/proto.js index 85c93266..978c643f 100644 --- a/proto.js +++ b/proto.js @@ -54,7 +54,7 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {}, requests: function(event) { var msg = can.request(event); function set(key, value) { msg.Option(key, value) } can.core.List(arguments, function(item, index) { if (!item || index == 0) { return } can.core.Item(item, set) }); return msg }, - requestPodCmd: function(event) { return can.request(event, {space: can.ConfSpace(), index: can.ConfIndex()}) }, + requestPodCmd: function(event) { return can.request(event, {pod: can.ConfSpace(), index: can.ConfIndex()}) }, requestAction: function(event, button) { return can.request(event, {action: button, _toast: event.isTrusted? ice.PROCESS+" "+button: ""}) }, runActionInputs: function(event, cmds, cb) { var msg = can.request(event), meta = can.Conf() if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]})