diff --git a/frame.js b/frame.js index 7dfe3c7a..643b5e2e 100644 --- a/frame.js +++ b/frame.js @@ -68,7 +68,7 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) { var action = storm && storm.action && storm.action[cmds[2]] if (!storm) { break } if (cmds.length == 2) { if (storm.index) { - can.misc.Run(event, can, {names: pane._name}, [river.name, storm.name, "index"].concat(storm.index), cb) + can.misc.Run(event, can, {names: pane._name}, [river.name, storm.name, "order"].concat(storm.index), cb) return true } @@ -149,6 +149,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met if (can.user.Search(can, "share") && can.user.Search(can, "river") && can.user.Search(can, "storm")) { can.page.Select(can, field, "legend", function(item) { can.page.Remove(can, item) }) } + sub.onaction && can.onappend._action(sub, sub._action, sub.onaction.list) meta.detail = meta.feature["detail"] || {} sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field); @@ -260,14 +261,16 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met }, _action: function(can, action, list) { // [string [class item...] {}] action && (action.innerHTML = ""), can.onaction && can.core.List(list||can.onaction.list, function(item) { - item === ""? can.page.Append(can, action, [{view: "item space"}]): - typeof item == "string"? can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) { + item === ""? /*空白*/ can.page.Append(can, action, [{view: "item space"}]): + typeof item == "string"? /*按键*/ can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) { var cb = can.onaction[item] || can.onkeymap && can.onkeymap._remote cb? cb(event, can, item): can.run(event, ["action", item], function(msg) {}, true) - }}): item.length > 0? can.onappend.input(can, action, "input", {type: "select", values: item.slice(1), name: item[0], onchange: function(event) { + }}): item.length > 0? /*列表*/ can.onappend.input(can, action, "input", {type: "select", values: item.slice(1), name: item[0], onchange: function(event) { var cb = can.onaction[item[0]] cb && cb(event, can, item[0], item[event.target.selectedIndex+1]) - }}): typeof item == "object" && can.page.Append(can, action, [item]) + }}): item.input? /*文本*/ can.page.Append(can, action, [{view: "item", list: [{type: "input", name: item.input[0], onkeydown: function(event) { + item.input[1](event, can) + }}] }]): typeof item == "object" && /*其它*/ can.page.Append(can, action, [item]) }) }, _detail: function(can, msg, list, target) { @@ -481,8 +484,8 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met } return ui }, - share: function(can, msg, name, text) { - can.run(msg._event, ["action", "share"], function(msg) { + share: function(can, msg, cmd) { + can.run(msg._event, cmd||["action", "share"], function(msg) { var src = can.user.Share(can, {_path: "/share/"+msg.Result()}, true); var ui = can.onappend.toast(can, {title: can.page.Format("a", src, msg.Result()), text: can.page.Format("img", src+"/share"), width: 300, height: 300, duration: 100000, button: [{button: ["确定", function(event) { diff --git a/index.js b/index.js index 4f66cb16..4355bb19 100644 --- a/index.js +++ b/index.js @@ -1,14 +1,11 @@ Volcanos({name: "demo", volcano: "/frame.js", iceberg: "/chat/", intshell: "plug.sh", libs: ["/lib/base", "/lib/core", "/lib/misc", "/lib/page", "/lib/user"], panes: [ - {type: "pane", name: "Header", help: "标题栏", pos: "head", list: ["/pane/Header.js", "/pane/Header.css"], state: [ - "time", "username", - ]}, - {type: "pane", name: "River", help: "群聊组", pos: "left", list: ["/pane/River.js", "/pane/River.css"]}, - {type: "pane", name: "Storm", help: "应用流", pos: "right", list: ["/pane/Storm.js", "/pane/Storm.css"]}, - {type: "pane", name: "Action", help: "工作台", pos: "middle", list: ["/pane/Action.js", "/pane/Action.css"]}, - {type: "pane", name: "Footer", help: "状态条", pos: "foot", list: ["/pane/Footer.js", "/pane/Footer.css"], state: [ - "ncmd", - ]}, + {name: "Header", help: "标题栏", pos: "head", state: ["time", "username"]}, + {name: "River", help: "群聊组", pos: "left"}, + {name: "Storm", help: "应用流", pos: "right"}, + {name: "Action", help: "工作台", pos: "middle"}, + {name: "Search", help: "搜索框", pos: "float"}, + {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd" ]}, ], main: {name: "Header", engine: "remote", list: ["/publish/order.js"]}, plugin: [ "/plugin/state.js", "/plugin/table.js", diff --git a/pane/Action.js b/pane/Action.js index 008f3453..366bc913 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -6,20 +6,13 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, }, }) Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"], - "共享": function(event, can, value, sub) { - console.log(sub.Option()) - var msg = sub.request(event) - msg.Option("_pod", can.user.Search(can, "pod")) - msg.Option("_name", value.name) - msg.Option("_text", value.help) - msg.Option("_node", value.pod) - msg.Option("_group", value.group) - msg.Option("_index", value.index) - msg.Option("_args", JSON.stringify(can.core.Item(sub.Option(), function(key, value) { return value }))) - msg.Option("_value", JSON.stringify(sub.Option())) - msg.Option("storm", can.Conf("storm")) - msg.Option("river", can.Conf("river")) - can.onappend.share(can, msg) + "共享": function(event, can, value, sub) { var msg = sub.request(event) + var list = [can.Conf("river"), can.Conf("storm"), "share", value.name, value.help] + list = list.concat([ + value.pod||"", value.group||"", value.index, JSON.stringify(can.core.Item(sub.Option(), function(key, value) { return value })), + JSON.stringify(sub.Option()) + ]) + can.onappend.share(can, msg, list) }, }) Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "action"; diff --git a/pane/Footer.js b/pane/Footer.js index fb77b0d1..4e60abce 100644 --- a/pane/Footer.js +++ b/pane/Footer.js @@ -1,8 +1,7 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, meta, list, cb, target) { }, +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { + }, }) -Volcanos("onaction", {help: "交互数据", list: [], - _init: function(can, msg, list, cb, target) { +Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { can.onexport._init(can, msg, list, cb, target) }, ncmd: function(can, msg, list, cb, target) { @@ -11,9 +10,8 @@ Volcanos("onaction", {help: "交互数据", list: [], }) }, }) -Volcanos("onexport", {help: "导出数据", list: [], - _init: function(can, msg, list, cb, target) { - can.run({}, [], function(msg) { can._output.innerHTML = ""; +Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { + can.run({}, [], function(msg) { can._output.innerHTML = "" can.core.List(msg.result, function(title) { can.page.Append(can, can._output, [{view: ["title", "div", title]}]) }) diff --git a/pane/Header.css b/pane/Header.css index 6bd5933e..ffc833cd 100644 --- a/pane/Header.css +++ b/pane/Header.css @@ -14,6 +14,17 @@ fieldset.Header>div.output>div.title:hover { background-color:red; border:ridge 2px yellow; } +fieldset.Header>div.output>div.search { + margin-left:20px; + float:left; +} +fieldset.Header>div.output>div.search>input { + width:120px; +} +fieldset.Header>div.output>div.search>input:focus { + width:240px; +} + fieldset.Header>div.output>div.state { cursor:pointer; diff --git a/pane/Header.js b/pane/Header.js index d1d3c36d..13a313c9 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -4,29 +4,25 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { function init() { can.onexport._init(can, msg, list, function() { - can.user.title(can.user.Search(can, "pod")); - can.run(msg._event, ["search", "River.onaction._init"]); - can.run(msg._event, ["search", "Footer.onaction._init"]); + can.user.title(can.user.Search(can, "pod")) + can.run(msg._event, ["search", "River.onaction._init"]) + can.run(msg._event, ["search", "Footer.onaction._init"]) }, target) } - can.run({}, ["check"], function(msg) { - if (msg.Result()) { return init() } - + can.run({}, ["check"], function(msg) { if (msg.Result()) { return init() } var ui = can.user.input({}, can, [ {username: "username", name: "用户"}, {password: "password", name: "密码"}, {button: [["登录", function(event) { - var username = ui["用户"].value - var password = ui["密码"].value - can.run({}, ["login", username, password], function(msg) { - if (msg.Result()) { - can.page.Remove(can, ui.first) - return init() - } + can.run({}, ["login", ui["用户"].value, ui["密码"].value], function(msg) { + if (msg.Result()) { can.page.Remove(can, ui.first); return init() } can.user.alert("用户或密码错误") }) - }], "扫码"]}, + }], ["扫码", function(event) { + // TODO + }]]}, ], function(event, button, data, list) { + // TODO }) }) }, @@ -45,7 +41,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }, }) Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { - can.run(msg._event, [], function(msg) { can._output.innerHTML = ""; + can.run(msg._event, [], function(msg) { can._output.innerHTML = "" can.Conf("username", msg.Option("user.nick")||msg.Option("user.name")) can.core.List(msg.result||["github.com/shylinux/contexts"], function(title) { @@ -53,6 +49,7 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, click: function(event) { can.onaction["title"](event, can, "title") }, }]) }) + can.core.List(can.Conf("state")||["time", "username"], function(item) { can.page.Append(can, can._output, [{view: ["state "+item, "div", can.Conf(item)], click: function(event) { can.onaction[item](event, can, item) }, @@ -63,6 +60,24 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, can.onexport.time(event, can, "time", item) }) }) + + var search = can.page.Append(can, can._output, [{view: "search", list: [{type: "input", + onfocus: function(event) { + + }, + onkeydown: function(event) { + switch (event.key) { + case "Enter": + can.run(event, ["search", "Search.onimport.input", event.target.value], function() { + + }) + } + }, + }]}]).input + document.body.onkeydown = function(event) { + event.key == "Space" && search.focus() + } + typeof cb == "function" && cb() }) }, diff --git a/pane/River.js b/pane/River.js index 9905905b..f81d375f 100644 --- a/pane/River.js +++ b/pane/River.js @@ -18,20 +18,18 @@ Volcanos("ondetail", {help: "菜单交互", list: ["添加用户", "重命名", console.log(river, button) }, }) -Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "river"; +Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "river" can.run({}, [], function(sup) { can._output.innerHTML = ""; var select; sup.Table(function(value, index, array) { - var view = can.onappend.item(can, can._output, "item", value, function(event, item) { var msg = can.request(event, {_msg: sup}); + var view = can.onappend.item(can, can._output, "item", value, function(event, item) { var msg = can.request(event, {_msg: sup}) // 左键点击 - msg.Option(key, can.Conf(key, value.key)), can.run(event, ["search", "Storm.onaction._init"]); + msg.Option(key, can.Conf(key, value.key)), can.run(event, ["search", "Storm.onaction._init"]) }, function(event) { // 右键点击 can.onappend.menu(can, msg, value) - }); + }) - if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { - select = view - } - }); select && select.click(); typeof cb == "function" && cb(sup); }) + if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { select = view } + }); select && select.click(), typeof cb == "function" && cb(sup) }) }, key: function(can, msg) { msg.Option("river", can.Conf("river")) }, }) diff --git a/pane/Search.css b/pane/Search.css new file mode 100644 index 00000000..e0b76fd0 --- /dev/null +++ b/pane/Search.css @@ -0,0 +1,22 @@ +fieldset.Search { + display:none; + position:absolute; + left:120px; + top:40px; + background:black; +} +fieldset.Search div.output div.content { + max-height:400px; + max-width:1000px; + overflow:auto; +} +fieldset.Search div.output div.display { + position:sticky; + max-height:200px; + max-width:1000px; + overflow:auto; +} +fieldset.Search div.output div.display:hover { + max-height:400px; +} + diff --git a/pane/Search.js b/pane/Search.js new file mode 100644 index 00000000..f82dfb0a --- /dev/null +++ b/pane/Search.js @@ -0,0 +1,40 @@ +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb) { + typeof cb == "function" && cb() + }, + + input: function(can, msg, cmd, cb) { can._output.innerHTML = "" + can.ui = can.page.Append(can, can._output, [{view: "content"}, {view: "display"}]) + can.page.Modify(can, can._target, {style: {display: "block"}}) + + can.page.Select(can, can._action, "input[name=word]", function(item) { item.value = cmd[0] }) + can.run({}, cmd, function(msg) { + can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) { + return {text: [value, "td"], onclick: function(event) { + can.run(event, [line.type, line.name, line.text], function(msg) { + can.ui.display.innerHTML = "" + can.onappend.table(can, can.ui.display, "table", msg) + can.onappend.board(can, can.ui.display, "board", msg) + }) + }} + ca.run(event, [""]) + }) + can.onappend.board(can, can.ui.content, "board", msg) + }) + }, +}) +Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "下载", "渲染", "执行", "收藏", "搜索"], _init: function(can, msg, list, cb, target) { + can.onexport._init(can, msg, list, cb, target) + }, + "关闭": function(event, can, key) { + can.page.Modify(can, can._target, {style: {display: "none"}}) + }, +}) +Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"], + "共享": function(event, can, value, sub) { var msg = sub.request(event) + }, +}) +Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { + }, +}) + + diff --git a/pane/Storm.js b/pane/Storm.js index dcb8082b..e5fa8d54 100644 --- a/pane/Storm.js +++ b/pane/Storm.js @@ -1,8 +1,7 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, meta, list, cb, target) { }, +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { + }, }) -Volcanos("onaction", {help: "交互操作", list: [], - _init: function(can, msg, list, cb, target) { +Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { can.onexport._init(can, msg, list, cb, target) }, }) @@ -15,29 +14,25 @@ Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"] can.onappend.share(can, msg) }, }) -Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "storm"; - can.Cache(can.Conf("river"), can._output, can.Conf(key)); - var river = can.Conf("river", msg.Option("river")); +Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "storm" + can.Cache(can.Conf("river"), can._output, can.Conf(key)) + var river = can.Conf("river", msg.Option("river")) if (msg.Option(key, can.Conf(key, can.Cache(river, can._output)||""))) { - return can.run(msg._event, ["search", "Action.onaction._init"]); + return can.run(msg._event, ["search", "Action.onaction._init"]) } can.run(msg._event, [river], function(sup) { can._output.innerHTML = ""; var select; sup.Table(function(value, index, array) { - var view = can.onappend.item(can, can._output, "item", value, function(event, item) { var msg = can.request(event, {_msg: sup}); + var view = can.onappend.item(can, can._output, "item", value, function(event, item) { var msg = can.request(event, {_msg: sup}) // 左键点击 msg.Option("river", river) - msg.Option(key, can.Conf(key, value.key)), can.run(event, ["search", "Action.onaction._init"]); + msg.Option(key, can.Conf(key, value.key)), can.run(event, ["search", "Action.onaction._init"]) }, function(event, item) { // 右键点击 - can.onappend.carte(can, can.ondetail, can.ondetail.list, function(event, item, meta) { - meta[item] && meta[item](event, can, value) - }) - }); + can.onappend.menu(can, msg, value) + }) - if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { - select = view - } - }); select && select.click(); }) + if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { select = view } + }); select && select.click() }) }, key: function(can, msg) { msg.Option("storm", can.Conf("storm")) }, }) diff --git a/proto.js b/proto.js index 18c7c41b..0cb00534 100644 --- a/proto.js +++ b/proto.js @@ -19,7 +19,8 @@ var Volcanos = shy("火山架", {cache: {}, index: 1, order: 1, debug: { if (typeof name == "object") { var Config = name; meta.volcano = Config.volcano, meta.libs = Config.libs; var Preload = Config.libs; Config.panes.forEach(function(pane) { - Preload = Preload.concat(pane.list); + pane.list = pane.list || ["/pane/"+pane.name+".css", "/pane/"+pane.name+".js"] + Preload = Preload.concat(pane.list) }); Preload = Preload.concat(Config.plugin) name = Config.name, can = { _target: document.body, _follow: Config.name,