diff --git a/frame.js b/frame.js index fde27e6d..d0752e74 100644 --- a/frame.js +++ b/frame.js @@ -871,6 +871,12 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", _focus: [], _init: function(can, can.onengine.signal(can, chat.ONKEYDOWN, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } can._keylist = can.onkeymap._parse(event, can, msg.Option("model"), can._keylist, can._output) } + can.onkeymap._build(can), document.body.onkeyup = function(event) { + if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } + var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } + can.onengine.signal(can, chat.ONKEYUP, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } + can._keylist = can.onkeymap._parse(event, can, msg.Option("model"), can._keylist, can._output) + } }, _build: function(can) { can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {list: {}} diff --git a/panel/action.css b/panel/action.css index a2e7bb92..72729d84 100644 --- a/panel/action.css +++ b/panel/action.css @@ -1,8 +1,8 @@ fieldset.Action { background-color:rgba(114, 153, 162, 0.54); min-width:160px; } fieldset.Action>div.action { background-color:#4682b46b; width:inherit; display:none; } -fieldset.Action>div.action div.tabs { font-size:1.1rem; padding:5px; height:21px; } -fieldset.Action>div.action div.tabs.select { background:#6495ed63; } -fieldset.Action>div.action div.tabs:hover { background:#6495ed63; } +fieldset.Action>div.action div { font-size:1.1rem; padding:5px; height:21px; float:left; cursor:pointer; } +fieldset.Action>div.action div.select { background:#6495ed63; } +fieldset.Action>div.action div:hover { background:#6495ed63; } fieldset.Action.tabs>div.action { display:block; } fieldset.Action.tabs>div.output>fieldset>legend { display:none; } fieldset.Action.tabs>div.output fieldset.plugin { display:none; } @@ -11,6 +11,32 @@ fieldset.Action.tabs>div.output fieldset.plugin.select { display:block; } fieldset.Action.grid>div.output fieldset.plugin { overflow:auto; float:left; } fieldset.Action.grid>div.output fieldset.plugin>div.output { overflow:auto; } +fieldset.Action>div.action div.tabview { font-size:1.1rem; padding:5px; height:21px; } +fieldset.Action>div.action div.tabview.select { background:#6495ed63; } +fieldset.Action>div.action div.tabview:hover { background:#6495ed63; } +fieldset.Action.tabview>div.action { display:block; } +fieldset.Action.tabview>div.output>fieldset>legend { display:none; } +fieldset.Action.tabview>div.output fieldset.plugin { display:none; overflow:auto; padding:0; } +fieldset.Action.tabview>div.output fieldset.plugin.select { display:block; } +fieldset.Action.tabview>div.output fieldset.plugin>form.option { display:none; } +fieldset.Action.tabview>div.output fieldset.plugin>div.action { display:none; } +fieldset.Action.tabview>div.output fieldset.plugin>div.status { display:none; } + +fieldset.Action.horizon>div.output fieldset.plugin { overflow:auto; float:left; padding:0; margin:0; } +fieldset.Action.horizon>div.output fieldset.plugin>legend { display:none; } +fieldset.Action.horizon>div.output fieldset.plugin>form.option { display:none; } +fieldset.Action.horizon>div.output fieldset.plugin>div.action { display:none; } +fieldset.Action.horizon>div.output fieldset.plugin>div.output { overflow:auto; } +fieldset.Action.horizon>div.output fieldset.plugin>div.status { display:none; } + +fieldset.Action.vertical>div.output fieldset.plugin { overflow:auto; float:left; padding:0; margin:0; } +fieldset.Action.vertical>div.output fieldset.plugin>legend { display:none; } +fieldset.Action.vertical>div.output fieldset.plugin>form.option { display:none; } +fieldset.Action.vertical>div.output fieldset.plugin>div.action { display:none; } +fieldset.Action.vertical>div.output fieldset.plugin>div.output { overflow:auto; } +fieldset.Action.vertical>div.output fieldset.plugin>div.status { display:none; } + + fieldset.Action.free>div.output fieldset.plugin { position:absolute; } fieldset.Action.free>div.output fieldset.plugin.select { display:block; } fieldset.Action.flow>div.output fieldset.plugin { float:left; } diff --git a/panel/action.js b/panel/action.js index 023535c5..bba85620 100644 --- a/panel/action.js +++ b/panel/action.js @@ -1,8 +1,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { + can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout, true) var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM) can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { - item.height = can.ConfHeight()-can.Conf(html.MARGIN_Y) - item.width = can.ConfWidth()-can.Conf(html.MARGIN_X) item.feature = can.base.Obj(item.feature||item.meta) item.inputs = can.base.Obj(item.inputs||item.list) @@ -11,7 +10,6 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { can.onimport._plugin(can, river, storm, sub, meta), skip || next() }) }, function() { - can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout, true) can.onimport._menu(can, msg), can.onkeymap._init(can) }) }, @@ -22,10 +20,10 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { return can.run(sub.request(event), can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), cb) }, can._plugins = can.misc.concat(can, can._plugins, [sub]) - can.page.Append(can, can._action, [{view: [html.TABS, html.DIV, meta.name], onclick: function(event) { + sub._tabs = can.page.Append(can, can._action, [{view: [html.TABS, html.DIV, meta.name], onclick: function(event) { can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target) can.onmotion.select(can, can._action, html.DIV_TABS, event.target) - }, onmouseenter: sub._legend.onmouseenter, ondblclick: sub._legend.onclick}]) + }, onmouseenter: sub._legend.onmouseenter, ondblclick: sub._legend.onclick}]).first }, _menu: function(can, msg) { if (can.user.mod.isPod || can.user.isMobile) { return } can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.onaction._menus), function(event, button, list) { @@ -160,13 +158,16 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target) can.base.isFunc(cb) && cb() }, _menus: [ - [chat.LAYOUT, "auto", "tabs", "grid", "free", "flow", "page", "toimage"], + [chat.LAYOUT, "auto", "tabs", "tabview", "vertical", "horizon", "grid", "free", "flow", "page", "toimage"], [ice.HELP, "tutor", "manual", "service", "devops", "refer"], ], _trans: { "layout": "布局", "auto": "默认布局", "flow": "流动布局", + "vertical": "上下分屏", + "horizon": "左右分屏", + "tabview": "标签分屏", "grid": "网格布局", "tabs": "标签布局", "free": "自由布局", @@ -189,6 +190,11 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target) can.onimport._cmd(can, item, next) }) }) }, + onkeydown: function(can, msg) { var event = msg._event + if (event.ctrlKey && event.key >= "1" && event.key <= "9") { + can.onmotion.select(can, can._action, html.DIV_TABS, parseInt(event.key)-1), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, parseInt(event.key)-1) + } + }, onsearch: function(can, msg, word) { if (word[0] == mdb.PLUGIN || word[0] == mdb.FOREACH) { can.onexport.plugin(can, msg, word) } }, @@ -201,6 +207,10 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target) return can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout||conf.layout, true) } + can.page.Append(can, can._action, [ + {text: [msg.Option("river_name")||river, html.DIV]}, + {text: [msg.Option("storm_name")||storm, html.DIV]} + ]) can.run({}, [river, storm], function(msg) { if (msg.Length() > 0) { return can.onimport._init(can, msg) } can.onengine.signal(can, chat.ONACTION_NOTOOL, can.request({}, {river: river, storm: storm})) }) @@ -214,14 +224,6 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target) can.isCmdMode() }, - layout: function(can, button, silent) { button = button||ice.AUTO - var cb = can.onlayout[button]; if (can.base.isFunc(cb) && cb(can, silent)) { return } - can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT)) - if (button == ice.AUTO) { button = "" } - can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button)) - can.onlayout._init(can) - }, - help: function(can, button) { can.user.open("/help/"+button+".shy") }, refresh: function(can) { can._root._height = window.innerHeight, can._root._width = window.innerWidth can.onlayout._init(can) @@ -233,30 +235,65 @@ Volcanos(chat.ONACTION, {help: "交互操作", _init: function(can, cb, target) table.onimport.layout? table.onimport.layout(table): can.onappend._output(sub, table._msg, sub._display) }) }, + layout: function(can, button, silent) { button = button||ice.AUTO + can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT)); if (button == ice.AUTO) { button = "" } + can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button)), can.onlayout._init(can) + can.onmotion.toggle(can, can._root.River._target, true), can.onmotion.toggle(can, can._root.Footer._target, true), can.onlayout._init(can) + + var cb = can.onlayout[button]; if (can.base.isFunc(cb)? cb(can, silent): (can.getActionSize(function(height, width) { + can.ConfHeight(can.base.Min(200, height-3*html.ACTION_HEIGHT-4*html.PLUGIN_MARGIN-200)), can.ConfWidth(width-4*html.PLUGIN_MARGIN) + }), false)) { return } + + can.core.Next(can._plugins, function(sub, next) { + sub.onaction._resize(sub, button != ice.AUTO, can.ConfHeight(), can.ConfWidth()) + can.onmotion.delay(can, next) + }) + }, + help: function(can, button) { can.user.open("/help/"+button+".shy") }, }) Volcanos(chat.ONLAYOUT, {help: "导出数据", + _grid: function(can, m, n) { + can.getActionSize(function(height, width) { + var h = (height-(4*n+1)*html.PLUGIN_MARGIN)/n, w = (width-(4*m+1)*html.PLUGIN_MARGIN)/m + can.ConfHeight(h-2*html.ACTION_HEIGHT-3*html.PLUGIN_MARGIN), can.ConfWidth(w) + can.core.List(can._plugins, function(sub) { sub.onaction._resize(sub, true, can.ConfHeight(), can.ConfWidth()) }) + }) + }, grid: function(can, silent) { - var ACTION_LAYOUT_FMT = " fieldset.Action.grid>div.output fieldset.plugin { width:_width; height:_height; } " can.user.input(event, can, [{name: "m", value: 2}, {name: "n", value: 2}], function(data) { - can.getActionSize(function(height, width) { var m = parseInt(data.m)||2, n = parseInt(data.n)||2 - var h = (height-(4*n+1)*html.PLUGIN_MARGIN)/n, w = (width-(4*m+1)*html.PLUGIN_MARGIN)/m - can.page.css(can.base.replaceAll(ACTION_LAYOUT_FMT, "_height", h+"px", "_width", w+"px")) - can.core.List(can._plugins, function(sub) { - can.page.style(can, sub._output, html.HEIGHT, sub.ConfHeight(h-2*html.ACTION_HEIGHT-3*html.PLUGIN_MARGIN), html.WIDTH, sub.ConfWidth(w)) - sub.onaction["刷新数据"]({}, sub) - can.ConfHeight(sub.ConfHeight()) - can.ConfWidth(sub.ConfWidth()) - }) - }) + can.onlayout._grid(can, parseInt(data.m), parseInt(data.n)) }, silent) + return true + }, + vertical: function(can) { + can.onmotion.hidden(can, can._root.River._target), can.onmotion.hidden(can, can._root.Footer._target), can.onlayout._init(can) + can.getActionSize(function(height, width) { can.ConfHeight(height/2), can.ConfWidth(width) + can.core.List(can._plugins, function(sub) { sub.onaction._resize(sub, true, can.ConfHeight(), can.ConfWidth()) }) + }) + }, + horizon: function(can) { + can.onmotion.hidden(can, can._root.River._target), can.onmotion.hidden(can, can._root.Footer._target), can.onlayout._init(can) + can.getActionSize(function(height, width) { can.ConfHeight(height), can.ConfWidth(width/2) + can.core.List(can._plugins, function(sub) { sub.onaction._resize(sub, true, can.ConfHeight(), can.ConfWidth()) }) + }) + }, + tabview: function(can) { + can.onmotion.hidden(can, can._root.River._target), can.onmotion.hidden(can, can._root.Footer._target), can.onlayout._init(can) + can.onmotion.delay(can, function() { + can.onmotion.select(can, can._action, html.DIV_TABS, 0), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0) + }) + can.getActionSize(function(height, width) { + can.ConfHeight(height-1*html.ACTION_HEIGHT-2*html.PLUGIN_MARGIN), can.ConfWidth(width-2*html.PLUGIN_MARGIN) + }) }, tabs: function(can) { - can.onmotion.select(can, can._action, html.DIV_TABS, 0) - can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0) + can.onmotion.select(can, can._action, html.DIV_TABS, 0), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0) + can.getActionSize(function(height, width) { + can.ConfHeight(height-3*html.ACTION_HEIGHT-4*html.PLUGIN_MARGIN), can.ConfWidth(width-4*html.PLUGIN_MARGIN) + }) }, free: function(can) { can.page.Select(can, can._target, [[html.DIV_OUTPUT, html.FIELDSET_PLUGIN]], function(item, index) { - can.page.style(can, item, {left: 40*index, top: 40*index}) can.onmotion.move(can, item, {left: 40*index, top: 40*index}) }) }, diff --git a/panel/river.js b/panel/river.js index 7d1155b9..ca7f1835 100644 --- a/panel/river.js +++ b/panel/river.js @@ -1,6 +1,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) { can.onmotion.clear(can), can.river_list = {}, can.storm_list = {} can.onimport._main(can, msg), can.onimport._menu(can, msg) + can._name_list = {} var select; can.page.Append(can, can._output, msg.Table(function(item, index) { return can.onimport._river(can, item, function(target) { @@ -27,6 +28,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }) }, _river: function(can, meta, cb) { + can._name_list[meta.hash] = meta.name return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) { can.onaction.storm(event, can, meta.hash) @@ -38,6 +40,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }} }, _storm: function(can, meta, river) { + can._name_list[can.core.Keys(river, meta.hash)] = meta.name return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) { can.onaction.action(event, can, river, meta.hash) @@ -113,6 +116,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["create", "share", "refres can.onlayout._init(can) can.onengine.signal(can, chat.ONSTORM_SELECT, can.request(event, { river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm), + river_name: can._name_list[river], storm_name: can._name_list[can.core.Keys(river, storm)], })) }) }, diff --git a/plugin/local/chat/iframe.js b/plugin/local/chat/iframe.js index 50357ca8..8a7b5c85 100644 --- a/plugin/local/chat/iframe.js +++ b/plugin/local/chat/iframe.js @@ -3,6 +3,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb) { }, layout: function(can) { var item = can.current; can.onmotion.clear(can) can.page.Append(can, can._output, [{type: html.IFRAME, src: item.link, height: can.ConfHeight(), width: can.ConfWidth(), style: {border: 0}}]) + can.onimport.title(can, item.name||item.link) }, }) Volcanos(chat.ONACTION, {help: "操作数据", diff --git a/plugin/local/code/xterm.js b/plugin/local/code/xterm.js index fb9e5f43..b6fb2b8f 100644 --- a/plugin/local/code/xterm.js +++ b/plugin/local/code/xterm.js @@ -1,4 +1,5 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb) { can.onmotion.clear(can) + can.onlayout._init(can) can.requireModules(["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() { var item = {hash: can.Option(mdb.HASH)}; msg.Table(function(value) { can.core.Value(item, value.key, value.value) }) item.text && can.onmotion.delay(can, function() { can.onimport._input(can, item.text+ice.NL) }) @@ -44,7 +45,7 @@ Volcanos(chat.ONACTION, {help: "操作数据", "反引号": function(event, can, button) { can.onimport._input(can, "`"), can._current.focus() }, }) Volcanos(chat.ONEXPORT, {help: "导出数据", list: [mdb.TYPE, mdb.NAME, "rows", "cols", "cursorY", "cursorX"], - term: function(can) { var term = can._current, item = term._item + term: function(can) { var term = can._current||{}, item = term._item; if (!item) { return } can.core.List(can.onexport.list, function(key) { can.Status(key, can.base.getValid(item[key], term[key], term.buffer.active[key], "")) }), can.Status(mdb.TYPE, item[mdb.TYPE]||""), can.Status(mdb.NAME, item[mdb.NAME]||"") diff --git a/plugin/state.js b/plugin/state.js index 81d72b71..05cd9685 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -118,6 +118,12 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [ sub.Mode(can.Mode()), sub.onlayout._init(sub) } }, + _resize: function(can, auto, height, width) { can.ConfHeight(height), can.ConfWidth(width) + auto? can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_WIDTH, can.ConfWidth()): + can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(height), html.WIDTH, can.ConfWidth(width), html.MAX_WIDTH, can.ConfWidth()) + // can.onaction["刷新页面"]({}, can, "刷新页面", can.core.Value(can, chat._OUTPUTS_CURRENT)) + can.onaction["刷新数据"]({}, can, "刷新数据", can.core.Value(can, chat._OUTPUTS_CURRENT)) + }, "刷新页面": function(event, can, button, sub) { can.core.CallFunc([sub.onimport, "_init"], {can: sub, msg: sub._msg, cb: function(msg) { can.user.toastSuccess(can) }, target: can._output}) diff --git a/plugin/table.js b/plugin/table.js index aecfc3b7..161e3704 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -27,6 +27,9 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar )); target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) } return ui }, + title: function(can, title) { + can._legend.innerHTML = title, can.sup && can.sup._tabs && (can.sup._tabs.innerHTML = title) + }, zone: function(can, list, target) { var color = [""] return can.page.Append(can, target, can.core.List(list, function(zone, index) { can.base.isString(zone) && (zone = {name: zone}); return zone && {view: html.ZONE+" "+zone.name, list: [ {view: html.NAME, inner: can.user.trans(can, zone.name), style: {background: color[index%color.length]}, onclick: function() { diff --git a/proto.js b/proto.js index 4a523558..b48b8adc 100644 --- a/proto.js +++ b/proto.js @@ -208,6 +208,7 @@ var chat = { ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch", ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote", + ONKEYUP: "onkeyup", ONKEYDOWN: "onkeydown", ONMOUSEENTER: "onmouseenter", ORIENTATIONCHANGE: "orientationchange", ONSTORM_SELECT: "onstorm_select", ONACTION_TOUCH: "onaction_touch", ONACTION_NOTOOL: "onaction_notool", ONACTION_CMD: "onaction_cmd", ONOPENSEARCH: "onopensearch", ONSEARCHFOCUS: "onsearchfocus", ONCOMMANDFOCUS: "oncommandfocus",