From 9fa4537eb361ddb232f02a1328856dd94e87de5e Mon Sep 17 00:00:00 2001 From: harveyshao Date: Thu, 28 Oct 2021 18:49:59 +0800 Subject: [PATCH] opt chat --- frame.js | 14 ++- lib/base.js | 9 ++ lib/misc.js | 4 +- lib/user.js | 16 +-- page/index.css | 25 +++-- page/index.js | 2 +- panel/action.css | 2 - panel/action.js | 13 +-- panel/cmd.css | 16 +-- panel/cmd.js | 6 +- panel/footer.css | 13 ++- panel/footer.js | 40 ++++---- panel/header.css | 20 ++-- panel/header.js | 132 ++++++++----------------- panel/river.js | 27 +++-- panel/search.css | 3 +- panel/search.js | 30 +++--- plugin/local/chat/div.js | 21 ++-- plugin/local/chat/scan.js | 0 plugin/local/chat/wx.js | 32 ++++++ plugin/local/code/inner.js | 4 + plugin/local/wiki/word.css | 2 +- plugin/state.js | 50 ++++------ plugin/story/spide.css | 1 - proto.js | 4 +- publish/client/mp/pages/river/river.js | 6 +- 26 files changed, 235 insertions(+), 257 deletions(-) create mode 100644 plugin/local/chat/scan.js create mode 100644 plugin/local/chat/wx.js diff --git a/frame.js b/frame.js index 5d9e5055..32bbdc69 100644 --- a/frame.js +++ b/frame.js @@ -41,7 +41,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, _engine: function(event, can, msg, panel, cmds, cb) { return false }, _remote: function(event, can, msg, panel, cmds, cb) { if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return } - can.search({follow: panel._follow, msg: msg, cmds: cmds}, ["Footer.onimport.ncmd"]) + can.onengine.signal(can, "onremote", can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) var key = can.core.Keys(panel._name, cmds.join(",")) if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear(ice.MSG_APPEND) @@ -193,7 +193,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: can._output, _fields: can._target, _option: can._option, _action: can._action, _output: can._output, _status: can._status, - Option: can.Option, Action: can.Action, Status: can.Status, + Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, }, [display], function(table) { table.Conf(can.Conf()) table.run = function(event, cmds, cb, silent) { var msg = can.request(event) if (msg.RunAction(event, table, cmds)) { return } @@ -250,7 +250,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, {view: [html.OPTION, html.FORM]}, {view: [html.ACTION]}, {view: [html.OUTPUT]}, {view: [html.STATUS]}, ]}]) }, - input: function(can, item, value, target) { + input: function(can, item, value, target, style) { switch (item.type) { case "": return can.page.Append(can, target, [item]) case html.SPACE: return can.page.Append(can, target, [{view: can.base.join([html.ITEM, html.SPACE])}]) @@ -259,7 +259,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var input = can.page.input(can, item, value) var br = input.type == html.TEXTAREA? [{type: html.BR}]: [] var title = can.Conf(["feature", chat.TITLE, item.name].join(ice.PT))||""; title && (input.title = title) - return can.page.Append(can, target, ([{view: [can.base.join([html.ITEM, item.type])], list: [input]}]).concat(br))[item.name] + return can.page.Append(can, target, ([{view: style||can.base.join([html.ITEM, item.type]), list: [input]}]).concat(br))[item.name] }, table: function(can, msg, cb, target, sort) { var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) { @@ -281,6 +281,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return can.run(event, [ctx.ACTION, target.name], function(msg) { can.run() }, true) } + if (key == "hash" && can.user.mod.isDiv) { + can.user.jumps("/chat/div/"+value) + return + } can.sup.onaction.change(event, can.sup, key, value) }, ondblclick: function(event) { if ([kit.MDB_KEY].indexOf(key) > -1) { return } var item = can.core.List(can.Conf("feature.insert"), function(item) { @@ -429,7 +433,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe can.page.Modify(can, target||document.body, {style: {background: url == "" || url == "void"? "": 'url("'+url+'")'}}) }, figure: function(event, can, target, right) { target = target||can._target; if (!event || !event.target) { return } - var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight; if (right) { + var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-5; if (right) { var left = event.clientX-event.offsetX+event.target.offsetWidth, top = event.clientY-event.offsetY } diff --git a/lib/base.js b/lib/base.js index 7bb87c5f..eb8eac93 100644 --- a/lib/base.js +++ b/lib/base.js @@ -106,6 +106,15 @@ Volcanos("base", {help: "数据类型", Format: function(obj) { return JSON.stringify(obj) }, + endWith: function(str, end) { + return str.lastIndexOf(end) + end.length == str.length + }, + trimSuffix: function(str, end) { + if (str.indexOf(end) == -1) { + return str + } + return str.slice(0, str.indexOf(end)) + }, Simple: function() { var res = [] for (var i = 0; i < arguments.length; i++) { var arg = arguments[i]; switch (typeof arguments[i]) { diff --git a/lib/misc.js b/lib/misc.js index 6ded3452..75e8325f 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -2,7 +2,7 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg var proto = {_event: event, _can: can, RunAction: function(event, sub, cmds) { var msg = can.request(event) if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && sub && sub.onaction[cmds[1]]) { - return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(sub.onaction[cmds[1]], {event: event, can: sub, msg: msg, cmd: cmds[1]}), true + return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(sub.onaction[cmds[1]], {event: event, can: sub, msg: msg, cmd: cmds[1], button: cmds[1]}), true } return false }, @@ -150,7 +150,7 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg var msg = can.request(event); msg.Reply = function() { // 回复命令 msg.result = (msg.result||[]).concat(can.core.List(arguments)) - msg.Option({_handle: true, _target: msg.Option("_source")}) + msg.Option({_handle: true, _source: (msg["_target"]||[]).reverse().slice(1).join(".")||"",_target: (msg["_source"]||[]).reverse().join(".")}) can.misc.Log("wss", "result", msg.result, msg) delete(msg._event), delete(msg._can) diff --git a/lib/user.js b/lib/user.js index 74ae6183..6a4346ed 100644 --- a/lib/user.js +++ b/lib/user.js @@ -1,7 +1,7 @@ Volcanos("user", {help: "用户操作", agent: { scanQRCode: function(cb, can) { - can.user.input(event, can, [{type: "textarea"}], function(ev, button, data, list, args) { - cb(list[0]) + can.user.input(event, can, [{type: "textarea", name: "text", text: ""}], function(ev, button, data, list, args) { + cb(list[0], can.base.parseJSON(list[0])) }) }, getLocation: function(cb) { @@ -30,7 +30,9 @@ Volcanos("user", {help: "用户操作", agent: { isLocalFile: location && location.protocol && location.protocol == "file:", mod: { isPod: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0), - isCmd: location && location.pathname && (location.pathname.indexOf("/chat/cmd/") == 0 || location.pathname.indexOf("/help/") == 0), + isDiv: location && location.pathname && (location.pathname.indexOf("/chat/div/") == 0), + isCmd: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0 && location.pathname.indexOf("/cmd/") > 0 || + location.pathname.indexOf("/chat/cmd/") == 0 || location.pathname.indexOf("/help/") == 0), }, alert: function(text) { alert(JSON.stringify(text)) }, @@ -97,10 +99,10 @@ Volcanos("user", {help: "用户操作", agent: { }, function() { action.close() }), _target: ui._target, ui: ui, }); can.onmotion.story.auto(can, ui._target) - can.search(can.request({}, { + can.onengine.signal(can, "ontoast", can.request({}, { title: meta.title, content: meta.content, time: can.base.Time(), fileline: can.misc.FileLine(2, 2), - })._event, ["Footer.onimport.toast"]) + })) return action }, share: function(can, msg, cmd) { @@ -210,7 +212,7 @@ Volcanos("user", {help: "用户操作", agent: { }, msg, can.Option()); can.run(event, cmds, cb, true) } - target.value = target.value||msg.Option(item.name)||(item.name&&can.Option(item.name))||"" + target.value = target.value||(item.name&&can.Option(item.name))||"" can.onappend.figure(can, item, target) } @@ -230,7 +232,7 @@ Volcanos("user", {help: "用户操作", agent: { }, _target: ui._target, }) - can.page.Select(can, ui._target, "input", function(item, index) { + can.page.Select(can, ui._target, "textarea,input,select", function(item, index) { index == 0 && can.onmotion.focus(can, item) }) diff --git a/page/index.css b/page/index.css index c9b57222..726e03f5 100644 --- a/page/index.css +++ b/page/index.css @@ -62,9 +62,6 @@ input[type=button] { cursor:pointer; font-family:monospace; } -body.en input[type=button] { - letter-spacing:2px; -} input[type=button]:hover { background-color:gray; color:cyan; } @@ -311,7 +308,6 @@ fieldset.float { background-color:#023531cf; margin:0px; padding:0px; position:absolute; - z-index:30; } fieldset.float>legend { display:none; @@ -323,7 +319,6 @@ body>fieldset.input { position:fixed; top:32px; background-color:#0d4142a6; position:fixed; - z-index:50; } body>fieldset.input div.output { max-height:400px; @@ -335,10 +330,8 @@ body>fieldset.input td { word-break:keep-all; } body>fieldset.input.key { - z-index:60; } body>fieldset.input.date { - z-index:70; } body>fieldset.input.date table { text-align:center; @@ -350,7 +343,7 @@ body>fieldset.input.date table td:hover { body>div.toast { background:#0e3369b3; color:yellow; - position:fixed; z-index:100; + position:fixed; padding:5px; overflow:auto; } body>div.toast a { @@ -388,7 +381,6 @@ body>div.carte { background:#295b61; color:white; padding:4px; - z-index:30; min-width:80px; } body>div.carte div.item { @@ -400,7 +392,6 @@ body>div.carte div.item:hover { body>div.input { position:fixed; background-color:#0d4142a6; - z-index:50; } body>div.input input[type=text] { width:171px; @@ -432,7 +423,6 @@ body>div.upload { background:black; color:yellow; position:fixed; padding:5px; - z-index:50; } body>div.upload div.item { float:left; @@ -492,6 +482,13 @@ body.white td>input[type=button][name=remove] { body.white td>input[type=button][name=create] { background-color:blue; } +body.white input[name=cmd] { + background-color:black; color:white; + width:240px; +} +body.white input[name=cmd]:hover { + background-color:white; color:black; +} body.white table { color:black; @@ -599,7 +596,6 @@ body.mobile fieldset.Header.head { width:-webkit-fill-available; height:2em; font-size:24px; background-color:#000000b8; - z-index:10; } body.mobile fieldset.Header.head div.output { height:2em; @@ -618,7 +614,6 @@ body.mobile fieldset.River.left { background-color:#243950bf; min-width:240px; font-size:24px; /* width:-webkit-fill-available; */ - z-index:10; } body.mobile fieldset.River>div.output div.list div.item { font-size:24px; @@ -635,7 +630,6 @@ body.mobile fieldset.Footer.foot { height:64px; font-size:24px; background-color:#000000b8; display:none; - z-index:10; } body.mobile.landscape fieldset.Header.head { position:unset; @@ -655,4 +649,7 @@ body.mobile>div.carte { body.mobile>div.input.login input { font-size:24px } +body.en input[type=button] { + letter-spacing:2px; +} diff --git a/page/index.js b/page/index.js index 72f99ad4..2456af44 100644 --- a/page/index.js +++ b/page/index.js @@ -1,5 +1,5 @@ Volcanos({name: "chat", panels: [ - {name: "Header", help: "标题栏", pos: chat.HEAD, state: ["time", "username", "avatar"]}, + {name: "Header", help: "标题栏", pos: chat.HEAD, state: ["time", "usernick", "avatar"]}, {name: "Search", help: "搜索框", pos: chat.AUTO}, {name: "River", help: "群聊组", pos: chat.LEFT, action: ["create", "refresh"]}, {name: "Action", help: "工作台", pos: chat.MAIN}, diff --git a/panel/action.css b/panel/action.css index e5a269f8..8ce2a648 100644 --- a/panel/action.css +++ b/panel/action.css @@ -11,7 +11,6 @@ fieldset.Action>div.action.tabs { display:block; height:28px; padding:0; margin:0; position:absolute; - z-index:10; } fieldset.Action>div.action div.item { padding:4px; margin:0; @@ -32,7 +31,6 @@ fieldset.Action div.output fieldset.plugin.fixed { margin:0px; padding:0px; background-color:black; - z-index:10; height: -webkit-fill-available; width: -webkit-fill-available; overflow: auto; diff --git a/panel/action.js b/panel/action.js index c505291a..c9f9249c 100644 --- a/panel/action.js +++ b/panel/action.js @@ -47,8 +47,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) list[0] == "help"? can.user.open("/help/"+button+".shy"): can.onaction.layout(can, button) }) }, - _share: function(can, share) { - share && can.run({}, ["_share", share], function(msg) { + _share: function(can, share) { if (!share) { return } + can.run({}, ["_share", share], function(msg) { can.user.topic(can, can.user.Search(can, chat.TOPIC)||msg.Option(chat.TOPIC)) can.user.title(can.user.Search(can, chat.TITLE)||msg.Option(chat.TITLE)) can.onaction.layout(can, "auto") @@ -94,12 +94,7 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, } can.base.isFunc(cb) && cb() }, - onmain: function(can, msg) { - var cmds = location.pathname.split("/").slice(1); if (cmds[0] == ice.CMD) { - can.onappend.plugin(can, {index: cmds[1]}, function(sub) { sub.run = function(event, cmds, cb) {} }) - } - can.onimport._share(can, can.user.Search(can, web.SHARE)) - }, + onmain: function(can, msg) { can.onimport._share(can, can.user.Search(can, web.SHARE)) }, onsize: function(can, msg, width, height) { can.Conf({width: width, height: height}) }, onsearch: function(can, msg, word) { if (word[0] == "*" || word[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, word) } @@ -116,7 +111,7 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, can.run({}, [river, storm], function(msg) { if (msg.Length() == 0) { // 添加工具 - can.onengine.signal(can, "onaction_notool", can.request({}, {river: river, storm: storm})) + can.onengine.signal(can, "onaction_nostorm", can.request({}, {river: river, storm: storm})) } else { can.onimport._init(can, msg) } diff --git a/panel/cmd.css b/panel/cmd.css index 8953d038..60752364 100644 --- a/panel/cmd.css +++ b/panel/cmd.css @@ -1,15 +1,15 @@ -fieldset.plugin>div.legend { +fieldset.panel.cmd>div.output>fieldset.plugin { + margin:0; padding:0; +} +fieldset.panel.cmd>div.output>fieldset.plugin>legend { + display:none; +} +fieldset.panel.cmd>div.output>fieldset.plugin>div.legend { float:left; padding:0 10px; margin-right:3px; height:25px; font-size:18px; background-color:darkcyan; cursor:pointer; } -fieldset.panel.cmd>div.output>fieldset.plugin>legend { - display:none; -} -fieldset.panel.cmd>div.output>fieldset.plugin { - margin:0; padding:0; -} -body.white fieldset.plugin>div.legend { +body.white fieldset.panel.cmd>div.output>fieldset.plugin>div.legend { background-color:honeydew; } diff --git a/panel/cmd.js b/panel/cmd.js index bc3ae8b3..ee45cf05 100644 --- a/panel/cmd.js +++ b/panel/cmd.js @@ -1,7 +1,7 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.float.auto(can, can._output, chat.CARTE) - can.base.isFunc(cb) && cb() -}, + can.onmotion.float.auto(can, can._output, chat.CARTE) + can.base.isFunc(cb) && cb() + }, onmain: function(can) { can._names = location.pathname var msg = can.request({}, {_names: location.pathname}) can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(line, next) { diff --git a/panel/footer.css b/panel/footer.css index d3bd4a0c..949ac7a2 100644 --- a/panel/footer.css +++ b/panel/footer.css @@ -10,23 +10,26 @@ fieldset.Footer>div.output>div { cursor:pointer; } fieldset.Footer>div.output>div:hover { - border-bottom:solid 2px red; + border-top:solid 2px red; background-color:#2e515f; } fieldset.Footer>div.output div.title { float:left; } -fieldset.Footer>div.output div.toast { - float:right; - background-color:darkcyan; -} fieldset.Footer>div.output div.state { float:right; } +fieldset.Footer>div.output div.toast { + float:right; background-color:darkcyan; +} +fieldset.Footer>div.output div.cmd { + float:left; padding:0px; +} fieldset.Footer>div.output input[name=cmd] { width:120px; height:25px; + border-radius:0; } fieldset.Footer>div.output input[name=cmd]:focus { width:320px; diff --git a/panel/footer.js b/panel/footer.js index da4bd527..158f0af2 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -2,8 +2,8 @@ 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.onimport._cli(can, msg, target) can.base.isFunc(cb) && cb(msg) }, _title: function(can, msg, target) { @@ -17,50 +17,50 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, {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.onaction._cmd(can) - can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: 32}}) + can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}}) }}]) }) }, _toast: function(can, msg, target) { can.toast = can.page.Append(can, target, [{view: chat.TOAST, onclick: function(event) { can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first - can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: 32}}) + can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}}) }}]).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 } + can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) { + can.onkeypop.input(event, can); if (event.key != lang.ENTER) { return } switch (event.target.value) { - case cli.CLOSE: can.cli && can.cli.close(); break case cli.CLEAR: can.cli && can.cli.close(); break + case cli.CLOSE: can.cli && can.cli.close(); break default: can.run(event, [cli.RUN].concat(can.core.Split(event.target.value, ice.SP)), 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: ""}}) + }), can.page.Modify(can, can.cli.first, {style: {bottom: can.onexport.height(can), top: ""}}) }) } - }]}]) + }}, "", target, "title cmd") }, - toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast||can.request() - can.page.Modify(can, can.toast, [time.split(ice.SP).pop(), title, content].join(ice.SP)) - can._toast.Push({time: time, fileline: fileline, title: title, content: content}) - }, - ncmd: function(can, msg, follow, cmds) { var NCMD = "ncmd"; can._cmds = can._cmds || can.request() - can._cmds.Push({time: can.base.Time(), follow: follow, cmds: cmds}) + ncmd: function(can, msg, _follow, _cmds) { var NCMD = "ncmd"; can._cmds = can._cmds||can.request() + can._cmds.Push({time: can.base.Time(), follow: _follow, cmds: _cmds}) can.page.Select(can, can._output, can.core.Keys(html.SPAN, NCMD), function(item) { item.innerHTML = can.Conf(NCMD, parseInt(can.Conf(NCMD)||"0")+1+"")+"" }) }, + toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast||can.request() + can.page.Modify(can, can.toast, [time.split(ice.SP).pop(), title, content].join(ice.SP)) + can._toast.Push({time: time, fileline: fileline, title: title, content: content}) + }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { can.base.isFunc(cb) && cb(msg) }, - onlogin: function(can, msg) { - can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) - }, + onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) }, + onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) }, + ontoast: function(can, msg) { can.core.CallFunc(can.onimport.toast, {can: can, msg: msg}) }, _cmd: function(can) { return can.onappend.float(can, can._cmds, function(value, key, index, line, list) { @@ -72,10 +72,10 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, case "web.wiki.word": cmds = cmds.slice(5); break } - can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { + can.get("Action", "size", function(msg, top, left, width, height) { can.onappend.plugin(can, {index: cmds[0], args: cmds.slice(1), height: height-100, width: width}, function(sub) { - sub.run = function(event, cmds, cb) { - can.run(event, can.misc.Concat([ctx.ACTION, cli.RUN, cmds[0]], cmds), cb) + sub.run = function(event, cmd, cb) { + can.run(event, can.misc.Concat([ctx.ACTION, cli.RUN, cmds[0]], cmd), cb) } can.page.Modify(can, sub._target, {style: {top: top+100, left: left}}) diff --git a/panel/header.css b/panel/header.css index 835eb8b5..3a9cf4f5 100644 --- a/panel/header.css +++ b/panel/header.css @@ -1,10 +1,9 @@ fieldset.Header { height:32px; padding:0 5px; overflow:hidden; - z-index:10; } fieldset.Header>div.output { - z-index:10; + height:32px; overflow:hidden; } fieldset.Header>div.output>div { height:22px; padding:5px; @@ -18,18 +17,19 @@ fieldset.Header>div.output>div:hover { fieldset.Header>div.output>div.title { float:left; } -fieldset.Header>div.output>div.search { - float:left; margin-left:20px; -} -fieldset.Header>div.output>div.search>input { - height:25px; margin-top:-5px; -} fieldset.Header>div.output>div.state { float:right; } fieldset.Header>div.output>div.state.avatar>img { height:1.4em; } +fieldset.Header>div.output>div.search { + float:left; margin-left:20px; +} +fieldset.Header>div.output>div.search>input { + height:25px; margin-top:-5px; + border-radius:0; +} fieldset.Header>div.output div.menu { height:21px; padding:5px; @@ -40,7 +40,3 @@ fieldset.Header>div.output div.menu:hover { border-bottom:solid 2px red; background-color:#2e515f; } -fieldset.Header>div.output input[type=text] { - border-radius:0; -} - diff --git a/panel/header.js b/panel/header.js index c2e65e82..53c9aa21 100644 --- a/panel/header.js +++ b/panel/header.js @@ -1,7 +1,5 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - 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)) + can.Conf(aaa.USERNICK, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNICK)) can.onmotion.clear(can) can.onimport._agent(can, msg, target) @@ -24,11 +22,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, } else if (can.user.isExtension) { can.onaction.River(can) } - can.user.isWeiXin && can.onimport._weixin(can) + can.run({}, [chat.AGENT], function(msg) { if (!msg.Option(ssh.SCRIPT)) { return } + can.require(can.base.Obj(msg.Option(ssh.SCRIPT)), function(can) { can.onaction.source(can, msg) }) + }) }, _grant: function(can, msg, target) { if (can.user.Search(can, chat.GRANT)) { - if (can.user.confirm(chat.GRANT+" "+can.user.Search(can, chat.GRANT))) { + if (can.user.confirm(chat.GRANT+ice.SP+can.user.Search(can, chat.GRANT))) { can.run(event, [ctx.ACTION, chat.GRANT, web.SPACE, can.user.Search(can, chat.GRANT)]) } can.user.Search(can, chat.GRANT, "") @@ -43,93 +43,58 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, _state: function(can, msg, target) { - can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), [kit.MDB_TIME, aaa.USERNAME]), function(item) { - if (item == aaa.AVATAR ) { - if (can.user.isExtension || can.user.isLocalFile) { return } + can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), [kit.MDB_TIME, aaa.USERNICK]), function(item) { + if (item == aaa.AVATAR ) { if (can.user.isLocalFile) { return } can.page.Append(can, target, [{view: can.base.join([chat.STATE, item]), list: [{img: ice.SP}], onmouseenter: function(event) { - can.onaction.carte(event, can, [can.page.Format(html.IMG, can.Conf(item), 160)]) - }}]) - return + can.onaction.carte(event, can, [can.page.Format(html.IMG, "/share/local/avatar", 160)]) + }}]); return } can.page.Append(can, target, [{view: [can.base.join([chat.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 == kit.MDB_TIME && can.onimport._time(can, target) - }}]) + }, _init: function(target) { item == kit.MDB_TIME && can.onimport._time(can, target) }}]) }) }, _search: function(can, msg, target) { - var ui = can.page.Append(can, target, [{view: mdb.SEARCH, list: [{type: html.INPUT, data: {type: html.TEXT, placeholder: mdb.SEARCH}, onkeydown: function(event) { + var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) { can.onkeypop.input(event, can); switch (event.key) { - case "Enter": can.search(event, ["Search.onimport.select", "*", event.target.value]); break + case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value})) } - }}] }]) - can.user.isMobile && can.page.Modify(can, ui.first, {style: {float: "right"}}) + }}, "", target, "title search").parentNode + can.user.isMobile && can.page.Modify(can, ui, {style: {float: "right"}}) }, - _background: function(can, msg) { - if (can.user.isExtension || can.user.isLocalFile) { return } - // can.onlayout.background(can, msg.Option(aaa.BACKGROUND), document.body) + _background: function(can, msg) { if (can.user.isLocalFile) { return } msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body) }, - _avatar: function(can, msg) { - if (can.user.isExtension || can.user.isLocalFile) { return } - // can.page.Modify(can, "div.output div.state.avatar>img", {src: can.Conf(aaa.AVATAR, msg.Option(aaa.AVATAR))}) + _avatar: function(can, msg) { if (can.user.isLocalFile) { return } msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.output div.state.avatar>img", {src: "/share/local/avatar"}) }, _menus: function(can, msg, target) { var menus = can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), [chat.HEADER, ["setting", chat.BLACK, chat.WHITE, chat.PRINT]]) - can.onimport.menu(can, can.user.mod.isPod||can.user.isMobile||can.user.isExtension? [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}) + can.onimport.menu(can, can.user.mod.isPod||can.user.isMobile||can.user.isExtension? [chat.HEADER, chat.RIVER]: menus, function(event, button) { + can.core.CallFunc(can.onaction[button]||function(event, can) { + can.run(event, [button], function(msg) { can.user.toast(can, "执行成功", can.user.trans(can, button)) }) + }, {event: event, can: can, button: button}) }) }, - _weixin: function(can, msg) { can.run({}, [ctx.ACTION, chat.AGENT], function(msg) { - can.require(can.base.Obj(msg.Option(ssh.SCRIPT)), function(can) { - wx.config({debug: msg.Option("debug") == ice.TRUE, - appId: msg.Option("appid"), signature: msg.Option("signature"), - nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"), - - jsApiList: can.core.Item({ - scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) { - can.base.isFunc(cb) && cb(res.resultStr) - } }) }, - getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) { - can.base.isFunc(cb) && cb({type: "gcj02", name: "当前位置", text: "当前位置", latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) }) - } }) }, - openLocation: function(msg) { wx.openLocation({ - latitude: parseInt(msg.Option("latitude"))/100000, - longitude: parseInt(msg.Option("longitude"))/100000, - name: msg.Option(kit.MDB_NAME), address: msg.Option(kit.MDB_TEXT), - scale: msg.Option("scale")||14, infoUrl: msg.Option(kit.MDB_LINK), - }) }, - chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) { - can.base.isFunc(cb) && cb(res.localIds) - } }) }, - }, function(key, value) { return can.user.agent[key] = value, key }), - }) - wx.ready(function() { - can.misc.Log("ready") - }) - wx.error(function(err) { - can.misc.Log("what", err) - }) - }) }) - }, _time: function(can, target) { can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) }) - can.onappend.figure(can, {style: {"min-width": 306}, action: "date"}, target, function(sub) { - can.search({}, ["Action.onexport.size"], function(msg, top) { + can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target, function(sub) { + can.get("Action", "size", function(msg, top) { can.page.Modify(can, sub._target, {style: {top: top, left: window.innerWidth-sub._target.offsetWidth}}) }) - }), target.onmouseenter = function() { target.click() } + }), target.onmouseenter = target.click }, - time: function(can, target) { can.onlayout.topic(can) target.innerHTML = can.user.time(can, null, "%w %H:%M:%S") }, + background: function(event, can, url) { if (can.user.isLocalFile) { return } + can.run(event, [ctx.ACTION, aaa.BACKGROUND, url], function(msg) { can.onimport._background(can, msg) }) + }, + avatar: function(event, can, url) { if (can.user.isLocalFile) { return } + can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { can.onimport._avatar(can, msg) }) + }, menu: function(can, cmds, cb) { return can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(cmds.slice(1), function(item) { if (can.base.isString(item)) { @@ -137,7 +102,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.base.isFunc(cb) && cb(event, item, cmds) }} - } else if (item.length > 0) { + } else if (can.base.isArray(item)) { return {view: [html.MENU, html.DIV, can.user.trans(can, item[0])], onmouseenter: function(event) { can.onaction.carte(event, can, item.slice(1), function(event, button) { can.base.isFunc(cb) && cb(event, button, item) @@ -149,16 +114,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, } }) }]).first }, - avatar: function(event, can, url) { - !can.user.isLocalFile && can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { - can.onimport._avatar(can, msg) - }) - }, - background: function(event, can, url) { - !can.user.isLocalFile && can.run(event, [ctx.ACTION, aaa.BACKGROUND, url], function(msg) { - can.onimport._background(can, msg) - }) - }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, list, cb, target) { can.base.isFunc(cb) && cb() @@ -182,6 +137,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, "print": "打印主题", "shareuser": "共享用户", + "setnick": "设置昵称", "language": "语言地区", "chinese": "中文", "clear": "清除背景", @@ -196,13 +152,12 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, // 登录检查 can.user.isLocalFile? init(): can.run({}, [chat.CHECK], function(msg) { - can.Conf(aaa.USERNAME, msg.Option(ice.MSG_USERNAME))? init(): - msg.Option(chat.SSO)? can.user.jumps(msg.Option(chat.SSO)): can.user.login(can, init, msg.Option(aaa.LOGIN)) + can.Conf(aaa.USERNICK, msg.Option(ice.MSG_USERNICK))? init(): + msg.Option(chat.SSO)? can.user.jumps(msg.Option(chat.SSO)): + can.user.login(can, init, msg.Option(aaa.LOGIN)) }) }, - onstorm_select: function(can, msg, river, storm) { - can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm) - }, + onstorm_select: function(can, msg, river, storm) { can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm) }, title: function(event, can) { var args = {}; can.core.List([chat.TITLE, chat.TOPIC, chat.LAYOUT], function(key) { @@ -235,26 +190,25 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, }) }, - carte: function(event, can, list, cb) { can.user.carte(event, can, can.onaction, list, cb) }, share: function(event, can, arg) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(arg||[])) }, - username: function(event, can) { - can.onaction.carte(event, can, ["shareuser", aaa.USERNICK, [aaa.LANGUAGE, aaa.ENGLISH, aaa.CHINESE], "clear", aaa.LOGOUT]) + usernick: function(event, can) { + can.onaction.carte(event, can, ["shareuser", "setnick", [aaa.LANGUAGE, aaa.CHINESE, aaa.ENGLISH], cli.CLEAR, aaa.LOGOUT]) }, shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, kit.MDB_TYPE, aaa.LOGIN]) }, - usernick: function(event, can) { - can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNAME)}], function(ev, button, data, list, args) { + setnick: function(event, can) { + can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(ev, button, data, list, args) { can.run(event, [aaa.USERNICK, list[0]], function(msg) { - can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNAME), function(item) { - can.page.Modify(can, item, can.Conf(aaa.USERNAME, list[0])) + can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNICK), function(item) { + can.page.Modify(can, item, can.Conf(aaa.USERNICK, list[0])) }), can.user.toast(can, "修改成功") }, true) }) }, - english: function(event, can) { can.user.Search(can, aaa.LANGUAGE, "en") }, chinese: function(event, can) { can.user.Search(can, aaa.LANGUAGE, "zh") }, - clear: function(event, can, button) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, "") }, + english: function(event, can) { can.user.Search(can, aaa.LANGUAGE, "en") }, + clear: function(event, can) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, ""), can.user.reload(true) }, logout: function(event, can) { can.user.logout(can) }, River: function(can) { can.search({}, ["River.onmotion.toggle"]) }, diff --git a/panel/river.js b/panel/river.js index 404175bc..fdab9cb2 100644 --- a/panel/river.js +++ b/panel/river.js @@ -25,7 +25,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.core.CallFunc([can.ondetail, button], [event, can, button, can.Conf(chat.RIVER), can.Conf(chat.STORM)]) }) }, - _carte: function(can, list, river, storm) { if (can.user.mod.isPod||can.user.isMobile) { return } + _carte: function(can, list, river, storm) { if (can.user.isMobile) { return } can.onaction.carte(event, can, list, function(event, button, module) { module[button](event, can, button, river, storm) }) @@ -58,7 +58,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, c var list = can._root.river cmds.length == 0 && can.core.Item(list, function(key, value) { msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 群组列表 - }); if (cmds.length != 1 && cmds[1] != chat.TOOL) { return false } + }); if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } var river = list[cmds[0]]; if (!river) { return false } can.core.Item(river.storm, function(key, value) { @@ -76,15 +76,14 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, onsearch: function(can, msg, word) { if (word[0] == "*" || word[0] == chat.STORM) { can.onexport.storm(can, msg, word) } }, - onstorm_select: function(can, msg, river, storm) { - var args = {river: river, storm: storm} + onstorm_select: function(can, msg, river, storm) { var args = {river: river, storm: storm} if (can.user.isExtension) { localStorage.setItem("args", JSON.stringify(args)) } }, onaction_touch: function(can, msg) { can.onmotion.float.del(can, chat.CARTE) can.user.isMobile && can.onmotion.hidden(can) }, - onaction_notool: function(can, msg, river, storm) { + onaction_nostorm: function(can, msg, river, storm) { can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm) }, @@ -99,7 +98,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, can.onmotion.select(can, can._output, "div.item", can.river_list[river]) var list = can.sublist[river]; if (list) { return can.onmotion.toggle(can, list) } - can.run({}, [river, chat.TOOL], function(msg) { + can.run({}, [river, chat.STORM], function(msg) { var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) { river == can._main_river && item.hash == can._main_storm && (select = index) return can.onimport._storm(can, item, river) @@ -131,10 +130,8 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, }) }, refresh: function(event, can) { - var args = { - river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), - topic: can.search(event, ["Header.onexport.topic"]), - layout: can.search(event, ["Action.onexport.layout"]), + var args = {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), + topic: can.get("Header", "topic"), layout: can.get("Action", "layout"), } if (can.user.isExtension) { localStorage.setItem("args", JSON.stringify(args)) } can.user.Search(can, args) @@ -164,7 +161,7 @@ Volcanos("ondetail", {help: "菜单交互", }, "添加工具": function(event, can, button, river, storm) { can.user.select(event, can, ctx.COMMAND, "context,command", function(item, next) { - can.run({}, [river, chat.TOOL, ctx.ACTION, mdb.INSERT, kit.MDB_HASH, storm].concat([ice.POD, "", ice.CTX, item[0], ice.CMD, item[1]]), function(msg) { + can.run({}, [river, chat.STORM, ctx.ACTION, mdb.INSERT, kit.MDB_HASH, storm].concat([ice.POD, "", ice.CTX, item[0], ice.CMD, item[1]]), function(msg) { next() }) }, function() { @@ -229,20 +226,20 @@ Volcanos("ondetail", {help: "菜单交互", can.search(event, ["Action.onexport.args"], function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id}) var toast = can.user.toast(can, (index+1)+"/"+array.length, "保存参数", 10000, (index+1)/array.length) - can.run(msg._event, [river, chat.TOOL, ctx.ACTION, mdb.MODIFY, ice.ARG, item.dataset.args], function(msg) { + can.run(msg._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY, ice.ARG, item.dataset.args], function(msg) { toast.close(), next() }) }) }, "重命名应用": function(event, can, button, river, storm) { can.user.input(event, can, [kit.MDB_NAME], function(ev, button, meta, list, args) { - can.run(can.request(event, {hash: storm})._event, [river, chat.TOOL, ctx.ACTION, mdb.MODIFY].concat(args), function(msg) { + can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function(msg) { can.user.Search(can, {river: river, storm: storm}) }) }) }, "删除应用": function(event, can, button, river, storm) { - can.run(can.request(event, {hash: storm})._event, [river, chat.TOOL, ctx.ACTION, mdb.REMOVE], function(msg) { + can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { can.user.Search(can, {river: river}) }) }, @@ -254,7 +251,7 @@ Volcanos("ondetail", {help: "菜单交互", {name: kit.MDB_TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"}, {name: kit.MDB_NAME, value: "hi", _trans: "名称"}, {name: kit.MDB_TEXT, value: "hello", _trans: "简介"}, ], function(event, button, meta, list, args) { - can.run({}, [river, chat.TOOL, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { + can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { can.user.Search(can, {river: river, storm: msg.Result()}) }) }) diff --git a/panel/search.css b/panel/search.css index e5a7a1e2..d84e56db 100644 --- a/panel/search.css +++ b/panel/search.css @@ -1,6 +1,7 @@ fieldset.Search { + z-index:10; background:#041a25bd; padding:10px; - position:fixed; z-index:20; + position:fixed; display:none; } body.white fieldset.Search table { diff --git a/panel/search.js b/panel/search.js index 6aad18aa..9e87c52e 100644 --- a/panel/search.js +++ b/panel/search.js @@ -14,17 +14,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, var cb = can.onaction[cmds[1]]; if (cb) { cb({}, can); return } var res = can.request({}, { - word: cmds, - fields: fields.join(","), - sort: msg.Option("sort"), - index: msg.Option("index"), - river: msg.Option("river"), + word: cmds, fields: fields.join(","), sort: msg.Option("sort"), + river: msg.Option(chat.RIVER), index: msg.Option("index"), }) can.onengine.signal(can, chat.ONSEARCH, res) can.run(res._event, cmds, function(res) { can.onimport._init(can, res, fields) }) - can.onmotion.show(can), can.ui.input.focus() - can.ui.word.setSelectionRange(0, -1) + can.onmotion.show(can), can.ui.input.focus(), can.ui.word.setSelectionRange(0, -1) }, select: function(can, msg, cmds, cb) { can.ui.word.value = cmds[1] @@ -37,10 +33,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport._word(can, msg, cmds, fields) }, can.onimport._word(can, msg, cmds, fields) - can.search(event, ["Action.onexport.size"], function(msg, top, left, width, height) { + can.get("Action", "size", function(msg, top, left, width, height) { can.page.Modify(can, can._output, {style: {"max-width": width, "max-height": height-75}}) can.page.Modify(can, can._target, {style: {top: top, left: left}}) - } ) + }) }, }) Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DONE], _init: function(can, meta, list, cb, target) { @@ -50,9 +46,9 @@ Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DON can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list) can.ui = can.page.Append(can, can._output, [ {input: ["word", function(event) { can.onkeypop.input(event, can) - if (event.key == "Escape") { can.onmotion.hide(can) } + if (event.key == lang.ESCAPE) { can.onmotion.hide(can) } - if (event.key == "Enter") { event.stopPropagation(), event.preventDefault() + if (event.key == lang.ENTER) { event.stopPropagation(), event.preventDefault() if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1] return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index) } @@ -60,12 +56,14 @@ Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DON can.input(event, event.target.value) } }]}, - {view: chat.CONTENT}, {view: [chat.DISPLAY, html.TABLE]}, {view: chat.PROFILE}, + {view: chat.CONTENT}, {view: html.STATUS}, {view: [chat.DISPLAY, html.TABLE]},{view: chat.PROFILE}, ]), can.page.ClassList.add(can, can.ui.display, chat.CONTENT) }, - close: function(event, can) { can.onmotion.hide(can) }, + onopensearch: function(can, msg, type, word) { can.onimport.select(can, msg, [type, word]) }, + clear: function(event, can) { can.onmotion.clear(can, can.ui.profile) }, done: function(event, can) { can.base.isFunc(can.cb) && can.cb() }, + close: function(event, can) { can.onmotion.hide(can) }, select: function(event, can, index) { var line = can.list[index] if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } @@ -85,12 +83,12 @@ Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DON plugin: function(event, can, index) { var line = can.list[index] if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } - var cmd = line.cmd == "command"? can.core.Keys(line.type, line.name.split(" ")[0]): can.core.Keys(line.ctx, line.cmd) + var cmd = line.cmd == ctx.COMMAND? can.core.Keys(line.type, line.name.split(" ")[0]): can.core.Keys(line.ctx, line.cmd) can.onappend.plugin(can, {type: chat.PLUGIN, index: cmd||msg.Option(kit.MDB_INDEX)}, function(sub, meta) { - can.search({}, "Action.onexport.size", function(msg, width) { sub.Conf(chat.WIDTH, width-60) }) + can.get("Action", "size", function(msg, width) { sub.Conf(chat.WIDTH, width-60) }) sub.run = function(event, cmds, cb) { var msg = can.request(event, line) - can.run(event, can.misc.Concat([ctx.ACTION, cli.RUN, meta.index], cmds), cb) + can.run(event, can.misc.Concat([ctx.ACTION, cli.RUN, meta.index], cmds), cb, true) } }, can.ui.profile) }, diff --git a/plugin/local/chat/div.js b/plugin/local/chat/div.js index 5d5abae0..c36a15c8 100644 --- a/plugin/local/chat/div.js +++ b/plugin/local/chat/div.js @@ -1,33 +1,33 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { var meta = {}; msg.Table(function(value) { meta[value.key] = value.value }) - can._meta = can.base.Obj(meta.text, {meta: {name: meta.name}, list: []}) + can._meta = can.base.Obj(meta.text, {meta: {name: meta.name||"hi"}, list: []}) can.base.isFunc(cb) && cb(msg) - can.ui = can.page.Appends(can, target, [{view: ["layout", "table"], list: [{type: "tr", list: [ - {type: "td", list: [{view: "project"}]}, - {type: "td", list: [{view: "display"}]}, - {type: "td", list: [{view: "profile"}]}, + can.ui = can.page.Appends(can, target, [{view: ["layout", html.TABLE], list: [{type: html.TR, list: [ + {type: html.TD, list: [{view: "project"}]}, + {type: html.TD, list: [{view: "display"}]}, + {type: html.TD, list: [{view: "profile"}]}, ]}] }]), can.ui.project._fieldset = can.ui.display can.onimport._item(can, can._meta, can.ui.project, can.onimport._size(can)).click() }, _size: function(can) { - var width = can.Conf("width")-260, height = can.Conf("height")-100 + var width = can.Conf(chat.WIDTH)-260, height = can.Conf(chat.HEIGHT)-100 if (can.Conf("auto.cmd")) { + width = can.Conf(chat.WIDTH), height = can.Conf(chat.HEIGHT) can.onmotion.hidden(can, can.ui.project) can.onmotion.hidden(can, can.ui.profile) can.onmotion.hidden(can, can._option) can.onmotion.hidden(can, can._action) - width = can.Conf("width"), height = can.Conf("height") } - if (can.user.mod.isCmd) { + if (can.user.mod.isCmd || can.user.mod.isDiv) { width = window.innerWidth, height = window.innerHeight can.page.Modify(can, can._output, {style: {width: width, height: height}}) } return width }, - _item: function(can, node, target, width) { width = node.meta.width||width - var ui = can.page.Append(can, target, [{view: ["item", "div", node.meta.name||"some"]}, {view: ["list"]}]) + _item: function(can, node, target, width) { width = width||node.meta.width + var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, node.meta.name||"hi"]}, {view: [html.LIST]}]) ui.list._fieldset = can.onimport._field(can, node.meta, target._fieldset, width) var msg = can.request({}); msg.Push(node.meta, "", true) @@ -65,6 +65,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, feature: can.base.Obj(msg.Append("meta")), inputs: can.base.Obj(msg.Append("list")), args: meta.args, + name: meta.name, }, size), ["/plugin/state.js"], function(sub) { can.page.Modify(can, sub._output, {style: size}) sub.run = function(event, cmds, cb) { diff --git a/plugin/local/chat/scan.js b/plugin/local/chat/scan.js new file mode 100644 index 00000000..e69de29b diff --git a/plugin/local/chat/wx.js b/plugin/local/chat/wx.js new file mode 100644 index 00000000..e538be3d --- /dev/null +++ b/plugin/local/chat/wx.js @@ -0,0 +1,32 @@ +Volcanos("onaction", {source: function(can, msg) { + can.require("https://res.wx.qq.com/open/js/jweixin-1.6.0.js", function(can) { + wx.config({debug: msg.Option("debug") == ice.TRUE, + appId: msg.Option("appid"), signature: msg.Option("signature"), + nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"), + + jsApiList: can.core.Item({ + scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) { + can.base.isFunc(cb) && cb(res.resultStr, can.base.parseJSON(res.resultStr)) + } }) }, + getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) { + can.base.isFunc(cb) && cb({type: "gcj02", name: "当前位置", text: "当前位置", latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) }) + } }) }, + openLocation: function(msg) { wx.openLocation({ + latitude: parseInt(msg.Option("latitude"))/100000, + longitude: parseInt(msg.Option("longitude"))/100000, + name: msg.Option(kit.MDB_NAME), address: msg.Option(kit.MDB_TEXT), + scale: msg.Option("scale")||14, infoUrl: msg.Option(kit.MDB_LINK), + }) }, + chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) { + can.base.isFunc(cb) && cb(res.localIds) + } }) }, + }, function(key, value) { return can.user.agent[key] = value, key }), + }) + wx.ready(function() { + can.misc.Log("ready") + }) + wx.error(function(err) { + can.misc.Log("what", err) + }) + }) +}}) diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 052c31a9..fda7cf8d 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,4 +1,8 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, target) { + if (!can.base.endWith(can.Option("path"), "/")) { + can.Option("file", can.Option("path").split("/").pop()) + can.Option("path", can.base.trimSuffix(can.Option("path"), can.Option("file"))) + } can.onmotion.clear(can), can.ui = can.onlayout.profile(can) can.onimport._content(can, target) can.onimport._output(can, target) diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 7fb64553..3a4029fa 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -121,7 +121,7 @@ fieldset.word.float { position:fixed; left:0; top:0; background-color:aliceblue; background-color:aliceblue; - color:black; z-index:20; + color:black; } fieldset.word.float>div.output { background-color:aliceblue; diff --git a/plugin/state.js b/plugin/state.js index 4f509b0a..cd343b27 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -5,7 +5,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, }, _location: function(can, msg) { location.href = msg._arg[0] }, - _rewrite: function(can, msg) { can.Option(msg._arg[0], msg._arg[1]), can.Update(); return true }, + _rewrite: function(can, msg) { + for (var i = 0; i < msg._arg.length; i += 2) { + can.Option(msg._arg[i], msg._arg[i+1]) + } + 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}) @@ -164,40 +170,22 @@ Volcanos("onaction", {help: "交互操作", list: [ can.Update(event, [ctx.ACTION, "prev", can.Status("total")||0, can.Option("limit"), can.Option("offend")]) }, - scanQRCode: function(event, can, cmd) { - can.user.agent.scanQRCode(function(text) { var cmds = [ctx.ACTION, cmd] - var data = can.base.parseJSON(text) - can.core.Item(data, function(key, value) { cmds.push(key, value) }) - if (data["auth"]) { - if (can.user.confirm("auth "+data["auth"])) { - can.run(event, [ctx.ACTION, "auth", web.SPACE, data["auth"]]) - } - return - } - can.run(event, cmds, function(msg) { can.user.toast(can, "添加成功"), can.Update() }, true) - }, can) - }, - scanQRCode0: function(event, can) { can.user.agent.scanQRCode() }, - getClipboardData: function(event, can, cmd) { + getClipboardData: function(event, can, button) { + function add(text) { + can.run(event, can.base.Simple(ctx.ACTION, button, can.base.parseJSON(text)), function(msg) { + can.user.toast(can, text, "添加成功"), can.Update() + }, true) + } if (navigator.clipboard) { - navigator.clipboard.readText().then(function(text) { - can.run(event, can.base.Simple(ctx.ACTION, cmd, can.base.parseJSON(text)), function(msg) { - can.user.toast(can, text, "添加成功"), can.Update() - }, true) - }).catch(function(err) { can.misc.Log(err) }) + navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) }) } else { - can.user.input(event, can, [{type: "textarea"}], function(ev, button, data, list, args) { - can.run(event, can.base.Simple(ctx.ACTION, cmd, can.base.parseJSON(list[0])), function(msg) { - can.user.toast(can, list[0], "添加成功"), can.Update() - }, true) - }) + can.user.input(event, can, [{type: "textarea", name: "text"}], function(ev, button, data, list, args) { add(list[0]) }) } }, - getLocation: function(event, can, cmd) { var msg = can.request(can) - can.user.agent.getLocation(function(res) { can.request(event, res) - can.user.input(event, can, [kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT, "latitude", "longitude"], function(ev, button, data, list, arg) { - can.core.Item(res, function(key, value) { arg.push(key, value) }) - can.run(event, [ctx.ACTION, cmd].concat(arg), function(msg) { + getLocation: function(event, can, button) { + can.user.agent.getLocation(function(data) { can.request(event, data) + can.user.input(event, can, [kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT, "latitude", "longitude"], function(ev, bu, data, list, args) { + can.run(event, [ctx.ACTION, button].concat(can.base.Simple(args, data)), function(msg) { can.user.toast(can, "添加成功"), can.Update() }, true) }) diff --git a/plugin/story/spide.css b/plugin/story/spide.css index 3df8a842..6956f592 100644 --- a/plugin/story/spide.css +++ b/plugin/story/spide.css @@ -1,6 +1,5 @@ fieldset.inner.float { /* background-color:#332f1ecf; */ - z-index:10; } fieldset.inner.float div.output { background-color:#332f1ecf; diff --git a/proto.js b/proto.js index 8f68af34..4dfa8efd 100644 --- a/proto.js +++ b/proto.js @@ -143,7 +143,7 @@ var html = { } var lang = { STRING: "string", OBJECT: "object", FUNCTION: "function", - ENTER: "Enter", + ESCAPE: "Escape", ENTER: "Enter", } function shy(help, meta, list, cb) { var index = 0, args = arguments; function next(type) { @@ -213,7 +213,7 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: set: function(name, key, value) { var msg = can.request({}); msg.Option(key, value) return can.search(msg._event, [can.core.Keys(name, "onimport", key)]) }, - get: function(name, key) { return can.search({}, [can.core.Keys(name, "onexport", key)]) }, + get: function(name, key, cb) { return can.search({}, [can.core.Keys(name, "onexport", key)], cb) }, search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, Conf: function(key, value) { return can.core.Value(can._conf, key, value) }, _conf: {}, diff --git a/publish/client/mp/pages/river/river.js b/publish/client/mp/pages/river/river.js index a45d711f..c75ee87a 100644 --- a/publish/client/mp/pages/river/river.js +++ b/publish/client/mp/pages/river/river.js @@ -35,13 +35,13 @@ Page({ return page.setData({list: page.data.list}) } - app.requests(page.name, {cmds: [item.hash, "tool"]}, function(msg) { + app.requests(page.name, {cmds: [item.hash, "storm"]}, function(msg) { item.list = msg.Table(), page.setData({list: page.data.list}) }) }, onchange: function(event, data) { data = data || event.target.dataset - var item = this.data.list[data.index]; var tool = item.list[data.i] - app.jumps("action/action", {river: item.hash, storm: tool.hash, title: item.name+"."+tool.name}) + var item = this.data.list[data.index]; var storm = item.list[data.i] + app.jumps("action/action", {river: item.hash, storm: storm.hash, title: item.name+"."+storm.name}) }, onReady: function () {},