From 63958262c8ddb3adcad0d02075167088f4891485 Mon Sep 17 00:00:00 2001 From: shylinux Date: Sun, 6 Feb 2022 20:16:07 +0800 Subject: [PATCH] opt website --- frame.js | 35 +++++++++++++---------- lib/misc.js | 2 +- lib/page.js | 2 ++ lib/user.js | 17 +++++------ page/index.css | 26 +++++++++-------- page/index.js | 4 +-- panel/action.css | 1 - panel/action.js | 6 ++-- panel/footer.js | 7 +++++ panel/header.js | 40 +++++++++++++------------- panel/river.js | 11 ++++++++ panel/search.js | 1 + plugin/input.js | 2 +- plugin/input/date.css | 2 +- plugin/input/date.js | 11 ++++---- plugin/input/key.js | 56 +++++++++++++++---------------------- plugin/local/code/inner.css | 2 +- plugin/local/code/inner.js | 31 ++++++++++---------- plugin/local/code/vimer.js | 10 +++++-- plugin/state.js | 7 ++++- proto.js | 4 +++ 21 files changed, 157 insertions(+), 120 deletions(-) diff --git a/frame.js b/frame.js index 52129a78..f5c165f4 100644 --- a/frame.js +++ b/frame.js @@ -14,8 +14,6 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, can.core.ItemCB(panel.onaction, function(key, cb) { can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) }) }), can.core.CallFunc([panel.onaction, "_init"], {can: panel, cb: next, target: panel._target}) - - can.page.style(can, panel._target, panel.Conf(ctx.STYLE)) }, target) }, function() { can.misc.Log(can.user.title(), ice.RUN, can) can.require([can.volcano], null, function(can, name, sub) { can[name] = sub }) @@ -56,10 +54,12 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, return can.base.isFunc(cb) && cb(msg) } + if (msg.Option("_toast")) { var toast = can.user.toast(can, msg.Option("_toast"), "", -1) } var names = msg.Option("_names")||panel._names||((can.Conf("iceberg")||"/chat/")+panel._name) can.onengine.signal(can, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) can.misc.Run(event, can, {names: names, daemon: can.core.Keys(can.ondaemon._list[0], msg._daemon)}, cmds, function(msg) { Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast), can.base.isFunc(cb) && cb(msg) + toast && toast.close() }) }, @@ -134,6 +134,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, Action: function(key, value) { return can.page.SelectArgs(can, action, key, value)[0] }, Option: function(key, value) { return can.page.SelectArgs(can, option, key, value)[0] }, Update: function(event, cmds, cb, silent) { sub.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent); return true }, + Focus: function() { can.page.Select(can, option, html.INPUT_ARGS, function(item, index) { index == 0 && item.focus() }) }, Input: function(cmds, silent) { cmds = cmds && cmds.length > 0? cmds: can.page.SelectArgs(can, option, ""), cmds = can.base.trim(cmds) silent || cmds[0] == ctx.ACTION || can.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds) @@ -146,14 +147,17 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, }, list, function(sub) { sub.Conf(meta), meta.feature = can.base.Obj(meta.feature, {}) can.page.ClassList.add(can, field, meta.index? meta.index.split(ice.PT).pop(): meta.name) - can.page.ClassList.add(can, field, meta.style||meta.feature.style||"") + var style = can.base.getValid(meta.style, meta.feature.style); switch (typeof style) { + case lang.STRING: can.page.ClassList.add(can, field, style); break + case lang.OBJECT: can.page.style(can, sub._target, style); break + } meta.inputs && sub.onappend._option(sub, meta, sub._option, meta.msg) if (meta.msg) { var msg = sub.request(); msg.Copy(can.base.Obj(meta.msg)), sub.onappend._output(sub, msg, msg.Option(ice.MSG_DISPLAY)) } - can.page.Modify(can, sub._legend, {onmouseenter: function(event) { + can.page.Modify(can, sub._legend, kit.Dict(can.Conf("legend_event")||"onmouseenter", function(event) { can.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([["所有 ->"].concat(can.core.Item(meta.feature._trans))], [cli.CLOSE])) - }}), can.base.isFunc(cb) && cb(sub) + })), can.base.isFunc(cb) && cb(sub) }); return sub }, _option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg||meta.opt, []), opts = can.base.Obj(meta.opts, {}) @@ -201,8 +205,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, if (can._daemon) { msg._daemon = can._daemon } } - if (msg.Option("_toast")) { var toast = can.user.toast(can, msg.Option("_toast"), "", -1) } - return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg, toast && toast.close() + return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return } var process = msg._can == can || msg._can == sub if (process && can.core.CallFunc([sub, chat.ONIMPORT, ice.MSG_PROCESS], {can: sub, msg: msg})) { return } @@ -224,6 +227,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: table.onimport.list}) } + table._trans = can.base.Copy(table._trans||{}, can.core.Value(table, "onaction._trans")) can.core.CallFunc([table, chat.ONIMPORT, "_init"], {can: table, msg: msg, list: msg.result||msg.append||[], cb: function(msg) { table.onappend._action(table, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION)) table.onappend._status(table, msg.Option(ice.MSG_STATUS)) @@ -384,9 +388,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, figure: function(can, meta, target, cbs) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return } var input = meta.action||mdb.KEY; input != ice.AUTO && can.require(["/plugin/input/"+input+".js"], function(can) { can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]; target[key] = function(event) { on(event, can, meta, function(cb) { - can.sub? can.base.isFunc(cb) && cb(can.sub, cbs): can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, ["/plugin/input/"+input+".js"], function(sub) { sub.Conf(meta) - sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); (meta.run||can.run)(event, cmds, cb, true) }, can.sub = sub - sub.close = function() { can.page.Remove(can, sub._target), delete(can.sub) } + if (target._can) { return can.base.isFunc(cb) && cb(target._can, cbs) } + can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, ["/plugin/input/"+input+".js"], function(sub) { sub.Conf(meta) + sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); (meta.run||can.run)(event, cmds, cb, true) } + sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) }, target._can = sub can.onappend._action(sub, [cli.CLOSE, cli.CLEAR, cli.REFRESH], sub._action, kit.Dict( cli.REFRESH, function(event) { can.base.isFunc(cb) && cb(sub) }, @@ -395,7 +400,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, )), can.onappend._status(sub, [mdb.TOTAL, mdb.INDEX]) can.page.style(sub, sub._target, meta.style), can.onmotion.hidden(can, sub._target) - can.base.isFunc(cb) && cb(sub, function() { can.onmotion.hidden(can, sub._target, true), can.base.isFunc(cbs) && cbs(sub) }) + can.base.isFunc(cb) && cb(sub, function(sub, hide) { can.onmotion.hidden(can, sub._target, !hide), can.base.isFunc(cbs) && cbs(sub) }) }, document.body) }, target, last) } }) }) @@ -588,11 +593,10 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe key == chat.CARTE && can.page.Select(can, document.body, can.core.Keys(html.DIV, chat.CARTE), function(item) { can.page.Remove(can, item) }) - this._hash[key] && can.page.Remove(can, this._hash[key]._target) - }, - add: function(can, key, value) { - this.del(can, key), this._hash[key] = value + var last = this._hash[key]; if (!last) { return } + last.close? last.close(): can.page.Remove(can, last._target) }, + add: function(can, key, value) { return this.del(can, key), this._hash[key] = value }, auto: function(can, target, key) { var that = this var list = can.core.List(arguments).slice(2) if (list.length == 0) { list = [chat.CARTE, chat.INPUT] } @@ -749,6 +753,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe } can.onkeymap.prevent(event) }, selectTableInput: function(event, can, target, cb) { + if (target.value == "") { return cb() } if (event.ctrlKey) { function select(order) { if (order == 0) { target.value = target._value } var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { diff --git a/lib/misc.js b/lib/misc.js index cb81f8d8..42bd11fd 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -176,7 +176,7 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg Search: shy("请求参数", function(can, key, value) { var args = {} if (value == undefined && can.base.isString(key)) { var ls = location.pathname.split(ice.PS); if (ls[1] == chat.SHARE) { args[chat.SHARE] = ls[2] } - for (var i = 2; i < ls.length; i += 2) { if ({"pod": true, "cmd": true}[ls[i]]) { args[ls[i]] + ls[i+1] } } + for (var i = 2; i < ls.length; i += 2) { if ({"pod": true, "cmd": true}[ls[i]]) { args[ls[i]] = ls[i+1] } } } location.search && location.search.slice(1).split("&").forEach(function(item) { var x = item.split("=") x[1] != "" && (args[x[0]] = decodeURIComponent(x[1])) diff --git a/lib/page.js b/lib/page.js index 4f9cc264..65aaa93e 100644 --- a/lib/page.js +++ b/lib/page.js @@ -371,6 +371,8 @@ Volcanos("page", {help: "用户界面", ClassList: { for (var i = 2; i < arguments.length; i += 2) { if (typeof arguments[i] == lang.OBJECT) { can.base.Copy(value, arguments[i--]) + } else if (typeof arguments[i] == lang.UNDEFINED) { + continue } else { value[arguments[i]] = arguments[i+1] } diff --git a/lib/user.js b/lib/user.js index 770c09b0..88cd65d6 100644 --- a/lib/user.js +++ b/lib/user.js @@ -33,6 +33,8 @@ Volcanos("user", {help: "用户操作", agent: { 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), + isWeb: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0 && location.pathname.indexOf("/website/") > 0 || + location.pathname.indexOf("/chat/website/") == 0), }, alert: function(text) { alert(JSON.stringify(text)) }, @@ -105,6 +107,7 @@ Volcanos("user", {help: "用户操作", agent: { title: meta.title, content: meta.content, time: can.base.Time(), fileline: can.misc.FileLine(2, 2), })) + can.onmotion.float.add(can, chat.TOAST, action) return action }, share: function(can, msg, cmd) { @@ -230,7 +233,7 @@ Volcanos("user", {help: "用户操作", agent: { input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() } var msg = can.request(event) var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [ - {view: [chat.OPTION, html.TABLE], list: can.core.List(form, function(item) { + {view: [chat.OPTION, html.TABLE], list: can.core.List(form, function(item) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item item.type = item.type||(item.values? html.SELECT: item.name == html.TEXT? html.TEXTAREA: html.TEXT) @@ -249,16 +252,17 @@ Volcanos("user", {help: "用户操作", agent: { return {type: html.TR, list: [{type: html.TD, list: [{text: item._trans||can.user.trans(can, item.name)||""}]}, {type: html.TD, list: [can.page.input(can, item)]} ]} })}, {view: chat.ACTION}, - ]}]); + ]}]) + var layout = can.onlayout.figure(event, can, ui._target) if (layout.left == undefined) { if (!layout.top) { layout.top = 32 } - layout.left = window.innerWidth/2-ui._target.offsetWidth/2 - layout.right = "" + layout.left = window.innerWidth/2-ui._target.offsetWidth/2, layout.right = "" can.page.style(can, ui._target, layout) } can.page.ClassList.add(can, ui._target, chat.FLOAT) var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { + focus: function(event) { can.page.Select(can, ui.first, html.INPUT_ARGS)[0].focus() }, cancel: function(event) { can.page.Remove(can, ui._target) }, _engine: function(event, can, button) { action.submit(event, can, button) }, submit: function(event, can, button) { var data = {}, args = [], list = [] @@ -269,10 +273,7 @@ Volcanos("user", {help: "用户操作", agent: { can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel() }, _target: ui._target, }) - if (button === true) { - action.submit(event, can, "submit") - return action - } + if (button === true) { return action.submit(event, can, "submit"), action } can.page.Select(can, ui._target, html.INPUT_ARGS, function(item, index) { index == 0 && can.core.Timer(100, function() { can.onmotion.focus(can, item) }) diff --git a/page/index.css b/page/index.css index f10ade46..52d72815 100644 --- a/page/index.css +++ b/page/index.css @@ -90,8 +90,8 @@ td>input[type=button][name=stop] { background-color:red; } legend { box-shadow:4px 4px 20px 4px #626bd0; cursor:pointer; } fieldset { margin:0; border:0; padding:0; } -fieldset>form.option { float:left; display:contents; font-size:1.1rem; } -fieldset>form.option>div.item { float:left; margin-right:3px; height:2rem; min-height:25px; vertical-align:middle; } +fieldset>form.option { float:left; display:contents; } +fieldset>form.option>div.item { float:left; margin-right:3px; } fieldset>form.option>div.item>label { display:none; } fieldset>form.option>div.item input.args.char { width:20px; } fieldset>form.option>div.item input.args.tiny { width:40px; } @@ -104,8 +104,8 @@ fieldset>form.option>div.item input.args[name=offset] { width:48px; } fieldset>form.option>div.item input.args[name=offend] { width:48px; } fieldset>form.option>div.item.textarea { clear:both; margin-top:4px; } -fieldset>div.action { float:left; display:contents; font-size:1.1rem; } -fieldset>div.action>div.item { float:left; margin-right:3px; height:2rem; vertical-align:middle; } +fieldset>div.action { float:left; display:contents; } +fieldset>div.action>div.item { float:left; margin-right:3px; } fieldset>div.action>div.item.space { width:10px; } fieldset div.action>div.item>label { display:none; } fieldset>div.action>div.tabs { float:left; margin:0; padding:4px; cursor:pointer; } @@ -122,7 +122,7 @@ fieldset>div.status>div.item { float:left; padding:4px; height:18px; } fieldset.panel>legend { display:none; } fieldset.plugin { margin:10px; padding:10px; background-color:#061c3c9e; box-shadow:2px 2px 10px 4px #626bd0; } -fieldset.plugin>div.action { float:none; display:block; height:1.8rem; overflow:auto; } +fieldset.plugin>div.action { float:none; overflow:auto; } fieldset.plugin>div.status { border-top:1px solid darkcyan; } fieldset.output { margin:0; padding:0; } fieldset.output>legend { display:none; } @@ -240,18 +240,20 @@ body.white table.content tr:hover { background-color:green; } body.white fieldset.Action fieldset.plugin legend:hover { background-color:#6ee4e4; } body.print fieldset.River>div.output div.item.select { background-color:white; border:solid 2px red; } -body.mobile select { font-size:1.4rem; height:1.4rem; margin-top:3px; } +body.mobile select { font-size:1.4rem; height:1.8rem; } body.mobile legend { font-size:2rem; } body.mobile input { font-size:1.2rem; } -body.mobile input[type=text] { margin-top:5px; height:1.4rem; } +body.mobile input[type=text] { height:1.6rem; } body.mobile fieldset.Header.head { width:-webkit-fill-available; } -body.mobile fieldset.Header.head { background-color:#000000b8; font-size:2rem; height:2rem; position:fixed; top:0; } -body.mobile fieldset.Header.head div.output { height:2rem; } -body.mobile fieldset.Header.head>div.output>div { height:1.5rem; } -body.mobile fieldset.Header.head>div.output div.menu { height:1.5rem; } +body.mobile fieldset.Header.head { background-color:#000000b8; font-size:2rem; height:3rem; position:fixed; top:0; } +body.mobile fieldset.Header.head div.output { height:3rem; } +body.mobile fieldset.Header.head>div.output>div { height:2.2rem; } +body.mobile fieldset.Header.head>div.output div.menu { height:2.2rem; } body.mobile fieldset.Header.head div.state.time { display:none; } -body.mobile fieldset.River.left { position:fixed; top:2rem; background-color:#243950bf; min-width:240px; font-size:2rem; } +body.mobile fieldset.River.left { position:fixed; top:3rem; background-color:#243950bf; min-width:240px; font-size:2rem; } +body.mobile>div.carte div.item { font-size:2rem; } body.mobile fieldset.River>div.output div.list div.item { font-size:2rem; } +body.mobile fieldset.River>div.output div.item { font-size:2rem; } body.mobile fieldset.Action.main { margin-top:4rem; } body.mobile fieldset.Action.main.cmd { margin-top:0; margin-bottom:0; } body.mobile fieldset.Footer.foot { width:-webkit-fill-available; } diff --git a/page/index.js b/page/index.js index e4c196fe..4e3fce16 100644 --- a/page/index.js +++ b/page/index.js @@ -49,10 +49,10 @@ Volcanos({name: "chat", panels: [ }}, project: {name: "研发群", storm: { studio: {name: "研发 studio", list: [ - {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]}, + {name: "vimer", help: "编辑器", index: "web.code.vimer"}, {name: "repos", help: "代码库", index: "web.code.git.status"}, {name: "plan", help: "任务表", index: "web.team.plan"}, - {name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, + {name: "ctx", help: "上下文", index: "web.wiki.word"}, ]}, web: {name: "网页 web", list: [ {name: "HTML5", help: "浏览器", index: "web.wiki.word", args: ["usr/icebergs/misc/chrome/chrome.shy"]}, diff --git a/panel/action.css b/panel/action.css index d4270c05..4b032ec0 100644 --- a/panel/action.css +++ b/panel/action.css @@ -59,7 +59,6 @@ fieldset.panel.cmd>div.output>fieldset.plugin { } fieldset.panel.cmd>div.output>fieldset.plugin>legend { float:left; padding:0 10px; margin-right:3px; - height:25px; background-color:darkcyan; cursor:pointer; } diff --git a/panel/action.js b/panel/action.js index 3f8ae47c..dd1108ef 100644 --- a/panel/action.js +++ b/panel/action.js @@ -165,7 +165,7 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, t can.getActionSize(function(height, width) { var m = parseInt(data.m)||2, n = parseInt(data.n)||2 can.page.css(can.base.replaceAll(chat.ACTION_LAYOUT_FMT, "_width", (width-(4*m+1)*html.PLUGIN_MARGIN)/m+"px", "_height", (height-(4*n+1)*html.PLUGIN_MARGIN)/n+"px")) }) - }, true) + }, slient) } can.onlayout._init(can) }, @@ -189,14 +189,16 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: functio " ": function(event, can, target) { can.onengine.signal(can, "onsearchfocus") + can.onkeymap.prevent(event) }, ":": function(event, can, target) { can.onengine.signal(can, "oncommandfocus") + can.onkeymap.prevent(event) }, enter: function(event, can, target) { can.misc.Log("enter") }, escape: function(event, can, target) { can.page.Select(can, document.body, html.FIELDSET_AUTO, function(item) { - can.onmotion.hidden(can, item) + // can.onmotion.hidden(can, item) }) can.page.Select(can, document.body, can.page.Keys(html.FIELDSET_FLOAT, html.DIV_FLOAT), function(item) { can.page.Remove(can, item) diff --git a/panel/footer.js b/panel/footer.js index b0530144..f9fd4a54 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -56,6 +56,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) { + if (can.user.mod.isPod) { + can.onmotion.hidden(can, can._target) + } else if (can.user.isMobile) { + can.onmotion.hidden(can, can._target) + } else if (can.user.isExtension) { + can.onmotion.hidden(can, can._target) + } can.base.isFunc(cb) && cb() }, onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) }, diff --git a/panel/header.js b/panel/header.js index ee89b67b..399d745c 100644 --- a/panel/header.js +++ b/panel/header.js @@ -13,15 +13,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.base.isFunc(cb) && cb(msg) }, _agent: function(can, msg, target) { - if (can.user.mod.isPod) { - can.onaction.River(can) - can.onaction.Footer(can) - } else if (can.user.isMobile) { - can.onaction.River(can) - can.onaction.Footer(can) - } else if (can.user.isExtension) { - can.onaction.River(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) }) }) @@ -75,7 +66,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar"}) }, _menus: function(can, msg, target) { - can.setHeaderMenu(can.user.mod.isPod||can.user.isMobile||can.user.isExtension? [chat.RIVER]: + can.setHeaderMenu(can.user.mod.isPod||can.user.isMobile||can.user.isExtension? []: can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), can.onaction._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)) }) @@ -125,9 +116,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) { can.base.isFunc(cb) && cb() }, - _menus: [["setting", chat.BLACK, chat.WHITE, chat.PRINT, "webpack", "devpack", "toimage"]], + _menus: [["setting", chat.BLACK, chat.WHITE, chat.PRINT, "webpack", "devpack", "toimage", "refresh"]], _trans: { - "river": "菜单", "search": "搜索", "create": "创建", "share": "共享", @@ -140,6 +130,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, t "shareuser": "共享用户", "setnick": "设置昵称", + "password": "修改密码", "language": "语言地区", "chinese": "中文", "clear": "清除背景", @@ -148,9 +139,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, t function init() { can.run({}, [], function(msg) { can.base.Copy(can.onaction._trans, can.base.Obj(msg.Option(chat.TRANS), {})) can.onimport._init(can, msg, function(msg) { can.onengine.signal(can, chat.ONLOGIN, msg) }, can._output) - - can.search({}, ["River.onmotion.toggle"]) - }) }; can.search({}, ["River.onmotion.hidden"]) + }) } if (can.misc.Search(can, ice.MSG_SESSID)) { can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)) return can.misc.Search(can, ice.MSG_SESSID, "") @@ -174,7 +163,6 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, t }) can.user.jumps(can.misc.MergeURL(can, args, true)) }, - river: function(event, can) { can.onaction.River(can) }, black: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) }, white: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) }, @@ -199,6 +187,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, t }) }, toimage: function(event, can, button) { can.onmotion.toimage(event, can, document.title, document.body) }, + refresh: function(event, can, button) { can.onlayout._init(can) }, carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb) }, share: function(event, can, args) { @@ -207,7 +196,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, t }, usernick: function(event, can) { - can.onaction.carte(event, can, ["shareuser", "setnick", [aaa.LANGUAGE, aaa.CHINESE, aaa.ENGLISH], cli.CLEAR, aaa.LOGOUT]) + can.onaction.carte(event, can, ["shareuser", "setnick", "password", [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, mdb.TYPE, aaa.LOGIN]) }, setnick: function(event, can) { @@ -220,13 +209,24 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, t }) can.user.isMobile && can.page.Modify(can, ui._target, {style: {top: 40, right: 0, left: ""}}) }, + password: function(event, can) { + var ui = can.user.input(event, can, [{type: html.PASSWORD, action: ice.AUTO}, {type: html.PASSWORD, action: ice.AUTO}], function(ev, button, data, list, args) { + if (list[0] != list[1]) { + can.user.toast(can, "密码不一致") + ui.focus() + return true + } + + can.run(event, [aaa.PASSWORD, list[0]], function(msg) { + can.user.toastSuccess(can) + }, true) + }) + can.user.isMobile && can.page.Modify(can, ui._target, {style: {top: 40, right: 0, left: ""}}) + }, chinese: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "zh") }, english: function(event, can) { can.misc.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"]) }, - Footer: function(can) { can.search({}, ["Footer.onmotion.toggle"]) }, }) Volcanos("onexport", {help: "导出数据", list: [], height: function(can) { return can._target.offsetHeight }, diff --git a/panel/river.js b/panel/river.js index a7787efc..79172fa5 100644 --- a/panel/river.js +++ b/panel/river.js @@ -69,6 +69,16 @@ Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, c }), can.base.isFunc(cb) && cb(msg); return true }}) Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, cb, target) { + if (can.user.mod.isWeb) { + + } else if (can.user.mod.isPod) { + can.onmotion.hidden(can, can._target) + } else if (can.user.isExtension) { + can.onmotion.hidden(can, can._target) + } else if (can.user.isMobile) { + can.onmotion.hidden(can, can._target) + } + can.onengine.plugin(can, "info", shy("信息", {}, ["text", "list", "back"], function(msg, cmds) { msg.Echo(JSON.stringify(can)) })) @@ -198,6 +208,7 @@ Volcanos("ondetail", {help: "菜单交互", }, "创建空间": function(event, can, button, river, storm) { can.request(event, {action: button}) can.user.input(event, can, [{name: "name", value: "hi"}, {name: "repos"}, {name: "template"}], function(event, button, data, list, args) { + can.request(event, {_toast: "创建中..."}) can.run(event, [ctx.ACTION, cli.START].concat(args, chat.RIVER, river), function(msg) { var link = can.misc.MergeURL(can, {_path: "/chat/pod/"+can.core.Keys(can.misc.Search(can, ice.POD), msg.Option(mdb.NAME))}) can.user.toast(can, link), can.user.open(link) diff --git a/panel/search.js b/panel/search.js index 5fca44ca..d20a67a0 100644 --- a/panel/search.js +++ b/panel/search.js @@ -105,6 +105,7 @@ Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DON sub.run = function(event, cmds, cb) { var msg = can.request(event) can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) } + sub.Focus() }, can.ui.profile) }, }) diff --git a/plugin/input.js b/plugin/input.js index 47bb6b54..0f983ab5 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -14,7 +14,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, refresh: function(event, can) { can.run(event) }, onclick: function(event, can) { - if (can.Conf(mdb.TYPE) == html.BUTTON) { can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) } + can.Conf(mdb.TYPE) == html.BUTTON && can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) }, onchange: function(event, can) { if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) } diff --git a/plugin/input/date.css b/plugin/input/date.css index 6de461cd..20537106 100644 --- a/plugin/input/date.css +++ b/plugin/input/date.css @@ -8,6 +8,6 @@ fieldset.input.date div.output td.next { color:gray; } fieldset.input.date div.output td { - padding:2px 12px; + padding:2px 11px; } diff --git a/plugin/input/date.js b/plugin/input/date.js index c735d9ef..5ebbc02f 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -3,20 +3,21 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e // 添加控件 var now = target.value? new Date(target.value): new Date() + can._trans = {"today": "今天", "next": "下一月", "prev": "上一月"} can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE, ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), - "今天", "", "上一月", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), - ["month"].concat(can.core.List(1, 13)), "下一月", + "today", "", "prev", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), + ["month"].concat(can.core.List(1, 13)), "next", ], can._action, { close: function(event) { can.close() }, "hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) }, "minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) }, "second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) }, - "今天": function(event) { now = new Date(), set(show(now)) }, + "today": function(event) { now = new Date(), set(show(now)) }, - "上一月": function(event) { now.setMonth(now.getMonth()-1), show(now) }, + "prev": function(event) { now.setMonth(now.getMonth()-1), show(now) }, "year": function(event, can, key, value) { now.setFullYear(parseInt(value)), show(now) }, "month": function(event, can, key, value) { now.setMonth(parseInt(value)-1), show(now) }, - "下一月": function(event) { now.setMonth(now.getMonth()+1), show(now) }, + "next": function(event) { now.setMonth(now.getMonth()+1), show(now) }, "随机": function(event) { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) }, "前一年": function(event) { now.setFullYear(now.getFullYear()-1), show(now) }, diff --git a/plugin/input/key.js b/plugin/input/key.js index b4f4815d..c11af2e6 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,57 +1,45 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { - _init: function(can, msg, target) { var call = arguments.callee + _init: function(can, msg, target) { var call = arguments.callee; target._msg = msg can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) { return {text: [value, html.TD], onclick: function(event) { target.value = line[key] if (msg.Option(ice.MSG_PROCESS) != ice.PROCESS_AGAIN) { return can.close() } - can.run(event, [ctx.ACTION, mdb.INPUTS, can.Conf(mdb.NAME), target.value], function(msg) { - call(can, msg, target) - }) + can.run(event, [ctx.ACTION, mdb.INPUTS, can.Conf(mdb.NAME), target.value], function(msg) { call(can, msg, target) }) }} - }) + }), can.Status(mdb.TOTAL, msg.Length()), can.onmotion.hidden(can, can._target, msg.Length() > 0) }, - _show: function(can, meta, cbs, target) { - can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - if (msg.Length() == 0) { return can.close() } - target._can && target._can.close(), target._can = can - can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) - target._msg = msg, can.base.isFunc(cbs) && cbs(can) + _show: function(event, can, name, cbs, target, value) { + can.run(event, [ctx.ACTION, mdb.INPUTS, name, value||target.value], function(msg) { + can.onfigure.key._init(can, msg, target), can.base.isFunc(cbs) && cbs(can, msg.Length() == 0) }) - }, onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) { target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)}) - can.onfigure.key._show(can, meta, cbs, target), can.onmotion.focus(can, target) - target.click() + can.onfigure.key._show(event, can, meta.name, cbs, target), can.onmotion.focus(can, target) }) }, onblur: function(event, can, meta, cb, target) { - can.core.Timer(100, function() { - delete(target._figure), target._can && target._can.close() - }) + can.onmotion.delay(can, function() { delete(target._figure), target._can && target._can.close() }) }, onclick: function(event, can, meta, cb, target) { if (target._figure) { target._figure = can.onlayout.figure(event, can, can.core.Value(target, "_can._target")||{}); return } target._figure = {}; cb(function(can, cbs) { target._figure = can.onlayout.figure(event, can) - can.onfigure.key._show(can, meta, cbs, target) + can.onfigure.key._show(event, can, meta.name, cbs, target), can.onmotion.focus(can, target) }) }, - onkeydown: function(event, can, meta, cb, target, last) { - if (target._figure && target._can) { can = target._can - switch (event.key) { case lang.ENTER: can.close(); return } - can.onmotion.selectTableInput(event, can, target, function() { - can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) - target._msg = msg - }) - }) - } + onkeydown: function(event, can, meta, cb, target, last) { var sub = target._can switch (event.key) { - case lang.ESCAPE: event.target.blur(); return + case lang.SHIFT: break + case lang.CONTROL: break + case lang.ENTER: sub.close(); break + case lang.ESCAPE: event.target.blur(); break + case lang.PS: can.onfigure.key._show(event, sub, meta.name, null, target, target.value+ice.PS); break case lang.TAB: - if (event.target.tagName == "TEXTAREA") { - can.onkeymap.insertText(event.target, "\t") - can.onkeymap.prevent(event) - return + if (can.page.tagis(html.TEXTAREA, target)) { + can.onkeymap.insertText(event.target, "\t"), can.onkeymap.prevent(event) + break } + default: + can.onmotion.selectTableInput(event, sub, target, function() { + can.onfigure.key._show(event, sub, meta.name, null, target) + }), can.base.isFunc(last) && last(event, can) } - can.base.isFunc(last) && last(event, can) }, }}) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index dd5ce024..5590a45d 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -86,7 +86,7 @@ fieldset.inner>div.output div.profile>div.output>fieldset { margin:0; padding:0; } fieldset.inner>div.output div.profile>div.output>fieldset>legend { - float:left; + float:left; padding:0.3rem; } fieldset.inner>div.output div.display>div.output { clear:both; overflow:auto; diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 5f1720a4..8a678c84 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -159,7 +159,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, plugin: function(can, meta, target, cb) { can.onappend.plugin(can, meta, function(sub) { - sub.run = function(event, cmds, cb) { + sub.run = function(event, cmds, cb) { can.request(event, can.Option()) can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) }, can.base.isFunc(cb) && cb(sub) }, target) @@ -179,15 +179,14 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target if (can.page.ClassList.has(can, can._fields, "full")) { can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight) } else { - can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT) + can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT-2) } can.page.Select(can, can.ui.profile_output, html.IFRAME, function(item) { can.page.style(can, item, html.HEIGHT, can.ui.profile_output.offsetHeight-4, html.WIDTH, can.ui.profile_output.offsetWidth-5, "margin-left", "-10px", "margin-top", "-10px", - "position", "absolute", - "border", "0" + "position", "absolute", "border", "0" ) }) }, @@ -279,17 +278,21 @@ Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target _insert: function(event, can) {}, _mode: { plugin: { - Escape: function(event, can) { can.onaction["清屏"](event, can) }, - g: function(event, can) { can.onaction["搜索"](event, can) }, - f: function(event, can) { can.onaction["打开"](event, can) }, - t: function(event, can) { can.onaction["添加"](event, can) }, - p: function(event, can) { can.onaction["插件"](event, can) }, - e: function(event, can) { can.onaction["扩展"](event, can) }, + Escape: function(event, can) { can.actions(event, "清屏") }, + g: function(event, can) { can.actions(event, "搜索") }, + f: function(event, can) { can.actions(event, "打开") }, + t: function(event, can) { can.actions(event, "添加") }, + p: function(event, can) { can.actions(event, "插件") }, + e: function(event, can) { can.actions(event, "扩展") }, - q: function(event, can) { can.onaction["全屏"](event, can) }, - r: function(event, can) { can.onaction["执行"](event, can) }, - v: function(event, can) { can.onaction["展示"](event, can) }, - s: function(event, can) { can.onaction["保存"](event, can) }, + m: function(event, can) { can.actions(event, "autogen") }, + c: function(event, can) { can.actions(event, "compile") }, + w: function(event, can) { can.actions(event, "website") }, + + r: function(event, can) { can.actions(event, "执行") }, + v: function(event, can) { can.actions(event, "展示") }, + // s: function(event, can) { can.actions(event, "保存") }, + a: function(event, can) { can.actions(event, "全屏") }, j: function(event, can) { can.current.scroll(1) }, k: function(event, can) { can.current.scroll(-1) }, diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 2a533c2a..3b11b8a0 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -124,7 +124,8 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], }, }, _engine: {}, }) -Volcanos("onaction", {help: "控件交互", list: ["加载", nfs.SAVE, "autogen", "compile", "binpack", "刷新"], +Volcanos("onaction", {help: "控件交互", list: ["autogen", "compile", "website"], + _trans: {website: "网页"}, "刷新": function(event, can) { can.onimport.tabview(can, "src/", "main.go", "", function() {}, true) }, @@ -149,7 +150,7 @@ Volcanos("onaction", {help: "控件交互", list: ["加载", nfs.SAVE, "autogen" }, true) }) }, - compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."}) + compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."}, can.Option()) can.run(event, [ctx.ACTION, button], function(msg) { if (msg.Length() == 0) { var toast = can.user.toast(can, "重启中...", "", -1) can.core.Timer(5000, function() { toast.close(), can.onaction["展示"]({}, can) }) @@ -158,6 +159,11 @@ Volcanos("onaction", {help: "控件交互", list: ["加载", nfs.SAVE, "autogen" } }, true) }, + website: function(event, can, button) { can.request(event, {action: button}) + can.user.input(event, can, [{name: nfs.FILE, value: "hi.txt"}], function(ev, btn, data, list, args) { + can.onimport.tabview(can, "src/", "website/"+list[0], "", function() {}, true) + }) + }, _selectLine: function(event, can) { can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current) diff --git a/plugin/state.js b/plugin/state.js index 42e8a723..5201bdf0 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -72,13 +72,18 @@ 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.Update(event, [ctx.ACTION, button].concat(can.Input([], true))) }, + "刷新页面": function(event, can) { + var sub = can.core.Value(can._outputs, "-1"), msg = sub._msg + can.core.CallFunc([sub, chat.ONIMPORT, "_init"], {can: sub, msg: msg, list: msg.result||msg.append||[], cb: function(msg) { + }, target: can._output}) + }, "共享工具": function(event, can) { var meta = can.Conf() can.onmotion.share(event, can, [{name: chat.TITLE, value: meta.name}, {name: chat.TOPIC, values: [cli.WHITE, cli.BLACK]}], [ mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)), diff --git a/proto.js b/proto.js index a0a88871..63d449f2 100644 --- a/proto.js +++ b/proto.js @@ -73,6 +73,7 @@ var web = { SPACE: "space", SHARE: "share", } var aaa = { + PASSWORD: "password", USERNAME: "username", USERNICK: "usernick", BACKGROUND: "background", AVATAR: "avatar", LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese", LOGIN: "login", LOGOUT: "logout", INVITE: "invite", @@ -239,6 +240,8 @@ var lang = { STRING: "string", NUMBER: "number", OBJECT: "object", FUNCTION: "function", ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab", + CONTROL: "Control", SHIFT: "Shift", + PS: "/", } function shy(help, meta, list, cb) { var index = 0, args = arguments; function next(type) { @@ -313,6 +316,7 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: }): can.core.Item(can.base.isFunc(option)? option(): option, set) }); return msg }, + actions: function(event, button) { can.run(event, [ctx.ACTION, button], null, true) }, search: function(event, cmds, cb) { if (cmds && typeof cmds == lang.OBJECT && cmds.length > 0 && typeof cmds[0] == lang.OBJECT && cmds[0].length > 0 ) {