diff --git a/frame.js b/frame.js index 5adc9992..afbbd675 100644 --- a/frame.js +++ b/frame.js @@ -14,6 +14,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, can.onengine.listen(can, key, function(msg) { can.core.CallFunc(item, {can: panel, msg: msg}) }) } }), panel.const(panel.onaction._const||[]), panel._trans = panel.onaction._trans panel.onaction._init(panel, item, item.list, next, panel._target) + can.onmotion.float.auto(can, panel._output, "carte", "input") }, target) }, function() { can.onlayout.topic(can) can.misc.Log(can.user.title(), cli.RUN, can) @@ -114,8 +115,8 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, value == undefined? (value = item.value): (item.value = value) }); return value }, - Update: function() { - sub.onappend._output(sub, sub.Conf(), {}, sub.Pack()) + Update: function(event, cmds, cb, silent) { + sub.onappend._output(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent) }, Action: function(key, value) { if (typeof key == "object") { return sub.core.Item(key, sub.Action), key } @@ -143,7 +144,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.base.isFunc(cb) && cb(sub) }, target) }, - Pack: function(cmds, silent) { + Input: function(cmds, silent) { cmds = cmds && cmds.length > 0? cmds: sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) { return item.name && item.value || "" }); for (var i = cmds.length-1; i >= 0; i--) { @@ -185,7 +186,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return msg.Option("_handle", "true"), can.core.CallFunc(table.onaction[cmds[1]], {event: event, can: table, msg: msg}) } - return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) + return can.Update(event, can.Input(cmds, silent), cb, silent) }, can._inputs[item.name] = input can.core.Item(input.onaction, function(key, value) { @@ -202,7 +203,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.core.List(list, function(item) { can.onappend.input(can, item == ""? /*空白*/ {type: "space"}: typeof item == "string"? /*按键*/ {type: html.BUTTON, value: item, onclick: function(event) { var cb = meta[item]||meta["_engine"] - cb? can.core.CallFunc(cb, [event, can, item]): can.run(event, [ctx.ACTION,item].concat(can.sup.Pack())) + cb? can.core.CallFunc(cb, [event, can, item]): can.run(event, [ctx.ACTION,item].concat(can.sup.Input())) }}: item.length > 0? /*列表*/ {type: "select", name: item[0], values: item.slice(1), onchange: function(event) { var which = item[event.target.selectedIndex+1] @@ -226,8 +227,8 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var input = msg.Option("_handle") != "true" && cmds && cmds[0] == ctx.ACTION && feature && feature[cmds[1]]; if (input) { can.user.input(event, can, input, function(ev, button, data, list, args) { var msg = can.request(event, {_handle: "true"}, can.Option()) - can.onappend._output(can, meta, event, cmds.slice(0, 2).concat(args), function(msg) { - can.onappend._output(can, meta, {}, can.Pack(), cb) + can.Update(event, cmds.slice(0, 2).concat(args), function(msg) { + can.Update({}, can.Input(), cb) }, true) }) return @@ -253,7 +254,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return msg.Option("_handle", "true"), can.core.CallFunc(table.onaction[cmds[1]], {event: event, can: table, msg: msg}) } - return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) + return can.Update(event, can.Input(cmds, silent), cb, silent) }, can._outputs.push(table), table._msg = msg table._display = display @@ -305,7 +306,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var title = can.Conf(["feature", "title", item.name].join("."))||"" - var input = {type: html.INPUT, name: item.name, data: item, dataset: {}} + var input = {type: html.INPUT, name: item.name, data: item, dataset: {}, _init: item._init, style: item.style} item.value == "auto" && (item.value = "", item.action = "auto") item.action == "auto" && (input.dataset.action = "auto") title && (input.title = title) @@ -457,21 +458,44 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, float: function(can, msg, cb) { var ui = can.onappend.field(can, "story toast float", {}, document.body) + ui.close = function() { can.page.Remove(can, ui.first), can.onengine.signal(can, "keymap.focus") } + can.onmotion.float.auto(can, ui.output, "carte", "input") can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { can.page.Modify(can, ui.output, {style: {"max-width": width, "max-height": height-28}}) can.page.Modify(can, ui.first, {style: {top: top, left: left}}) }) - can.onappend._action(can, ["关闭", "刷新"], ui.action, { - "关闭": function(event) { can.page.Remove(can, ui.first) }, - "刷新": function(event) { can.page.Remove(can, ui.first), can.toast.click() }, + + can.onappend._action(can, ["关闭", "刷新", {input: "text", placeholder: "filter", style: {position: ""}, _init: function(input) { + can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) { + if (event.target.tagName == "INPUT") { return } + if (event.key == "Escape") { ui.close(); return } + if (event.key == " ") { input.focus() + event.stopPropagation(), event.preventDefault() + } + }})) + }, onkeydown: function(event) { + can.onkeypop.input(event, can) + if (event.key != "Enter") { return } + event.target.setSelectionRange(0, -1) + can.page.Select(can, ui.output, "tr", function(tr, index) { if (index == 0) { return } + can.page.Modify(can, tr, {style: {display: "none"}}) + can.page.Select(can, tr, "td", function(td) { + if (td.innerText.indexOf(event.target.value) > -1) { + can.page.Modify(can, tr, {style: {display: ""}}) + } + }) + }) + }}], ui.action, { "关闭": ui.close, + "刷新": function(event) { ui.close(), can.toast.click() }, }) can.onappend.table(can, msg, function(value, key, index, line, list) { return {text: [value, "td"], onclick: function(event) { can.base.isFunc(cb) && cb(value, key, index, line, list) }} }, ui.output) + can.onappend.board(can, msg.Result(), ui.output) return ui }, }, [], function(can) {}) @@ -655,7 +679,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe if (back.length > 120 || back.indexOf("\n") > -1) { return can.onmotion.modifys(can, target, cb) } - var ui = can.page.Appends(can, target, [{type: html.INPUT, value: back, style: {width: target.offsetWidth > 400? 400: target.offsetWidth-20}, onkeydown: function(event) { + var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {width: target.offsetWidth > 400? 400: target.offsetWidth-20}, onkeydown: function(event) { switch (event.key) { case "Enter": target.innerHTML = event.target.value @@ -924,15 +948,13 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe return status }, }) -Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, target) { - var focus = []; can.onengine.listen(can, "keymap.focus", function(cb) { - cb? focus.push(cb): focus.pop() - }) +Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { + var focus = can.onkeypop._focus + // can.onengine.listen(can, "keymap.focus", function(cb) { cb? focus.push(cb): focus.pop() }) + can.onengine.listen(can, "keymap.focus", function(cb) { cb? focus.push(cb): can.onkeypop._focus.length = 0 }) can.onkeypop._build(can) - target.onkeydown = function(event) { - if (focus.length > 0) { return focus[focus.length-1](event) } - if (event.target != target) { return } - can.page.Select(can, target, "fieldset.Action>div.output", function(item) { + target.onkeydown = function(event) { if (focus.length > 0) { return focus[focus.length-1](event) } + event.target == target && can.page.Select(can, target, "fieldset.Action>div.output", function(item) { target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item) }) } @@ -947,7 +969,6 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe }) }, _parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key) - // can.Status("按键", list.join("")) for (var pre = 0; pre < list.length; pre++) { if ("0" <= list[pre] && list[pre] <= "9") { continue } break }; var count = parseInt(list.slice(0, pre).join(""))||1 @@ -955,7 +976,6 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe function repeat(cb, count) { list = [] for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } event.stopPropagation(), event.preventDefault() - // can.Status("按键", list.join("")) } var map = can.onkeypop._mode[mode] @@ -987,6 +1007,11 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) }, t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) }, + ":": function(event, can, target) { + can.page.Select(can, document.body, "fieldset.panel.Footer input.cmd", function(target) { + target.focus() + }) + }, " ": function(event, can, target) { can.page.Select(can, document.body, "fieldset.panel.Header div.search input", function(target) { target.focus() @@ -994,6 +1019,12 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe }, enter: function(event, can, target) { can.misc.Log("enter") }, escape: function(event, can, target) { + can.page.Select(can, document.body, "fieldset.float", function(item) { + can.page.Remove(can, item) + }) + can.page.Select(can, document.body, "fieldset.auto", function(item) { + can.onmotion.hidden(can, item) + }) can.search(event, ["Search.onaction.hide"]) can.misc.Log("enter") }, @@ -1010,7 +1041,6 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe var his = target._history || [] his.push(target.value) - // can.misc.Log("input", target, his) target.setSelectionRange(0, -1) target._current = his.length target._history = his diff --git a/lib/core.js b/lib/core.js index a8d5d06c..0102387c 100644 --- a/lib/core.js +++ b/lib/core.js @@ -74,9 +74,8 @@ Volcanos("core", {help: "数据结构", } // 剩余字符 - begin > 0 && (s? push({type: "string", text: str.slice(begin), left: s, right: ""}) - : push(str.slice(begin))) - + // begin > 0 && (s? push({type: "string", text: str.slice(begin), left: s, right: ""}) + begin > 0 && (s? push({type: "string", text: str.slice(begin), left: s, right: ""}): push(str.slice(begin))) return res }), CallFunc: shy("调用器", function(func, args, mod) { args = args || {} @@ -89,7 +88,7 @@ Volcanos("core", {help: "数据结构", // 解析参数 var list = [], echo = false, cb = args["cb"] - this.List(func.toString().split(")")[0].split("(")[1].split(","), function(item, index) { item = item.trim() + this.List(func.toString().split(")")[0].split("(")[1].split(","), function(item, index) { item = item.trim(); if (item == "") { return } var arg = args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || cmds[index] || args[index] || null if (item == "cb") { echo = true } list.push(arg) diff --git a/lib/page.js b/lib/page.js index a17c1421..97a36ad1 100644 --- a/lib/page.js +++ b/lib/page.js @@ -1,4 +1,4 @@ -Volcanos("page", {help: "网页模块", ClassList: { +Volcanos("page", {help: "用户界面", ClassList: { has: function(can, obj, key) { var list = obj.className? obj.className.split(" "): [] return list.indexOf(key) > -1 }, @@ -15,7 +15,7 @@ Volcanos("page", {help: "网页模块", ClassList: { condition? this.add(can, obj, key): this.del(can, obj, key) }, neg: function(can, obj, key) { - this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key) + return (this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key)).indexOf > -1 }, }, Select: shy("选择节点", function(can, target, key, cb, interval, cbs) { if (key == ".") { return [] } diff --git a/page/index.css b/page/index.css index 39321b1d..63b6eeeb 100644 --- a/page/index.css +++ b/page/index.css @@ -111,6 +111,7 @@ input[name=text] { width:160px; } input[type=text] { + height:21px; font-size:16px; box-shadow: 4px 4px 10px 1px #626bd0; background-color:cyan; color:black; padding: 0 4px; @@ -295,7 +296,7 @@ div.carte div.item { div.carte div.item:hover { background:red; } -div.input { +body>div.input { position:fixed; background-color:#0d4142a6; z-index:50; @@ -303,7 +304,7 @@ div.input { div.input textarea { box-shadow: 4px 4px 10px 1px #626bd0; border:2px inset #14a58e; - width:145px; height:60px; + width:165px; height:60px; background-color: cyan; padding:4px; diff --git a/page/index.js b/page/index.js index f8bb9f79..8a69d007 100644 --- a/page/index.js +++ b/page/index.js @@ -107,6 +107,7 @@ Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js", ]}, "research": {name: "测试 research", index: [ "web.code.favor", "web.code.bench", "web.code.pprof", + "web.code.case", ]}, }}, "operate": {name: "运维群", storm: { diff --git a/panel/action.css b/panel/action.css index 97a7b20a..e5a269f8 100644 --- a/panel/action.css +++ b/panel/action.css @@ -25,7 +25,19 @@ fieldset.Action>div.action div.item.select { background-color:#2e515f; } -fieldset.Action div.output { +fieldset.Action div.output fieldset.plugin.fixed { + position:fixed; + left:0px; + top:0px; + margin:0px; + padding:0px; + background-color:black; + z-index:10; + height: -webkit-fill-available; + width: -webkit-fill-available; + overflow: auto; + background-color: #061c3cd9; + } fieldset.Action div.output.tabs { margin-top:28px; diff --git a/panel/action.js b/panel/action.js index c819543f..9336ef86 100644 --- a/panel/action.js +++ b/panel/action.js @@ -11,7 +11,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) }) }, function() { can.onaction.layout(can, can.user.Search(can, can._LAYOUT)||can.Conf(can._LAYOUT)) - !can.user.isMobile && can.onimport._menu(can) + !can.user.isMobile && can.onimport._menu(can, msg) }) can.onmotion.float.auto(can, can._output, "carte") @@ -38,7 +38,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) meta.id && (sub._option.dataset.id = meta.id) sub._target.Meta = meta }, - _menu: function(can) { + _menu: function(can, msg) { can._menu && can.page.Remove(can, can._menu) can._menu = can.search({}, ["Header.onimport.menu", can._ACTION, ["布局", "默认布局", "流动布局", "网格布局", "标签布局", "自由布局"], diff --git a/panel/footer.css b/panel/footer.css index 54d40aa3..bb946f84 100644 --- a/panel/footer.css +++ b/panel/footer.css @@ -6,6 +6,9 @@ fieldset.Footer div.toast { position:static; float:left; } +fieldset.Footer>div.output { + height:32px; overflow:hidden; +} fieldset.Footer>div.output>div { height:22px; padding:5px; cursor:pointer; @@ -25,3 +28,10 @@ fieldset.Footer>div.output div.state { float:right; } +fieldset.Footer>div.output input[name=cmd] { + background-color:black; color:white; + width:120px; height:25px; +} +fieldset.Footer>div.output input[name=cmd]:focus { + width:320px; +} diff --git a/panel/footer.js b/panel/footer.js index 2291b093..0138d8ce 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -2,49 +2,45 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onmotion.clear(can) can.onimport._title(can, msg, target) can.onimport._state(can, msg, target) + can.onimport._cli(can, msg, target) can.onimport._toast(can, msg, target) - - can.onmotion.float.auto(can, can._output, "carte", "input") can.base.isFunc(cb) && cb(msg) }, - _title: function(can, msg, target) { const TITLE = "title" + _title: function(can, msg, target) { const TITLE = chat.TITLE !can.user.isMobile && can.core.List(msg.result, function(item) { - can.page.Append(can, target, [{view: [TITLE, "div", item], title: "联系站长"}]) + can.page.Append(can, target, [{view: [TITLE, html.DIV, item], title: "联系站长"}]) }) }, _state: function(can, msg, target) { const STATE = "state" - can.core.List(can.base.Obj(msg.Option(STATE), can.Conf(STATE)||["ncmd"]), function(item) { + can.core.List(can.base.Obj(can.Conf(STATE)||msg.Option(STATE), ["ncmd"]), function(item) { can.page.Append(can, target, [{view: [STATE+" "+item, html.DIV, can.Conf(item)], list: [ {text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", html.SPAN, item]}, ], onclick: function(event) { - can.show = can.show? (can.page.Remove(can, can.show), null): can.onimport._cmd(can) + can.show = can.show? (can.page.Remove(can, can.show), null): can.onaction._cmd(can) }}]) }) }, - _cmd: function(can) { - return can.onappend.float(can, can._cmds, function(value, key, index, line, list) { - var commands = can.base.Obj(line.commands) - commands.length > 2 && can.onappend.plugin(can, {index: commands[2]}, function(sub) { - sub.run = function(event, cmds, cb) { - can.run(event, [ctx.ACTION, cli.RUN, commands[2]].concat(cmds), cb) - } - - can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { - can.page.Modify(can, sub._output, {style: {"max-width": width, "max-height": height-28}}) - can.page.Modify(can, sub._target, {style: {top: top+100, left: left}}) - can.page.Modify(can, sub._legend, {style: {display: "block"}}) - can.page.ClassList.add(can, sub._target, "float") - }) - - }, document.body) - - }).first - }, _toast: function(can, msg, target) { can.toast = can.page.Append(can, target, [{view: "toast", onclick: function(event) { can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first }}]).first }, + _cli: function(can, msg, target) { + can.page.Append(can, target, [{input: ["cmd", function(event) { + can.onkeypop.input(event, can); if (event.key != "Enter") { return } + switch (event.target.value) { + case "close": can.cli && can.cli.close(); break + case "clear": can.cli && can.cli.close(); break + default: + can.run(event, [cli.RUN].concat(can.core.Split(event.target.value+" ")), function(msg) { + can.cli && can.cli.close() + can.cli = can.onappend.float(can, msg, function(value, key, index, line, list) { + + }), can.page.Modify(can, can.cli.first, {style: {bottom: 32, top: ""}}) + }) + } + }]}]) + }, toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast || can.request() can.page.Modify(can, can.toast, [time.split(" ").pop(), title, content].join(" ")) @@ -63,6 +59,31 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) }, + + _cmd: function(can) { + return can.onappend.float(can, can._cmds, function(value, key, index, line, list) { + var commands = can.base.Obj(line.commands); switch (line.follow) { + case "chat.Action": commands = commands.slice(2); break + case "chat.Footer": commands = commands.slice(2); break + } + switch (commands[0]) { + case "web.wiki.word": commands = commands.slice(5); break + } + + can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { + can.onappend.plugin(can, {index: commands[0], args: commands.slice(1), width: width, height: height-100}, function(sub) { + sub.run = function(event, cmds, cb) { + can.run(event, [ctx.ACTION, cli.RUN, commands[0]].concat(cmds), cb) + } + + can.page.Modify(can, sub._output, {style: {"max-width": width}}) + can.page.Modify(can, sub._target, {style: {top: top+100, left: left}}) + can.page.Modify(can, sub._legend, {style: {display: "block"}}) + can.page.ClassList.add(can, sub._target, "float") + }, document.body) + }) + }).first + }, }) Volcanos("onexport", {help: "导出数据", list: [], height: function(can) { return can._target.offsetHeight }, diff --git a/panel/header.js b/panel/header.js index cfee1898..ce001e5a 100644 --- a/panel/header.js +++ b/panel/header.js @@ -1,5 +1,5 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.Conf(aaa.USERNAME, msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNAME)) + can.Conf(aaa.USERNAME, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNAME)) can.Conf(aaa.BACKGROUND, msg.Option(aaa.BACKGROUND)) can.Conf(aaa.AVATAR, msg.Option(aaa.AVATAR)) @@ -10,9 +10,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport._state(can, msg, target) can.onimport._search(can, msg, target) can.onimport._background(can, msg, target) - can.onimport._menu(can, msg, target) - - can.onmotion.float.auto(can, can._output, "carte", "input") + can.onimport._menus(can, msg, target) can.base.isFunc(cb) && cb(msg) }, _agent: function(can, msg, target) { @@ -35,7 +33,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.user.Search(can, chat.GRANT, "") } }, - _title: function(can, msg, target) { const TITLE = "title" + _title: function(can, msg, target) { const TITLE = chat.TITLE can.user.title(can.user.Search(can, TITLE)||can.user.Search(can, cli.POD)) !can.user.isMobile && can.core.List(msg.result||["github.com/shylinux/contexts"], function(item) { can.page.Append(can, target, [{view: [TITLE, html.DIV, item], title: "返回主页", onclick: function(event) { @@ -44,7 +42,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, _state: function(can, msg, target) { const STATE = "state" - can.core.List(can.base.Obj(msg.Option(STATE), can.Conf(STATE)||["time", aaa.USERNAME]), function(item) { + can.core.List(can.base.Obj(can.Conf(STATE)||msg.Option(STATE), [kit.MDB_TIME, aaa.USERNAME]), function(item) { if (item == aaa.AVATAR) { can.page.Append(can, target, [{view: [STATE+" "+item], list: [{img: can.Conf(item)}], onmouseenter: function(event) { can.onaction.carte(event, can, [can.page.Format(html.IMG, can.Conf(item), 160)]) @@ -55,7 +53,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Append(can, target, [{view: [STATE+" "+item, html.DIV, (can.Conf(item)||"").slice(0, 10)], onmouseenter: function(event) { can.core.CallFunc([can.onaction, item], [event, can, item]) }, _init: function(target) { - item == "time" && can.onimport._time(can, target) + item == kit.MDB_TIME && can.onimport._time(can, target) }}]) }) }, @@ -69,15 +67,17 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, // can.onmotion.autosize(can, ui.input, 240, 120) }, _background: function(can, msg) { - if (can.user.isExtension) { return } if (can.user.isLocalFile) { return } + if (can.user.isExtension) { return } can.onlayout.background(can, msg.Option(aaa.BACKGROUND), document.body) }, - _menu: function(can, msg, target) { - can.onimport.menu(can, can.user.isMobile||can.user.isExtension||can.user.Search(can, cli.POD)? [chat.HEADER, chat.RIVER]: - [chat.HEADER, ["setting", "black", "white", "print", "pack"]], function(event, item) { - can.core.CallFunc([can.onaction, item], [event, can, item]) - }) + _menus: function(can, msg, target) { + var menus = can.base.Obj(can.Conf(chat.MENUS)||msg.Option(chat.MENUS), [chat.HEADER, ["setting", "black", "white", "print"]]) + can.onimport.menu(can, can.user.isMobile||can.user.isExtension||can.user.Search(can, cli.POD)? [chat.HEADER, chat.RIVER]: menus, function(event, item) { + can.core.CallFunc(can.onaction[item]||function(event, can) { + can.run(event, [item], function(msg) { can.user.toast(can, "执行成功", can.user.trans(can, item)) }) + }, {event: event, can: can, button: item}) + }) }, _weixin: function(can, msg) { can.run({}, [ctx.ACTION, chat.AGENT], function(msg) { @@ -152,9 +152,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, list, cb, target) { can.base.isFunc(cb) && cb() }, - _const: [ - "title", - ], _trans: { "river": "菜单", "search": "搜索", @@ -163,24 +160,20 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, "black": "黑色主题", "white": "白色主题", "print": "打印主题", - "clear": "清除背景", - "pack": "打包页面", "shareuser": "共享用户", - "usernick": "修改昵称", - "logout": "退出登录", + "clear": "清除背景", }, onmain: function(can, msg) { function init() { can.run({}, [], function(msg) { - can.onimport._init(can, msg, [], function(msg) { - can.onengine.signal(can, "onlogin", msg) - }, can._output) + can.base.Copy(can.onaction._trans, can.base.Obj(msg.Option(chat.TRANS), {})) + can.onimport._init(can, msg, [], function(msg) { can.onengine.signal(can, "onlogin", msg) }, can._output) can.search({}, ["River.onmotion.toggle"]) }) }; can.search({}, ["River.onmotion.hidden"]) // 登录检查 - can.user.isLocalFile? init(): can.run({}, ["check"], function(msg) { + can.user.isLocalFile? init(): can.run({}, [chat.CHECK], function(msg) { can.Conf(aaa.USERNAME, msg.Option(ice.MSG_USERNAME))? init(): msg.Option("sso")? can.user.jumps(msg.Option("sso")): can.user.login(can, init) }) @@ -190,7 +183,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, }, title: function(event, can) { - var args = {}; can.core.List([chat.TITLE, "topic", "layout"], function(key) { + var args = {}; can.core.List([chat.TITLE, chat.TOPIC, "layout"], function(key) { var value = can.user.Search(can, key); value && (args[key] = value) }) can.user.jumps(can.user.MergeURL(can, args, true)) @@ -211,7 +204,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, can.set("River", "height", -1) can.set("Action", "height", -1) }, - pack: function(event, can) { + webpack: function(event, can) { can.user.input(event, can, [ {name: "name", value: can.user.title()}, ], function(ev, button, meta, list) { diff --git a/panel/river.js b/panel/river.js index a24bfe37..92b911e7 100644 --- a/panel/river.js +++ b/panel/river.js @@ -8,8 +8,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, (index == 0 || item.hash == can._main_river) && (select = target) }) })), select && select.click() - - can.onmotion.float.auto(can, target, "carte", "input") }, _main: function(can, msg) { can._main_river = "project", can._main_storm = "studio" @@ -22,11 +20,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can._main_storm = can.user.Search(can, chat.STORM) || msg.Option(ice.MSG_STORM) || Volcanos.meta.args.storm || can._main_storm }, _menu: function(can, msg) { - can.search({}, ["Header.onimport.menu", chat.RIVER, - ["添加", "创建群组", "添加应用", "添加工具", "添加用户", "添加设备", "创建空间"], - !can.user.isMobile && ["访问", "内部系统", "访问应用", "访问工具", "访问用户", "访问设备", "工作任务"], - ["共享", "共享群组", "共享应用", "共享工具", "共享主机"], - ], function(event, item) { + can.user.Search(can, cli.POD) || can.search({}, ["Header.onimport.menu"].concat(can.base.Obj(msg.Option(chat.MENUS), can.ondetail.menus)), function(event, item) { can.core.CallFunc([can.ondetail, item], [event, can, item, can.Conf(chat.RIVER), can.Conf(chat.STORM)]) }) }, @@ -35,8 +29,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onaction.storm(event, can, meta.hash) }, onmouseenter: function(event) { - if (can.user.isMobile) { return } - can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) { + !can.user.isMobile && can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) { module[button](event, can, button, meta.hash) }) }, _init: function(target) { cb(target) @@ -49,8 +42,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.user.title(can._main_title || meta.name) }, onmouseenter: function(event) { - if (can.user.isMobile) { return } - can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) { + !can.user.isMobile && can.onaction.carte(event, can, can.ondetail.sublist, function(event, button, module) { module[button](event, can, button, river, meta.hash) }) }, _init: function(target) { @@ -139,6 +131,12 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, }, }) Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户", "添加应用", "添加设备", "重命名群组", "删除群组"], + sublist: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], + menus: [chat.RIVER, + ["添加", "创建群组", "添加应用", "添加工具", "添加用户", "添加设备", "创建空间"], + ["共享", "共享群组", "共享应用", "共享工具", "共享主机"], + ], + "创建群组": function(event, can) { can.onaction.create(event, can) }, "共享群组": function(event, can, button, river) { @@ -155,13 +153,6 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 }) }) }, - "添加设备": function(event, can, button, river) { - can.user.select(event, can, web.SPACE, "type,name,text", function(item, next) { - can.run({}, [river, chat.NODE, ctx.ACTION, mdb.INSERT, kit.MDB_TYPE, item[0], kit.MDB_NAME, item[1]], function(msg) { - next() - }) - }) - }, "添加应用": function(event, can, button, river) { can.user.trans(can, {"public": "公开应用", "protected": "群组应用", "private": "个人应用"}) can.user.input(event, can, [ @@ -173,6 +164,13 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 }) }) }, + "添加设备": function(event, can, button, river) { + can.user.select(event, can, web.SPACE, "type,name,text", function(item, next) { + can.run({}, [river, chat.NODE, ctx.ACTION, mdb.INSERT, kit.MDB_TYPE, item[0], kit.MDB_NAME, item[1]], function(msg) { + next() + }) + }) + }, "重命名群组": function(event, can, button, river) { can.user.input(event, can, [kit.MDB_NAME], function(event, button, meta, list) { var msg = can.request(event, {hash: river}) @@ -257,7 +255,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "共享主机": function(event, can, button, river, storm) { can.run(event, [ctx.ACTION, aaa.INVITE], function(msg) { can.user.toast(can, { - title: "共享主机", duration: -1, width: -100, + title: "共享主机", duration: -1, width: -300, content: msg.Result(), action: [cli.CLOSE], }) }) @@ -281,8 +279,8 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 {name: "template", value: "@key"}, ], function(event, button, data, list, args) { can.run(event, [ctx.ACTION, cli.START].concat(args), function(msg) { - can.user.open(can.user.MergeURL(can, {pod: can.core.Keys(can.user.Search(can, cli.POD), msg.Option(kit.MDB_NAME))})) - can.user.toast(can, can.user.MergeURL(can, {pod: msg.Option(kit.MDB_NAME)})) + var link = can.user.MergeURL(can, {_path: "/chat/pod/"+can.core.Keys(can.user.Search(can, cli.POD), msg.Option(kit.MDB_NAME))}) + can.user.toast(can, link), can.user.open(link) }) }) }, diff --git a/panel/search.js b/panel/search.js index 7fc3493d..a45e73a9 100644 --- a/panel/search.js +++ b/panel/search.js @@ -11,6 +11,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _word: function(can, msg, cmds, fields) { can.type = cmds[0] var res = can.request({}, {word: cmds, fields: fields.join(","), sort: msg.Option("sort"), index: msg.Option("index")}) + if (cmds[1] == "clear") { can.onaction["清空"]({}, can); return } can.onengine.signal(can, "onsearch", res) can.run(res._event, cmds, function(res) { can.list = res.Table() diff --git a/plugin/input.js b/plugin/input.js index d13c39a9..c7b3daa0 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -10,7 +10,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, }, "执行": function(event, can) { - var title = can.sup._name+" "+can.sup.Pack([], true) + var title = can.sup._name+" "+can.sup.Input([], true) var toast = can.user.toast(can, "执行中...", title, -1) can.run(event, [], function() { toast.close(), can.user.toast(can, "执行成功...", title) }) }, @@ -25,7 +25,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1) } }, onclick: function(event, can) { - if (can.Conf("type") == "button") { can.run(event, [ctx.ACTION, can.Conf("name")].concat(can.sup.Pack())) } + if (can.Conf("type") == "button") { can.run(event, [ctx.ACTION, can.Conf("name")].concat(can.sup.Input())) } }, onkeydown: function(event, can) { var target = event.target diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 8d1e96ab..ae61ede1 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -297,7 +297,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" can.onaction.rerankLine(can) }, }) -Volcanos("onaction", {help: "控件交互", list: ["项目"], +Volcanos("onaction", {help: "控件交互", list: ["项目", "autogen"], save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)}) can.run(event, [ctx.ACTION, "save", can.parse, can.Option("file"), can.Option("path")], function(msg) { can.user.toast(can, "保存成功") diff --git a/plugin/state.js b/plugin/state.js index b78381fa..5f9e77d2 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -11,13 +11,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, location.href = msg._arg[0] }, _rewrite: function(can, msg) { can.Option(msg._arg[0], msg._arg[1]) - can.onappend._output(can, can.Conf(), {}, can.Pack()) + can.Update() return true }, _refresh: function(can, msg) { can.core.Timer(parseInt(msg.Option("_delay")||"500"), function() { var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1}) - can.onappend._output(can, can.Conf(), sub._event, can.Pack()) + can.Update() }) return true }, @@ -52,10 +52,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, if (his[0] == ctx.ACTION) { continue } can.page.Select(can, can._option, "textarea.args,input.args,select.args", function(item, index) { item.value = his[index]||"" - }), can.onappend._output(can, can.Conf(), {}, can.Pack()) + }), can.Update() break } - !his && can.onappend._output(can, can.Conf(), {}, can.Pack()) + !his && can.Update() return true }, @@ -77,11 +77,23 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, }, }) Volcanos("onaction", {help: "交互操作", list: [ - "共享工具", "保存参数", "清空参数", "刷新数据", ["其它 ->", "生成链接", "复制数据", "下载数据", "清空数据", "删除工具", "摄像头"], + "共享工具", "保存参数", "清空参数", "刷新数据", ["其它 ->", "全屏", "生成链接", "复制数据", "下载数据", "清空数据", "删除工具", "摄像头"], ], _init: function(can, msg, list, cb, target) { }, _engine: function(event, can, button) { - can.onappend._output(can, can.Conf(), event, [ctx.ACTION, button].concat(can.Pack([], true))) + can.Update(event, [ctx.ACTION, button].concat(can.Input([], true))) + }, + "共享工具": function(event, can) { var meta = can.Conf() + var ui = can.user.input(event, can, [{name: "name", value: meta.name}], function(event, button, data, list, args) { + var msg = can.request(event, {arg: [ + kit.MDB_TYPE, "field", + kit.MDB_NAME, list[0], kit.MDB_TEXT, JSON.stringify(can.Input([], true)), + // "river", meta.ctx||meta.key||"", "storm", meta.index||meta.cmd||meta.name, + "storm", meta.index, + ]}) + can.search(event, ["Header.onaction.share"]) + }) + can.onlayout.figure(event, can, ui._target, true) }, "保存参数": function(event, can) { var meta = can.Conf() var msg = can.request(event, {river: can.Conf("river"), storm: can.Conf("storm"), id: meta.id}) @@ -92,30 +104,21 @@ Volcanos("onaction", {help: "交互操作", list: [ "清空参数": function(event, can) { can.page.Select(can, can._option, '.args', function(item) { return item.value = "" }) }, - "共享工具": function(event, can) { var meta = can.Conf() - var ui = can.user.input(event, can, [{name: "name", value: meta.name}], function(event, button, data, list, args) { - var msg = can.request(event, {arg: [ - kit.MDB_TYPE, "field", - kit.MDB_NAME, list[0], kit.MDB_TEXT, JSON.stringify(can.Pack([], true)), - // "river", meta.ctx||meta.key||"", "storm", meta.index||meta.cmd||meta.name, - "storm", meta.index, - ]}) - can.search(event, ["Header.onaction.share"]) - }) - can.onlayout.figure(event, can, ui._target, true) + "刷新数据": function(event, can) { + can.Update({}, can.Input([], true)) }, + "全屏": function(event, can) { + if (can.page.ClassList.neg(can, can._target, "fixed")) { + + } + }, + "生成链接": function(event, can) { var meta = can.Conf() var args = can.Option(); args._path = "/chat/cmd/"+(meta.index||can.core.Keys(meta.ctx, meta.cmd)) args._path == "/chat/cmd/web.wiki.word" && (args = {_path: "/chat/cmd/"+args.path}) var msg = can.request(event, {link: can.user.MergeURL(can, args)}) can.search(event, ["Header.onaction.share"]) }, - "删除工具": function(event, can) { - can.page.Remove(can, can._target) - }, - "刷新数据": function(event, can) { var meta = can.Conf() - can.onappend._output(can, meta, {}, can.Pack([], true)) - }, "复制数据": function(event, can) { var meta = can.Conf(), msg = can._msg var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) { res.push(can.core.Item(line, function(key, value) { return value }).join(",")) @@ -135,6 +138,9 @@ Volcanos("onaction", {help: "交互操作", list: [ "清空数据": function(event, can) { can.onmotion.clear(can, can._output) }, + "删除工具": function(event, can) { + can.page.Remove(can, can._target) + }, "摄像头": function(event, can) { var constraints = {audio: false, video: {width: 200, height: 200}} var ui = can.page.Append(can, can._output, [{view: ctx.ACTION}, {view: "capture", list: [{type: "video", _init: function(item) { @@ -164,7 +170,7 @@ Volcanos("onaction", {help: "交互操作", list: [ change: function(event, can, name, value, cb) { return can.page.Select(can, can._option, "input.args", function(input) { if (input.name == name && value != input.value) { input.value = value - var data = input.dataset || {}; data.action == "auto" && can.onappend._output(can, can.Conf(), event, can.Pack(), cb) + var data = input.dataset || {}; data.action == "auto" && can.Update(event, can.Input(), cb) return input } }) @@ -215,8 +221,8 @@ Volcanos("onaction", {help: "交互操作", list: [ openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) }, "参数": function(event, can) { can.onmotion.Toggle(can, can._action) }, - "关闭": function(event, can) { can.page.Remove(can, can._target) }, "清空": function(event, can, name) { can.onmotion.clear(can, can._output) }, + "关闭": function(event, can) { can.page.Remove(can, can._target) }, }) Volcanos("onexport", {help: "导出数据", list: []}) var _can_name = "" diff --git a/proto.js b/proto.js index f633d226..05f4c89d 100644 --- a/proto.js +++ b/proto.js @@ -86,15 +86,10 @@ const wiki = { SHELL: "shell", } const chat = { - TITLE: "title", RIVER: "river", STORM: "storm", FIELD: "field", - AGENT: "agent", - SHARE: "share", - GRANT: "grant", - PUBLIC: "public", PROTECTED: "protected", PRIVATE: "private", @@ -102,7 +97,16 @@ const chat = { USER: "user", TOOL: "tool", NODE: "node", + HEADER: "header", + TOPIC: "topic", + TITLE: "title", + MENUS: "menus", + TRANS: "trans", + AGENT: "agent", + CHECK: "check", + SHARE: "share", + GRANT: "grant", } const team = { TASK: "task", @@ -166,7 +170,7 @@ var Volcanos = shy("火山架", {volcano: "/frame.js", args: {}, pack: {}, libs: } } - var proto = {_name: name, _load: function(name, cb) { // 加载缓存 + var proto = {__proto__: meta, _name: name, _load: function(name, cb) { // 加载缓存 var cache = meta.cache[name] || []; for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub) }; meta.cache[name] = cache