From 4c702817155a814d5aecaa3d802d11226f4a037e Mon Sep 17 00:00:00 2001 From: shy Date: Sun, 27 Aug 2023 21:06:17 +0800 Subject: [PATCH] opt studio --- const.js | 11 ++++++++ frame.js | 41 +++++++++++++++++++-------- index.css | 48 +++++++++++++++++++++++-------- lib/base.js | 1 + lib/page.js | 3 +- panel/action.js | 4 +-- panel/footer.js | 12 +++++++- panel/search.js | 2 +- plugin/local/code/inner.css | 5 ++-- plugin/local/code/inner.js | 16 +++++------ plugin/local/team/plan.js | 7 ++--- plugin/state.js | 7 ++++- plugin/table.js | 56 +++++++++++++++++++++++++++++++------ 13 files changed, 161 insertions(+), 52 deletions(-) diff --git a/const.js b/const.js index 134d24ed..89bf6ee6 100644 --- a/const.js +++ b/const.js @@ -89,6 +89,7 @@ var web = {CHAT: "chat", GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE", Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded", IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm", + URL: "url", CODE_GIT_STATUS: "web.code.git.status", CODE_GIT_REPOS: "web.code.git.repos", @@ -108,6 +109,7 @@ var web = {CHAT: "chat", } var aaa = { SESS: "sess", + AUTH: "auth", USER: "user", EMAIL: "email", LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", @@ -239,6 +241,13 @@ var mall = { ASSET: "asset", SALARY: "salary", } +var http = { + ContentType: "Content-Type", +} +var mime = { + TextPlain: "text/plain", + ApplicationJSON: "application/json", +} var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, FIELDSET: "fieldset", LEGEND: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status", OPTION_ARGS: "select.args,input.args,textarea.args", INPUT_ARGS: "input.args,textarea.args", INPUT_BUTTON: "input[type=button]", INPUT_FILE: "input[type=file]", @@ -266,6 +275,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, SCROLLBAR: "scrollbar", VISIBILITY: "visibility", VERTICAL: "vertical", HORIZON: "horizon", + NOTICE: "notice", DANGER: "danger", SIZE: "size", OPACITY: "opacity", VISIBLE: "visible", CLASS: "class", LIGHT: "light", DARK: "dark", @@ -283,6 +293,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte", DESKTOP: "desktop", DIV_DESKTOP: "div.desktop", DIV_EXPAND: "div.expand", DIV_ITEM_SELECT: "div.item.select", + DIV_TABS_SELECT: "div.tabs.select", } var svg = { GROUP: "group", PID: "pid", GRID: "grid", diff --git a/frame.js b/frame.js index 586edd1c..448d0103 100644 --- a/frame.js +++ b/frame.js @@ -1,9 +1,10 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { + console.log(can.misc._time()) if (!can.user.isMailMaster) { if (can.misc.Search(can, ice.MSG_SESSID)) { can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)); return can.misc.Search(can, ice.MSG_SESSID, "") } } can.Option = function() {}, can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) } can.user.title(can.misc.SearchOrConf(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host) can.core.Next(list, function(item, next) { item.type = chat.PANEL - can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub + can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub, sub.db = {}, sub.ui = {}, sub.db._boot = can.misc._time() sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, sub, cmds, cb) } can.core.Item(sub.onplugin, function(key, cmd) { sub.onplugin.hasOwnProperty(key) && can.base.isFunc(cmd) && can.onengine.plugin(sub, can.core.Keys(ice.CAN, key), cmd) }) can.core.ItemCB(sub.onaction, function(key, cb) { can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {event: msg._event, can: sub, msg: msg}) }) }) @@ -107,7 +108,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { var output = can.page.SelectOne(can, field, html.DIV_OUTPUT) var status = can.page.SelectOne(can, field, html.DIV_STATUS) legend.innerHTML = legend.innerHTML || meta.index - can.base.isIn(meta.index, web.WIKI_PORTAL) && can.onappend.style(can, html.OUTPUT, field) + (can.base.isIn(meta.index, web.WIKI_PORTAL) || meta.style == html.OUTPUT) && can.onappend.style(can, html.OUTPUT, field) var sub = Volcanos(meta.name, {_root: can._root||can, _follow: can.core.Keys(can._follow, meta.name), _target: field, _legend: legend, _option: option, _action: action, _output: output, _status: status, _history: [], Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } try { @@ -178,9 +179,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }) }; var auto; can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add, function() { skip || can.Conf(ice.AUTO) == "delay" || auto && auto.click() }) }, - _action: function(can, list, action, meta) { meta = meta||can.onaction||{}, action = action||can._action, can.onmotion.clear(can, action) + _action: function(can, list, action, meta, hold) { meta = meta||can.onaction||{}, action = action||can._action, hold || can.onmotion.clear(can, action) function run(event, button) { can.misc.Event(event, can, function(msg) { var _can = can._fields? can.sup: can; can.requestAction(event, button) - var cb = meta[button]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: button}): can.run(event, button == mdb.LIST? []: [ctx.ACTION, button].concat(_can.Input())) + var cb = meta[button]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: button}): + can.run(event, button == mdb.LIST? []: [ctx.ACTION, button].concat(_can.Input())) }) } return can.core.List(can.page.inputs(can, can.base.getValid(can.base.Obj(list), can.core.Value(can, [chat.ONACTION, mdb.LIST]), meta != can.onaction? can.core.Item(meta): [])||[]), function(item) { can.base.isUndefined(item) || can.onappend.input(can, item == ""? /* 1.空白 */ {type: html.BR}: @@ -189,7 +191,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }}: item.length > 0? /* 3.列表 */ {type: html.SELECT, name: item[0], values: item.slice(1), onchange: function(event) { can.misc.Event(event, can, function(msg) { var button = event.target.value; meta[item[0]]? can.core.CallFunc(meta[item[0]], [event, can, item[0], button]): meta[button] && can.core.CallFunc(meta[button], [event, can, button]) }) }}: /* 4.其它 */(item.type == html.BUTTON && (item.value = item.value||can.user.trans(can, item.name, meta._trans), item.onclick = item.onclick||function(event) { - run(event, item.name) + run(event, item.name||item.value) }, item._init = item._init||function(target) { item.action && can.onappend.figure(sub, item, target, function(_sub, value) { can.Update() }) if (can.base.isIn(item.name, mdb.CREATE, mdb.INSERT)) { can.onappend.style(can, "icons", target.parentNode) can.page.Append(can, target.parentNode, [{icon: item.name, onclick: function(event) { can.Update(event, [ctx.ACTION, item.name]) }}]) @@ -213,10 +215,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.onappend._output(can, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display) }) }, - _output: function(can, msg, display, output, action, cb) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output + _output: function(can, msg, display, cb, output, status, action) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output can.misc.Search(can, log.DEBUG) == ice.TRUE && can.base.beginWith(display, "/require/src/") && delete(Volcanos.meta.cache[display]) Volcanos(display, {_root: can._root, _follow: can.core.Keys(can._follow, display), _fields: can._target, _target: output, _path: display||chat.PLUGIN_TABLE_JS, - _legend: can._legend, _option: can._option, _action: can._action, _output: output, _status: can._status, + _legend: can._legend, _option: can._option, _action: action||can._action, _output: output, _status: status||can._status, Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, db: {}, ui: {}, }, [display, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf()) var last = can.sub; last && can.core.CallFunc([last, "onaction.hidden"], {can: last}) @@ -229,7 +231,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) }) } can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) { - if (action !== false) { + if (action !== false) { can.onkeymap._build(sub) can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) } @@ -312,7 +314,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { target.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.run(can.request(event, can.Option()), [ctx.ACTION, target.name]) }) } }) } return code.scrollBy && code.scrollBy(0, 10000), code }, - tools: function(can, msg, cb, target) { can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []), cb, target) }, + tools: function(can, msg, cb, target) { + can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT), can.misc.sessionStorage(can, [can.ConfIndex(), "tool"]))||[], cb, target) + }, style: function(can, style, target) { target = target||can._fields||can._target if (can.base.endWith(style, ".css")) { return can.require([style]) } @@ -391,6 +395,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.page.style(can, target, html.HEIGHT, h, html.WIDTH, w), width -= w } }), can.core.List(list, function(item) { if (can.base.isArray(item)) { layout(type == FLOW? FLEX: FLOW, item, height, width) } }) } + ui.profile && can.onmotion.hidden(can, ui.profile), ui.display && can.onmotion.hidden(can, ui.display) if (can.onimport.filter) { ui.filter = can.onimport.filter(can, ui.project) } ui.layout = function(height, width, delay, cb) { can.onmotion.delay(can, function() { defer = [], layout(type, ui.list, height, width), defer.forEach(function(cb) { cb() }), cb && cb(content_height, content_width) }, delay||0) }; return ui }, @@ -480,7 +485,10 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro } } if (layout.left+target.offsetWidth > left+width) { layout.left = (right? rect.left: left+width)-target.offsetWidth-1 } - }); return can.onmotion.move(can, target, layout), layout + }); + can.onmotion.move(can, target, layout) + can.onmotion.slideDown(can, target) + return layout }, }) Volcanos(chat.ONMOTION, {_init: function(can, target) { @@ -596,7 +604,9 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { }, 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]) - var key = next(can._cache_data = can._cache_data||{}, list[0]._cache_key); if (key == list[0]._cache_key) { return true } + var data = can._cache_data = can._cache_data||{}, old = list[0]._cache_key + var key = next(function(save) { if (old) { data[old] = save } }, function(hash, load) { var bak = data[hash]; if (bak) { load(bak) } return hash }) + if (key == old) { return true } can.core.List(list, function(target) { target && target._cache_key && can.page.Cache(target._cache_key, target, target.scrollTop+1) }) return key && can.core.List(list, function(target) { if (!target) { return } var pos = can.page.Cache(target._cache_key = key, target); if (pos) { target.scrollTo && target.scrollTo(0, pos-1); return target } @@ -648,7 +658,14 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { } } }, - touch: function() { + slideDown: function(can, target) { + var top = target.offsetTop, offset = 32, begin = top - offset + can.page.style(can, target, html.TOP, begin) + can.core.Timer({interval: 1, length: 30}, function(timer, interval, index, list) { + can.page.style(can, target, html.TOP, begin += offset/list.length) + }, function() { + can.page.style(can, target, html.TOP, top) + }) }, }) Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||document.body diff --git a/index.css b/index.css index f3b3d147..d7478a7a 100644 --- a/index.css +++ b/index.css @@ -166,6 +166,7 @@ body { --code-constant:gray; --code-string:brown; --code-object:purple; --box-border:var(--plugin-border-color) solid 1px; + --box-notice:var(--notice-bg-color) solid 1px; --box-shadow:var(--body-fg-color) 2px 2px 8px; --svg-stroke-width:2; } @@ -213,13 +214,6 @@ fieldset>form.option>div.item.select { border-radius:5px; } fieldset>div.action>div.item.select { border-radius:5px; } fieldset>div.action>div.item.button { border-radius:5px; } fieldset>div.action>div.item { margin-right:10px; box-shadow:var(--box-shadow); } - -fieldset.web.code.docker.studio>div.action>div.item { font-style:italic; height:32px; padding:5px 10px; } -fieldset.web.code.docker.studio>div.output>fieldset { margin:0; } -fieldset.web.code.docker.studio>div.output>fieldset>legend { display:none; } -fieldset.web.code.docker.studio>div.output>fieldset>form.option>div:first-child { margin-left:10px; } -fieldset.web.code.docker.studio>div.output { padding:10px; } - fieldset>div.output { width:100%; } fieldset>div.output table.content input { margin-right:10px; box-shadow:var(--box-shadow); } fieldset>div.status { width:100%; } @@ -279,7 +273,7 @@ select, input { font-size:1rem; height:32px; } input::placeholder, textarea::pl textarea { font-size:1rem; tab-size:2; padding:5px; height:96px; width:100%; resize:vertical; } table.content, div.code, div.story[data-type=spark] { white-space:pre; margin:0; } div.story[data-type=spark] { padding:0 5px; border-left:var(--notice-bg-color) solid 5px; } -fieldset>div.action>div.tabs { font-style:italic; padding:0 10px;} +fieldset>div.action>div.tabs { font-style:italic; padding-left:10px; box-shadow:var(--box-shadow); margin-left:5px; } fieldset>div.output>div.code { font-size:14px; } fieldset>div.status>div.item { padding:5px; height:31px; } fieldset>div.status>div.item>label { font-size:0.6rem; } @@ -405,9 +399,19 @@ fieldset.full { position:fixed; left:0; top:0; } fieldset>div.output>div.code { position:sticky; left:0; } legend, select, input[type=button], th, table.content td, h1, h2, h3, div.item, div.tabs { cursor:pointer; } div.story[data-type=spark] { cursor:copy; } -fieldset>div.status>legend { margin-right:10px; float:right; clear:none; } -fieldset>div.status>legend:not(:hover):not(.select) { background-color:unset; box-shadow: var(--box-shadow); } +fieldset>div.status>legend { + font-style:italic; margin-right:5px; float:right; clear:none; + border-radius: 0; border-bottom-left-radius:10px; border-bottom-right-radius:10px; + box-shadow: var(--box-shadow); +} +fieldset>div.status>legend>span.remove { margin-left:10px; } +fieldset>div.status>legend>span.remove:hover { background-color:var(--hover-bg-color); } +fieldset>div.status>legend:not(:hover)>span.remove { visibility:hidden; } +fieldset>div.status>legend:not(:hover):not(.select) { background-color:unset; border-radius: 0; } /* hover */ +div.item.notice input:hover[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } +div.item.danger input:hover[type=button] { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } +input:hover[type=button][name=create] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } input:hover[type=button][name=create] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } input:hover[type=button][name=insert] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } input:hover[type=button][name=restart] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } @@ -451,7 +455,18 @@ span.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-c span.item.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } span.icon:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.action div.tabs:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } -div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } +/* div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } */ +div.action div.tabs { + /* border-top-left-radius:10px; border-top-right-radius:10px; */ +} +div.action div.tabs:hover { + background-color:var(--output-bg-color); color:var(--hover-fg-color); + border-top-left-radius:10px; border-top-right-radius:10px; +} +div.action div.tabs.select { + background-color:var(--output-bg-color); color:var(--hover-fg-color); + border-top-left-radius:10px; border-top-right-radius:10px; +} fieldset>div.output { background-color:var(--output-bg-color); } fieldset>div.status { border-top:var(--status-border); max-height:32px; } fieldset:not(.panel):not(.cmd) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); } @@ -482,6 +497,7 @@ body.light fieldset.panel:not(.main):not(.auto) div.item.select { background-col body.light fieldset.panel:not(.main):not(.auto) input { background-color:var(--panel-input-bg-color); color:var(--panel-input-fg-color); border-radius:var(--input-radius); } body.light fieldset.panel:not(.main)>div.output>div.item>input::placeholder { background-color:var(--panel-input-bg-color); color:var(--panel-fg-color); } body.light fieldset.panel:not(.main) label { color:var(--panel-fg-color); } +body.light fieldset.panel:not(.main) a { color:var(--panel-fg-color); } body.light span.keyword { color:darkblue; } body.light span.function { color:darkcyan; } body.dark span.keyword { color:royalblue; } body.dark span.function { color:lightgreen; } /* print */ @@ -531,7 +547,17 @@ fieldset.draw.trend div.output { overflow:hidden; } fieldset.draw.spide div.output { overflow-y:hidden; } fieldset.draw.spide div.output svg text { cursor:pointer; } fieldset.draw.spide div.output svg path { stroke-width:1; } +fieldset.web.code.docker.studio>div.action>div.item { font-style:italic; height:32px; padding:5px 10px; } +fieldset.web.code.docker.studio>div.output>fieldset { margin:0; } +fieldset.web.code.docker.studio>div.output>fieldset>legend { display:none; } +fieldset.web.code.docker.studio>div.output>fieldset>form.option>div:first-child { margin-left:10px; } +fieldset.web.code.docker.studio>div.output { padding:10px; } fieldset.web.code.git.status>div.output table.content { width:100%; } +fieldset.cmd>legend { background-color:var(--ui-blue-8); } +fieldset.cmd>div.action>div.tabs.select { border-bottom:var(--notice-bg-color) solid 2px; height:32px; } +fieldset.cmd>div.status>legend.select { border-top:var(--notice-bg-color) solid 2px; } +fieldset.cmd>div.output>div.project div.item.select { border-right:var(--notice-bg-color) solid 4px; } +fieldset.cmd>div.output>div.project div.item { line-height:32px; } fieldset.can.view { font-size:14px; } fieldset.can.data { font-size:14px; } img, iframe { margin-bottom:-3px; } diff --git a/lib/base.js b/lib/base.js index b864efe6..259f1af4 100644 --- a/lib/base.js +++ b/lib/base.js @@ -117,6 +117,7 @@ Volcanos("base", { if (arg[i] && str.replace) { while (str.indexOf(arg[i]) > -1) { str = str.replace(arg[i], arg[i+1]) } } } return str }, contains: function(str) { var arg = arguments; for (var i = 1; i < arg.length; i++) { if (!arg[i] || str.indexOf(arg[i]) > -1) { return true } } }, + capital: function(str) { return str.slice(0, 1).toUpperCase()+str.slice(1) }, beginWith: function(str) { for (var i = 1; i < arguments.length; i++) { if (typeof str == code.STRING && str.trim().indexOf(arguments[i]) == 0) { return true } diff --git a/lib/page.js b/lib/page.js index 4575fa33..b00b4baf 100644 --- a/lib/page.js +++ b/lib/page.js @@ -206,7 +206,8 @@ Volcanos("page", { Format: function(type) { var arg = arguments; switch (type) { case html.A: return ""+(arg[2]||arg[1])+"" case html.IMG: return arg[2]? "": "" - case html.SPAN: return arg[2]? ""+arg[1]+"": arg[1] + case html.SPAN: + return arg[2]? ""+arg[1]+"": arg[1] default: /* type inner arg... */ var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) } return list.concat(">", arg[1], "").join("") diff --git a/panel/action.js b/panel/action.js index 9cf24982..52e2b24d 100644 --- a/panel/action.js +++ b/panel/action.js @@ -48,8 +48,8 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { }) }, onstorm_select: function(can, msg, river, storm) { - if (can.onmotion.cache(can, function(cache, old) { old && (cache[old] = can._plugins) - var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)); return can._plugins = cache[key]||[], key + if (can.onmotion.cache(can, function(save, load) { save({plugins: can._plugins}) + return load(can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)), function(bak) { can._plugins = bak.plugins }) }, can._output, can._action, can._header_tabs)) { if (msg.Option("refresh") != "true") { return can.onaction.layout(can) } } can.run(can.request({}, {_method: web.GET}), [river, storm], function(msg) { if (msg.Length() == 0) { return can.user.isLocalFile? can.user.toastFailure(can, "miss data"): can.onengine.signal(can, chat.ONACTION_NOTOOL, can.request({}, {river: river, storm: storm})) } diff --git a/panel/footer.js b/panel/footer.js index ea303ebf..ca86e9df 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -29,7 +29,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, can. ncmd: function(can, msg, _follow, _cmds) { can.onimport._data(can, NCMD, {time: can.base.Time(), follow: _follow, cmds: _cmds}), can.onimport.nlog(can, NLOG) }, nlog: function(can, name) { can.onimport.count(can, name) }, }) -Volcanos(chat.ONACTION, {_init: function(can) { can.ui = {}, can.db = {} }, +Volcanos(chat.ONACTION, {_init: function(can) {}, onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth) }, onlogin: function(can, msg) { can.run(can.request({}, {_method: web.GET}), [], function(msg) { can.onmotion.clear(can), can.onimport._init(can, msg, can._output) }) }, ontoast: function(can, msg) { can.core.CallFunc(can.onimport.ntip, {can: can, msg: msg}) }, @@ -112,5 +112,15 @@ Volcanos(chat.ONPLUGIN, { ], 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) { + msg.Echo(JSON.stringify({ + href: location.href, + height: can.page.height(), width: can.page.width(), + userAgent: navigator.userAgent, + history: history.length, + boot: can.db._boot, + version: window._version, + })).Display("/plugin/story/json.js") + }) }) })() diff --git a/panel/search.js b/panel/search.js index 43c8b84b..aeb25cbe 100644 --- a/panel/search.js +++ b/panel/search.js @@ -5,7 +5,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can can.onmotion.toggle(can, can._status, can.db.type != mdb.FOREACH) && can.onappend._status(can, can.base.Obj(msg.Option(ice.MSG_STATUS), []).concat({name: mdb.SELECT, value: "0"})) can.onmotion.focus(can, can.ui.filter), msg.Length() == 1 && can.ui.profile.innerHTML == "" && can.page.Select(can, table, html.TD)[0].click() }, - _size: function(can) { can.ui && can.getActionSize(function(left, top, width, height) { + _size: function(can) { can.ui && can.ui.content && can.getActionSize(function(left, top, width, height) { can.page.style(can, can._target, {left: left||0, top: top||0, width: width}), can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*html.PLUGIN_MARGIN+html.ACTION_HEIGHT+can.onexport.statusHeight(can)) can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth(width-2*html.PLUGIN_MARGIN)) }) can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight-1, height/2)) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index ccdcc3c3..dcec511d 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -44,9 +44,10 @@ fieldset.inner>div.output>div.project>div.zone>div.item>span.icon { font-style:n fieldset.inner.cmd>div.output>div.layout>div.tabs { height:38px; display:block; overflow:hidden; background-color:var(--plugin-bg-color); } fieldset.inner.cmd>div.output>div.layout>div.tabs.hide { display:none; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div { padding:10px; height:38px; float:left; } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs { padding-right:0; margin-left:5px; box-shadow:var(--box-shadow); } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.icon { font-size:26px; line-height:32px; padding:2px 5px; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs.select { background-color:var(--output-bg-color); box-shadow:var(--box-shadow); } -fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs.select { background-color:var(--output-bg-color); border-top-left-radius:10px; border-top-right-radius:10px; } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); border-top-left-radius:10px; border-top-right-radius:10px; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>span { font-style:italic; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>span.icon { padding:0 5px; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.usernick { float:right; position:sticky; top:0; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index fc963057..12920ccf 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -6,6 +6,7 @@ const PROFILE_ARGS = "profile:args:", DISPLAY_ARGS = "display:args:" const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "selectLine" const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select" Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0]) + can.Mode(msg.Option("mode")||can.Mode()), can.Option(nfs.FILE) == " " && can.Option(nfs.FILE, "") if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE) } can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.endWith(p, "-dict/")) { return } if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) } @@ -221,7 +222,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp }, target) }) } else if (msg.Option(ice.MSG_DISPLAY) != "") { - can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY), target, false, function(msg) { can.onimport.layout(can) }) + can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY), function(msg) { can.onimport.layout(can) }, target) } else if (msg.Result().indexOf("