From 8d6cf1d3a146ec59135558fd62261c57c895f4a3 Mon Sep 17 00:00:00 2001 From: shy Date: Sun, 24 Dec 2023 00:18:18 +0800 Subject: [PATCH] opt status --- const.js | 2 ++ frame.js | 41 +++++++++++++++++++++--------------- index.css | 18 ++++++++-------- lib/page.js | 42 ++++++++++++++++++++----------------- panel/footer.js | 9 +++++--- plugin/local/code/inner.css | 1 - plugin/local/code/vimer.css | 1 - plugin/state.js | 20 +++++++++--------- plugin/story/json.css | 16 +++++++------- plugin/story/json.js | 16 +++++++------- 10 files changed, 90 insertions(+), 76 deletions(-) diff --git a/const.js b/const.js index 0a41318f..a5018144 100644 --- a/const.js +++ b/const.js @@ -286,6 +286,7 @@ var http = { Accept: "Accept", ContentType: "Content-Type", ApplicationJSON: "application/json", ApplicationFORM: "application/x-www-form-urlencoded", } var html = {value: { + HEADER_HEIGHT: 48, RIVER_WIDTH: 230, PROJECT_WIDTH: 230, ACTION_HEIGHT: 32, STATUS_HEIGHT: 32, PLUG_WIDTH: 800, PLUG_HEIGHT: 480, STORY_HEIGHT: 480, FLOAT_HEIGHT: 480, FLOAT_WIDTH: 1200, DESKTOP_WIDTH: 1200, DESKTOP_HEIGHT: 684, @@ -328,6 +329,7 @@ var html = {value: { CLASS: "class", DARK: "dark", LIGHT: "light", WHITE: "white", BLACK: "black", FILTER: "filter", TOGGLE: "toggle", EXPAND: "expand", SPEED: "speed", HOVER: "hover", HOVER_SELECT: "hover,select", NOT_HIDE: ":not(.hide)", + PICKER: "picker", PAGE: "page", TABS: "tabs", MENU: "menu", NODE: "node", PLUG: "plug", ZONE: "zone", LIST: "list", ITEM: "item", NAME: "name", ICON: "icon", VIEW: "view", diff --git a/frame.js b/frame.js index 253bf4f9..f7e29a3f 100644 --- a/frame.js +++ b/frame.js @@ -280,13 +280,23 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { msg && item.name == nfs.SIZE && (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) { can.user.copy(event, can, item.value) - if (can.base.isIn(item.name, cli.COST, nfs.SIZE)) { - can.onappend._float(can, {title: "msg", index: ice.CAN_PLUGIN, display: "/plugin/story/json.js"}, [], function(sub) { + ], 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, cli.COST)) { + can.onappend._float(can, {index: "can.toast"}, [can.ConfIndex()]) + } else if (can.base.isIn(item.name, nfs.SIZE)) { + 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) } }}]) }) @@ -316,7 +326,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { var count = can.page.Select(can, can._output, html.TR, function(tr, index) { if (!can.page.ClassList.set(can, tr, html.HIDE, index > 0 && tr.innerText.indexOf(event.target.value) == -1)) { return tr } }).length - count += can.page.SelectChild(can, can.ui.content||can._output, html.DIV_ITEM, function(target) { + count += can.page.SelectChild(can, can.ui && can.ui.content? can.ui.content: can._output, html.DIV_ITEM, function(target) { if (!can.page.ClassList.set(can, target, html.HIDE, target.innerText.indexOf(event.target.value) == -1)) { return target } }).length can.user.toast(can, "filter out "+count+" lines") @@ -573,12 +583,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, _float: function(can, index, args, cb) { can.onappend.plugin(can, typeof index == code.OBJECT? (index.mode = chat.FLOAT, index.args = args, index): {index: index, args: args, mode: chat.FLOAT}, function(sub) { + sub._target.onclick = function(event) { can.page.Select(can, document.body, html.FIELDSET_FLOAT, function(target) { can.page.style(can, target, "z-index", target == sub._target? 10: 9) }) } sub.onmotion.float(sub), sub.onaction.close = function() { can.page.Remove(can, sub._target) }, cb && cb(sub) - sub._target.onclick = function(event) { - can.page.Select(can, document.body, "fieldset.float", function(target) { - can.page.style(can, target, "z-index", target == sub._target? 10: 9) - }) - } }, can._root._target) }, figure: function(can, meta, target, cb) { if (meta.type == html.SELECT || meta.type == html.BUTTON) { return } @@ -785,10 +791,11 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { var last = can._delay_list.meta[key]||0, self = can._delay_list.meta[key] = can._delay_list.list.push(cb) return can.core.Timer(interval||30, function() { cb(self, last, can._delay_list.meta[key]) }) }, - float: function(can) { var height = can.base.Max(html.FLOAT_HEIGHT, can.page.height()/2), width = can.base.Max(html.FLOAT_WIDTH, can.page.width()-html.RIVER_WIDTH) + float: function(can) { var height = can.base.Max(html.FLOAT_HEIGHT, can.page.height()/2), width = can.base.Max(html.FLOAT_WIDTH, can.page.width()-html.RIVER_WIDTH), top = html.HEADER_HEIGHT, left = html.RIVER_WIDTH + if (can.user.mod.isCmd) { height = can.base.Max(can.page.height()/2-html.ACTION_HEIGHT, can.page.height(), 320), width = can.page.width()/2, top = html.ACTION_HEIGHT, left = 0 } if (can.user.isMobile) { if (can.user.isLandscape()) { height = can.page.height()*3/4, width = can.page.width()*3/4 } else { width = can.page.width() } } - can.onimport.size(can, height, width, true), can.onmotion.move(can, can._target, {left: can.page.width()-width, top: can.page.height()/4}) - can.onmotion.resize(can, can._target, function(height, width) { can.onimport.size(can, height, width, true) }) + can.onimport.size(can, height, width, true), can.onmotion.move(can, can._target, {left: can.page.width()-width, top: (can.page.height()-height)/2}) + can.onmotion.resize(can, can._target, function(height, width) { can.onimport.size(can, height, width, true) }, top, left) }, clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), target }, cache: function(can, next) { var list = can.base.getValid(can.base.Obj(can.core.List(arguments).slice(2)), [can._output]) @@ -820,20 +827,20 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { can.core.Timer(time, function(event, value, index) { can.page.style(can, target, html.OPACITY, (index+1)/time.length) }, cb) }, move: function(can, target, layout) { layout && can.page.style(can, target, layout), can.onmotion.resize(can, target, function() {}) }, - resize: function(can, target, cb, top) { var begin, action + resize: function(can, target, cb, top, left) { var begin, action target.onmousedown = function(event) { if (event.which != 1 || event.target != target && !(can.page.ClassList.has(can, event.target, html.STATUS) && can.page.tagis(event.target, html.DIV))) { return } window._mousemove = target begin = {left: target.offsetLeft, top: target.offsetTop, height: target.offsetHeight, width: target.offsetWidth, x: event.x, y: event.y} }, target.onmouseup = function(event) { begin = null, delete(window._mousemove) } target.onmousemove = function(event) { if (begin) { var dy = event.y - begin.y, dx = event.x - begin.x switch (action) { - case html.LEFT: can.page.style(can, target, html.LEFT, can.base.Min(begin.left + dx, 0, window.innerWidth-target.offsetWidth)), dx = -dx + case html.LEFT: can.page.style(can, target, html.LEFT, can.base.Min(begin.left + dx, left||0, window.innerWidth-target.offsetWidth)), dx = -dx case html.RIGHT: cb? cb(begin.height, begin.width + dx): can.page.style(can, target, html.WIDTH, begin.width + dx); break - case html.TOP: can.page.style(can, target, html.TOP, can.base.Min(begin.top + dy, top, window.innerHeight-target.offsetHeight)), dy = -dy + case html.TOP: can.page.style(can, target, html.TOP, can.base.Min(begin.top + dy, top||0, window.innerHeight-target.offsetHeight)), dy = -dy case html.BOTTOM: cb? cb(begin.height + dy, begin.width): can.page.style(can, target, html.HEIGHT, begin.height + dy); break default: can.page.style(can, target, - html.LEFT, can.base.Min(begin.left + dx, 0, window.innerWidth-target.offsetWidth), + html.LEFT, can.base.Min(begin.left + dx, left||0, window.innerWidth-target.offsetWidth), html.TOP, can.base.Min(begin.top + dy, top||0, window.innerHeight-html.ACTION_HEIGHT) ) } can.onkeymap.prevent(event) @@ -842,7 +849,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { } else if (target.offsetWidth-margin < p.x) { cursor = "ew-resize", action = html.RIGHT } else if (target.offsetHeight-margin < p.y || can.page.ClassList.has(can, event.target, html.STATUS) && can.page.tagis(event.target, html.DIV)) { cursor = "ns-resize", action = html.BOTTOM } else if (p.y < margin) { cursor = "ns-resize", action = html.TOP - } else { cursor = "", action = "" } can.page.style(can, target, "cursor", cursor) + } else { cursor = event.target == target? "move": "", action = "" } can.page.style(can, target, "cursor", cursor) } } }, diff --git a/index.css b/index.css index 7f8a9399..c0233193 100644 --- a/index.css +++ b/index.css @@ -100,7 +100,6 @@ table.content th span { cursor:pointer; } table.content th i { position:absolute; right:var(--input-padding); cursor:pointer; } table.content th:not(.select) i { display:none; } table.content th.select { border:var(--notice-bg-color) solid 1px; } -/* table.content th.select { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } */ table.content th.select[data-asc="1"] i.bi-sort-down-alt { display:none; } table.content th.select[data-asc="0"] i.bi-sort-up { display:none; } table.content td { padding:var(--table-padding); } @@ -287,7 +286,6 @@ div.tabs>span { font-style:italic; } div.tabs>span.icon { font-size:var(--icon-font-size); font-style:normal; padding-left:var(--input-padding); visibility:hidden; } div.tabs.select>span.icon { visibility:visible; } div.tabs:hover>span.icon { visibility:visible; } -/* div.action>div.item.icons.start>span.icon { font-size:30px; line-height:28px; } */ fieldset.plugin>legend { font-style:italic; } fieldset.plugin>form.option>div.button.icons>input { display:none; } fieldset.plugin>div.action>div.button.icons>input { display:none; } @@ -307,7 +305,7 @@ fieldset.plug>div.action>div.button.icons>input { display:none; } fieldset.plug>form.option>div.icon:first-child { margin-left:var(--input-margin); } fieldset>form.option>div.text>span.value { line-height:calc(var(--action-height) - 2 * var(--input-padding)); -white-space:pre; padding:var(--input-padding) var(--button-padding); max-width:320px; height:var(--action-height); overflow:auto; } + white-space:pre; padding:var(--input-padding) var(--button-padding); max-width:320px; height:var(--action-height); overflow:auto; } fieldset.plug>form.option>div.text>span.value { display:none; } fieldset:not(.float)>form.option>div.text>span.value { display:none; } fieldset.float:not(.plug)>form.option>div.text:not(.filter)>input { display:none; } @@ -432,7 +430,6 @@ input[type=button].danger:hover { background-color:var(--danger-bg-color); color input[type=button].notice:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } input[type=button].danger { border:var(--danger-bg-color) solid 1px; } input[type=button].notice { border:var(--notice-bg-color) solid 1px; } -/* input[type=button][name=login] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } */ table.content tr:hover { background-color:var(--tr-hover-bg-color) !important; } table.content tr.select { background-color:var(--tr-hover-bg-color); } table.content th { background-color:var(--th-bg-color); color:var(--th-fg-color); } @@ -522,7 +519,6 @@ body.mobile fieldset.Action.cmd { margin-top:0; } body.mobile fieldset.Action>div.output { overflow-x:hidden; } body.mobile fieldset.word>div.output { overflow-x:hidden; } body.mobile fieldset.word>div.output div.story.flex { display:block; } -/* body.mobile fieldset.word>div.output div.story.flex>* { padding:unset; } */ body.mobile fieldset.word>div.output>fieldset.story>form.option>div.text { display:none; } body.mobile fieldset.word.float>div.output>div.project { top:var(--action-height); } body.mobile fieldset.web.code.inner.cmd>div.output { overflow:hidden; } @@ -602,15 +598,20 @@ fieldset.web.chat.location>div.output .amap-controls { z-index:unset; } fieldset.web.chat.location>div.output .amap-maptypecontrol { z-index:unset; } fieldset.web.chat.location>div.output>div.layout>div.layout>div.profile { background-color:var(--plugin-bg-color); position:absolute; right:0; width:360px; z-index:9; border-left:none; } fieldset.web.chat.iframe>form.option input[name=hash] { width:var(--river-width); } -fieldset.can.data>div.output { font-family:var(--code-font-family); font-size:14px; white-space:pre; } -fieldset.can.data>div.output div.item { display:flex; gap:5px; } +fieldset.can.data>div.output { font-family:var(--code-font-family); font-size:var(--code-font-size); white-space:pre; } +fieldset.can.data>div.output div.item:not(.hide) { display:flex; gap:5px; } +fieldset.can.data>div.output div.view div.item:not(.hide) { display:block; } fieldset.can.data>div.output div.item>span.icon { color:var(--disable-fg-color); } fieldset.can.data>div.output div.item.string>span.value { color:var(--code-string); } fieldset.can.data>div.output div.item.number>span.value { color:var(--code-constant); } fieldset.can.data>div.output div.item.object>span.value { color:var(--disable-fg-color); } fieldset.can.data>div.output div.item.target>span.value { color:var(--disable-fg-color); } fieldset.can.data>div.output div.item.function>span.value { color:var(--disable-fg-color); } -fieldset.can.view { font-size:14px; } +fieldset.can.data>div.output div.list.function { font-style:italic; border-left:blue solid 5px; margin-left:20px; } +fieldset.can.view>div.output { font-family:var(--code-font-family); font-size:var(--code-font-size); white-space:pre; } +fieldset.can.view>div.output div.item>span.toggle { width:var(--code-font-size); display:inline-block; } +fieldset.can.view>div.output div.item>span.inner { color:var(--disable-fg-color); } +fieldset.can.view>div.output div.list { border-left:var(--disable-fg-color) dashed 1px; padding-left:10px; margin-left:4px; } fieldset.Search div.story[data-type=spark] { margin:0; } fieldset.Search>div.output>div.profile { border-left:none; width:unset; } fieldset.Action.tabs table.content { width:100%; } @@ -627,7 +628,6 @@ fieldset.plug>div.output table.content { width:100%; } fieldset.plug.dream.zone>div.output>div.item { display:flex; padding:var(--input-padding); } fieldset.plug.dream.zone>div.output>div.item>img { margin-right:var(--input-margin); } fieldset.plug.dream.zone>div.output>div.item>span { line-height:var(--action-height); } -/* body>div.input.vimer.plug td:first-child { display:none; } */ body>div.carte.header.avatar img { width:370px; } body>fieldset.story.web.chat.wx.agent { position:fixed; left:0; bottom:0; } body.zh fieldset.inner>div.output>div.project>div.zone>div.item { letter-spacing:10px; border-top:var(--box-border); } diff --git a/lib/page.js b/lib/page.js index 4e97f3d5..2b6be130 100644 --- a/lib/page.js +++ b/lib/page.js @@ -110,20 +110,23 @@ Volcanos("page", { function show(value, deep) { deep = deep == undefined? 2: 0; switch (typeof value) { case code.OBJECT: if (!value) { return {} } if (value._path) { return {value: "@\""+value._path+"\""} } - if (value.tagName) { return {type: nfs.TARGET, value: "$ "+value.tagName.toLowerCase()+(value.className? nfs.PT+value.className.replaceAll(lex.SP, nfs.PT):"")} } + if (value.tagName) { return {type: nfs.TARGET, value: "$"+value.tagName.toLowerCase()+(value.className? nfs.PT+value.className.replaceAll(lex.SP, nfs.PT):"")} } if (deep < 0) { return {value: value.length == undefined? "{"+can.page.unicode.inner+"}": "["+can.page.unicode.inner+"]"} } if (value.length != undefined) { return {value: (value.length > 3? value.length+lex.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 6) { return short(show(value, deep-1).value, index+1) } }).join(mdb.FS)+"]"} } return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && val && list.length < 7) { return short(key+nfs.DF+show(val, deep-1).value, list.length) } }).join(mdb.FS)+"}"} case code.STRING: return {open: "s", close: "s", value: "\""+(deep == 2? value.replaceAll("\n", "\\n"): short(value))+"\""} case code.NUMBER: return {open: "n", close: "n", value: value} case code.BOOLEAN: return {open: "b", close: "b", value: value} - case code.FUNCTION: return {open: "f", close: "f", value: deep == 2? (""+value).split(lex.NL)[0]: "function(..) {..}"} + case code.FUNCTION: return {open: "f", close: "f", value: deep == 2? (""+value).split(lex.NL)[0]: "function(...) {...}"} default: return {value: value} } } var loaded = false, _show = show(value); _show.open = _show.open||open, _show.close = _show.close||close var ui = can.page.Append(can, target, [!key && value.tagName? can.page.AppendView(can, value): {view: [[html.ITEM, _show.type||typeof(value)], key == ""? html.SPAN: html.DIV], list: [ {view: [mdb.ICON, html.SPAN, _show.close+lex.SP]}, {view: [mdb.NAME, html.SPAN, key || key === 0? key+lex.SP: ""]}, {view: [mdb.VALUE, html.SPAN, _show.value]}, - ], onclick: function() { cb && cb(prefix, value); if (typeof value != code.OBJECT) { return } + ], onclick: function() { + cb && cb(prefix, value); if (!can.base.isIn(typeof value, code.OBJECT, code.FUNCTION)) { return } ui.icon.innerText = (can.onmotion.toggle(can, ui.list)? _show.open: _show.close)+lex.SP + if (typeof value == code.FUNCTION) { return ui.list.innerText = value.toString() } + if (loaded) { return } loaded = true, ui.icon.innerText = _show.open+lex.SP if (value.tagName) { can.page.Append(can, ui.list, [can.page.AppendView(can, value)]), can.onappend.style(can, mdb.VIEW, ui.list) can.core.List(can.core.Item(target, function(key, value) { if (["textContent", "innerHTML", "outerHTML"].indexOf(key) > -1 || typeof value == code.FUNCTION || key.toUpperCase() == key) { return } return key }).sort(), function(key) { @@ -137,33 +140,34 @@ Volcanos("page", { value.hasOwnProperty(key) && val) { return key } }).sort(), function(key) { can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb) }) var key = "__proto__"; value[key] && can.core.Item(value[key]).length > 0 && can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb) } - }}, {view: [[html.LIST, html.HIDE]], style: {"margin-left": "20px"}}]) - return ui + }}, {view: [[html.LIST, _show.type||typeof(value), html.HIDE]]}]); return ui }, AppendView: function(can, target, tag, list, loaded, cb) { function field(target) { return target? can.core.List(target.attributes, function(item) { - return item.value == "" || item.value == item.name? {type: html.SPAN, list: [{text: lex.SP}, {text: item.name}]}: - {type: html.SPAN, list: [{text: lex.SP}, {text: item.name}, {text: mdb.EQ}, {className: code.STRING, text: "\""+item.value+"\""}]} + return item.value == ""? undefined: {type: html.SPAN, list: [{text: lex.SP}, {text: item.name}, {text: mdb.EQ}, {className: code.STRING, text: JSON.stringify(item.value)}]} }): [] } var ui = {}; tag = tag||target.tagName.toLowerCase(), isclose = tag != mdb.META && tag != web.LINK, _field = field(target) - var inner = target.innerHTML? can.page.unicode.inner: ""; if (target && target.tagName) { target.innerText == target.innerHTML && (inner = target.innerText) } + var inner = target.children.length > 0 && target.innerText != target.innerHTML? can.page.unicode.inner: "" return {view: mdb.VIEW, list: [ {view: [[html.ITEM, target.tagName && target.tagName.toLowerCase()]], list: [ - {text: (target.children.length > 0? can.page.unicode.close: lex.SP)+lex.SP, _init: function(target) { ui.toggle = target }}, - {className: code.KEYWORD, text: can.page.trans(can, ice.LT)}, {className: code.KEYWORD, text: tag}, {type: html.SPAN, list: _field}, - {className: code.KEYWORD, text: can.page.trans(can, ice.GT)}, inner && {text: inner, _init: function(target) { ui.inner = target }}, - isclose && {className: code.KEYWORD, text: can.page.trans(can, ice.LT+nfs.PS+tag+ice.GT), _init: function(target) { ui._close = target }}, - ], onclick: function(event) { ui.toggle.innerText = (can.onmotion.toggle(can, ui.list)? can.page.unicode.open: can.page.unicode.close)+lex.SP + {text: [(inner? can.page.unicode.close: ""), "", html.TOGGLE], _init: function(target) { ui.toggle = target }}, + {className: code.KEYWORD, text: can.page.trans(can, ice.LT)}, {className: code.KEYWORD, text: tag}, {type: html.SPAN, list: _field}, {className: code.KEYWORD, text: can.page.trans(can, ice.GT)}, + inner? {text: [inner, "", code.INNER], _init: function(target) { ui.inner = target }}: + target.innerText? {text: target.innerText, _init: function(target) { ui.inner = target }}: + null, + {className: code.KEYWORD, text: can.page.trans(can, ice.LT+nfs.PS+tag+ice.GT), _init: function(target) { ui._close = target }}, + ], onclick: inner && function(event) { + ui.toggle.innerText = (can.onmotion.toggle(can, ui.list)? can.page.unicode.open: can.page.unicode.close)+lex.SP + if (target.children.length == 0) { return } ui.inner && can.onmotion.toggle(can, ui.inner), can.onmotion.toggle(can, ui.close), can.onmotion.toggle(can, ui._close) if (!loaded) { if (can.page.tagis(target, ctx.STYLE, nfs.SCRIPT)) { can.page.Append(can, ui.list, [{text: target.innerHTML}]) } else { can.page.Append(can, ui.list, can.core.List(target.children, function(node) { return can.page.AppendView(can, node, "", null, false, cb) })) } } loaded = true, can.base.isFunc(cb) && cb(target) - }, onmouseenter: function() { - can.page.Select(can, document.body, ".picker", function(target) { can.page.ClassList.del(can, target, "picker") }) - !can.page.tagis(target, nfs.SCRIPT) && can.onappend.style(can, "picker", target) + }, onmouseenter: function() { can.page.Select(can, document.body, nfs.PT+html.PICKER, function(target) { can.page.ClassList.del(can, target, html.PICKER) }) + !can.page.tagis(target, nfs.SCRIPT) && can.onappend.style(can, html.PICKER, target) }, _init: function(target) { can.onmotion.delay(can, function() { loaded && target.click() }) }}, - isclose && {view: [[html.LIST, html.HIDE]], style: {"margin-left": "20px"}, _init: function(target) { ui.list = target }, list: list}, - isclose && {view: [[html.ITEM, html.HIDE]], list: [{text: " "}, {className: code.KEYWORD, text: can.page.trans(can, ice.LT+nfs.PS+tag+ice.GT)}], _init: function(target) { ui.close = target }}, + inner && {view: [[html.LIST, html.HIDE]], _init: function(target) { ui.list = target }, list: list}, + inner && {view: [[html.ITEM, html.HIDE]], list: [{text: ["", "", html.TOGGLE]}, {className: code.KEYWORD, text: can.page.trans(can, ice.LT+nfs.PS+tag+ice.GT)}], _init: function(target) { ui.close = target }}, ]} }, AppendStyle: function(can, style) { @@ -303,7 +307,7 @@ Volcanos("page", { back: "◀", reback: "▶", push: "⇈", pull: "⇊", lt: "❮", gt: "❯", - inner: "..", + inner: "...", favor: "\u2606", }, inputs: function(can, list, type) { var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) { diff --git a/panel/footer.js b/panel/footer.js index a43f40e0..6cdf4aca 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -72,7 +72,7 @@ Volcanos(chat.ONPLUGIN, { if (!can.base.contains(item, arg[1]) || list[item]) { return } list[item] = true; msg.Push(arg[0], item) }) }), create: shy([wiki.CONTENT, wiki.TITLE], function(can, content, title) { can.user.toast(can, content, title) }), - }, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { + }, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { if (!can.db[NTIP]) { return } arg[0]? can.db[NTIP].Table(function(value) { msg.append = [mdb.TIME, "title", "content"], (value.title == arg[0] || value.content.indexOf(arg[0]) > -1) && msg.Push(value) }): msg.Copy(can.db[NTIP]), msg.StatusTimeCount() @@ -110,13 +110,15 @@ Volcanos(chat.ONPLUGIN, { ].concat(can.core.List([log.INFO, log.WARN, log.ERROR, chat.ONREMOTE, html.WSS], function(item) { return {name: item, value: stat[item]||"0"} }))) }), data: shy("网页数据", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can + can.onappend.style(can, "view") var root = can.Conf("_target")||can._root arg[0]? can.page.AppendData(can, can._output, arg[0], arg[0].split(nfs.PT).pop(), can.core.Value(root, arg[0]), function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click(): can.page.AppendData(can, can._output, "", root._name, root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click() }), view: shy("网页元素", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can if (can.Conf("_target")) { - can.page.Append(can, can._output, [can.page.AppendView(can, can.Conf("_target"))]) + var ui = can.page.Append(can, can._output, [can.page.AppendView(can, can.Conf("_target"))]) + can.onmotion.delay(can, function() { can.page.SelectOne(can, ui._target, "div.item", function(target) { target.click() }) }) } else if (arg[0]) { can.page.Append(can, can._output, [can.page.AppendView(can, can.page.SelectOne(can, document.body, arg[0]))]) } else { @@ -126,7 +128,8 @@ Volcanos(chat.ONPLUGIN, { list.push(p.tagName.toLowerCase()+(p.className? nfs.PT+p.className.replaceAll(lex.SP, nfs.PT).replace(".picker", ""): "")) } can.Option(mdb.KEY, list.reverse().join(ice.GT)) }), - ], true)]); can.onmotion.delay(can, function() { can.page.Select(can, ui._target, "div.item.head,div.item.body", function(target) { target.click() }) }) + ], true)]); + can.onmotion.delay(can, function() { can.page.Select(can, ui._target, "div.item.head,div.item.body", function(target) { target.click() }) }) } }), runtime: shy("网页环境", [mdb.KEY], function(can, msg, arg) { diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 639c8d14..89138145 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -70,6 +70,5 @@ body.light tr.line.insert { background-color:#ffeef0; } body.light tr.line.delet body.white tr.line.insert { background-color:#ffeef0; } body.white tr.line.delete { background-color:#e6ffed; } fieldset.inner:not(.monaco)>div.output div.content>tr.line * { font-family:var(--code-font-family); font-size:var(--code-font-size); } body:not(.windows) fieldset.inner>div.output>div.project * { font-family:var(--code-font-family); font-size:var(--code-font-size); } -/* body:not(.windows) fieldset.inner>div.output>div.project * { font-family:var(--code-font-family); } */ body:not(.windows) fieldset.inner>div.output>div.layout>div.tabs { font-family:var(--code-font-family); font-size:var(--code-font-size); } body:not(.windows) fieldset.inner>div.output>div.layout>div.path { font-family:var(--code-font-family); font-size:var(--code-font-size); } diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index ccbea0d3..81cff7a2 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -1,5 +1,4 @@ fieldset.vimer>div.output>div.layout>div.layout>div.layout div.content { border-left:var(--box-border); border-top:var(--box-border); } -/* fieldset.vimer>div.output>div.layout>div.layout div.content input.current { background-color:transparent; color:transparent; padding-left:var(--input-padding); height:var(--code-line-height); position:absolute; } */ fieldset.vimer>div.output>div.layout>div.layout input.current { background-color:transparent; color:transparent; padding-left:var(--input-padding); height:var(--code-line-height); position:absolute; } fieldset.vimer>div.output>div.layout>div.layout div.content div.complete { background-color:unset; padding-top:0; display:none; position:absolute; height:1px; overflow:visible; } fieldset.vimer>div.output>div.layout>div.layout div.content div.complete div.prefix { color:transparent; white-space:pre; float:left; } diff --git a/plugin/state.js b/plugin/state.js index 875b575e..5a7d8509 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -83,7 +83,7 @@ Volcanos(chat.ONACTION, {list: [ ["数据", "保存参数", "清空参数", "复制数据", "下载数据", "添加工具", "清空数据"], ["调试", "查看文档", "查看脚本", "查看源码", - "查看视图", "查看数据", "查看通知", + "查看通知", "查看视图", "查看数据", "会话存储", "本地存储", "查看报文", "查看配置", "查看日志", "删除工具", @@ -147,22 +147,22 @@ Volcanos(chat.ONACTION, {list: [ }) }, - "打包页面": function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) }, "查看文档": function(event, can) { can.requests(event, {action: ice.HELP}), can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, - "查看报文": function(event, can) { var msg = can._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) } - }) - }, + "查看脚本": 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.onappend._float(can, {index: "can.toast"}, [can.ConfIndex()]) }, - "查看视图": function(event, can) { can.onappend._float(can, {index: "can.view", _target: can._target}) }, + "查看视图": 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}) }, "会话存储": function(event, can) { can.onappend._float(can, {index: "can.sessionStorage"}, [can.ConfIndex()]) }, "本地存储": function(event, can) { can.onappend._float(can, {index: "can.localStorage"}, [can.ConfIndex()]) }, - "查看脚本": 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) { var msg = can._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) } + }) + }, "查看配置": function(event, can) { can.requests(event, {action: ctx.CONFIG}), can.onengine.signal(can, "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) }, refresh: function(event, can) { can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), true, can.Mode()) }, diff --git a/plugin/story/json.css b/plugin/story/json.css index d1156784..de8147f2 100644 --- a/plugin/story/json.css +++ b/plugin/story/json.css @@ -1,8 +1,8 @@ -div.json div.item { white-space:pre; } -div.json div.item:hover { background-color:transparent; color:unset; } -div.json div.item div.item { padding-left:15px; border:transparent solid 1px; border-left:lightblue dashed 1px; margin-left:5px; } -div.json div.item div.item:hover { border:var(--box-border); } -div.json div.item label.nonce { color:#9cbeca4f; } -div.json div.item span.string { color:orange; } -div.json label { user-select:none; } -body:not(.windows) div.json { font-family:monospace; } +div.output.json { font-family:var(--code-font-family); font-size:var(--code-font-size); white-space:pre; } +div.output.json div.item { cursor:text; } +div.output.json div.item:hover { background-color:transparent; color:unset; } +div.output.json div.item div.item { border:transparent solid 1px; border-left:var(--disable-fg-color) dashed 1px; padding-left:15px; margin-left:5px; } +div.output.json div.item div.item:hover { border:var(--box-border); } +div.output.json div.item span.key { cursor:pointer; } +div.output.json div.item span.string { color:var(--code-string); } +div.output.json div.item label.nonce { color:var(--disable-fg-color); user-select:none; } diff --git a/plugin/story/json.js b/plugin/story/json.js index f5e08222..18274d79 100644 --- a/plugin/story/json.js +++ b/plugin/story/json.js @@ -6,26 +6,26 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( switch (typeof data) { case code.OBJECT: if (data == null) { can.page.Append(can, target, [{text: "null"}]); break } function wrap(begin, end, add, cb, inner) { can.page.Append(can, target, [{text: begin}]) - add && can.page.Append(can, target, inner||[{text: ["...", html.LABEL, "nonce"]}]), cb() - can.page.Append(can, target, [{text: end}]) + add && can.page.Append(can, target, inner||[{text: [can.page.unicode.inner, html.LABEL, ["nonce", html.HIDE]]}]), cb(), can.page.Append(can, target, [{text: end}]) } function format(data) { return can.page.trans(can, JSON.stringify(data)) } function toggle(list) { return list && can.onmotion.toggle(can, list) } function _item() { return can.page.Append(can, list = list || can.page.Append(can, target, [html.LIST])._target, [html.ITEM])._target } if (can.base.isArray(data)) { var inner = "" if (hidden && can.core.List(data, function(item) { if (can.base.isIn(typeof item, code.STRING, code.NUMBER, code.BOOLEAN)) { return item } }).length == data.length) { - inner = [], can.core.List(data, function(item, index) { - inner.push({text: [format(item), "", [code.STRING, code.INNER]]}, index < data.length-1 && {text: [", ", "", [code.INNER]]}) - }) + inner = [], can.core.List(data, function(item, index) { inner.push({text: [format(item), "", [code.STRING, code.INNER]]}, index < data.length-1 && {text: [", ", "", [code.INNER]]}) }) } wrap("[", "]", data.length > 0, function() { can.core.List(data, function(value, index) { var item = _item() show(value, item, index, data.length) }) }, inner) } else { var length = can.core.Item(data).length, count = 0 wrap("{", "}", length > 0, function() { can.core.Item(data, function(key, value) { var item = _item() - can.page.Append(can, item, [{text: [format(key)], onclick: function(event) { - var display = !toggle(sub); can.page.SelectChild(can, sub.parentNode, "span.inner", function(target) { can.onmotion.toggle(can, target, display) }) - }}, {text: ": "}]); var sub = show(value, item, count++, length); hidden && sub && can.onmotion.hidden(can, sub) + can.page.Append(can, item, [{text: [format(key), "", mdb.KEY], onclick: function(event) { var display = !toggle(sub) + sub && can.page.SelectChild(can, sub.parentNode, "span.inner", function(target) { can.onmotion.toggle(can, target, display) }) + sub && can.page.SelectChild(can, sub.parentNode, "label.nonce", function(target) { can.onmotion.toggle(can, target, display) }) + }}, {text: ": "}]); key == ice.MSG_STATUS && (value = can.base.Obj(value[0])||value) + var sub = show(value, item, count++, length); hidden && sub && can.onmotion.hidden(can, sub) + key == ice.MSG_STATUS && (can.page.SelectChild(can, item, "label.nonce", function(target) { can.onmotion.toggle(can, target, true) })) }) }) } break case code.STRING: can.page.Append(can, target, [{text: [format(data), "", code.STRING]}]); break