diff --git a/frame.js b/frame.js index 9ea0843c..7e0114e3 100644 --- a/frame.js +++ b/frame.js @@ -10,7 +10,7 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list, can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host) can.core.Next(list, function(item, next) { item.type = chat.PANEL - can.onappend._init(can, can.base.Copy(item, can.core.Value(can._root, [chat.RIVER, item.name])), item.list, function(panel) { + can.onappend._init(can, can.base.Copy(item, can.core.Value(can, [chat.RIVER, item.name])), item.list, function(panel) { panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds||[] return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb) }, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction && panel.onaction._trans||{} @@ -84,7 +84,7 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list, } var p = can.onengine.plugin.meta[cmds[0]], n = 1; if (p) { if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { n = 3 } else if (p.meta && p.meta[cmds[0]]) { n = 2 } - return can.core.CallFunc(p, {can: p.can||panel, msg: msg, cmds: cmds.slice(n), cb: cb}), true + return can.core.CallFunc(p, {can: p.can||panel, msg: msg, arg: cmds.slice(n), cmds: cmds.slice(n), cb: cb}), true } return false }, @@ -140,6 +140,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } can.page.Select(can, status, [[[html.DIV, key], html.SPAN]], function(item) { + if (value && value.indexOf && value.indexOf("http") == 0) { value = can.page.Format(html.A, value) } return value == undefined? (value = item.innerHTML): (item.innerHTML = value) }); return value }, @@ -285,6 +286,8 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, }, _status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status) can.core.List(can.base.Obj(list, can.core.Value(can, [chat.ONEXPORT, mdb.LIST])), function(item) { item = can.base.isObject(item)? item: {name: item} + + if (item.value && item.value.indexOf && item.value.indexOf("http") == 0) { item.value = can.page.Format(html.A, item.value) } can.page.Append(can, status, [{view: can.base.join([html.ITEM, item.name]), title: item.name, list: [ {text: [item.name, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value||"")+"", html.SPAN, item.name]}, ], onclick: function(event) { can.user.copy(event, can, item.value) }}]) @@ -373,7 +376,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, return (code.scrollBy && code.scrollBy(0, 10000)), code }, - _plugin: function(can, value, meta, cb, target) { + _plugin: function(can, value, meta, cb, target, field) { meta.feature = can.base.getValid(meta.feature, can.base.Obj(value.meta))||{} meta.inputs = can.base.getValid(meta.inputs, can.base.Obj(value.list))||[] meta.args = can.base.getValid(can.base.Obj(meta.args), can.base.Obj(meta.arg), can.base.Obj(value.args), can.base.Obj(value.arg))||[] @@ -389,19 +392,19 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, can.onappend._init(can, meta, [chat.PLUGIN_STATE_JS], function(sub, skip) { sub._index = value.index||meta.index sub.run = function(event, cmds, cb) { can.runActionCommand(event, sub._index, cmds, cb) } can.base.isFunc(cb) && cb(sub, meta, skip) - }, target||can._output) + }, target||can._output, field) }, - plugin: function(can, meta, cb, target) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd) + plugin: function(can, meta, cb, target, field) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd) var p = can.onengine.plugin.meta[meta.index], res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) } - (meta.meta || meta.inputs && meta.inputs.length > 0)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target): + (meta.meta || meta.inputs && meta.inputs.length > 0)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target, field): p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) { sub.run = function(event, cmds, cb) { var _cb = p, n = 0 if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { _cb = p.meta[cmds[1]], n = 2 } else if (p.meta && p.meta[cmds[0]]) { _cb = p.meta[cmds[0]], n = 1 } can.core.CallFunc(_cb, {can: sub, msg: can.request(event), cmds: cmds.slice(n), cb: cb}) } can.base.isFunc(cbs) && cbs(sub, meta, skip) - }, target): /* 后端命令 */ can.runAction(can.request({}, meta), ctx.COMMAND, [meta.index], function(msg) { msg.Table(function(value) { - can.onappend._plugin(can, value, meta, cbs, target) + }, target, field): /* 后端命令 */ can.runAction(can.request({}, meta), ctx.COMMAND, [meta.index], function(msg) { msg.Table(function(value) { + can.onappend._plugin(can, value, meta, cbs, target, field) }) }) return res }, diff --git a/page/index.css b/page/index.css index 429449cc..c6f400b0 100644 --- a/page/index.css +++ b/page/index.css @@ -35,7 +35,7 @@ table.content thead { position:sticky; top:2px; } table.content th { background-color:steelblue; padding:2px 6px; } table.content td { padding:2px 6px; } table.content.action th:last-child { position:sticky; right:0; } -table.content.action td:last-child { background-color:skyblue; position:sticky; right:0; } +table.content.action td:last-child { background-color:steelblue; position:sticky; right:0; } div.code { background-color:#343a3445; color:white; padding:10px; border:solid 2px green; } div.story[data-type=spark] { background-color:#2169a9a6; color:white; padding:5px 10px; border-left:solid 5px blue; margin:10px; } @@ -47,14 +47,17 @@ div.output div.project div.list { margin-left:10px; } div.output div.project div.switch { width:12px; float:left; transform: rotate(90deg) translate(1px, 0px); } div.output div.project div.switch.open { transform: rotate(180deg) translate(-4px, 4px); } div.output div.project div.zone>div.name { background-color:steelblue; color:white; text-align:center; padding:5px; clear:both; } -div.output div.project div.item>div.name { padding-left:16px; } +div.output div.project div.item>div.name { padding-left:20px; } div.output div.project div.zone>div.action>div.item { float:right; clear:none; padding:0; margin:0; } div.output div.project div.zone>div.action>div.item input[type=text] { background-color:#ff000000; padding-left:10px; color:white; } fieldset.plugin { background-color:#061c3c9e; padding:10px; margin:10px; } fieldset.float { background-color:#0e3369b3; position:absolute; } +fieldset.full { background-color:#073947f2; padding:0; margin:0; left:0; top:0; overflow:auto; } fieldset.story>legend { margin:10px 0; } fieldset.plug>legend { float:left; margin-right:5px; } +fieldset.float>legend { float:left; margin-right:5px; } +fieldset.full>legend { float:left; margin-right:5px; } fieldset.float input[type=button][name=close]{ display:block; } fieldset.plug>form.option input[type=button][name=close]{ display:block; } fieldset.full input[type=button][name=close]{ display:block; } @@ -117,13 +120,13 @@ svg { font-family:monospace; } form.option, div.action { display:contents; } .hide, .hidden, form.option>div.item>label, div.action>div.item>label, fieldset.panel>legend, fieldset.output>legend, fieldset.input>legend { display:none; } div.output, div.status, div.content, div.project div.item, div.item.textarea, div.code, div.story[data-type=spark], p.story, h1, h2, h3 { clear:both; } -form.option, form.option>div.item, div.action, div.action>div.item, div.action>div.tabs, div.project, div.status>div.item, fieldset.float>legend { float:left; } +form.option, form.option>div.item, div.action, div.action>div.item, div.action>div.tabs, div.project, div.status>div.item { float:left; } div.code, div.story, div.action, div.output, div.status, div.project, div.content, div.profile, div.display, table.content, table.content td, body>div.toast { overflow:auto; } div.code, div.story, div.item, div.content, table.content, textarea { white-space:pre; } div.code, div.story, div.item { text-align:left; } /* position cursor */ -fieldset.full fieldset.float, fieldset.input, body>div.toast, body>div.carte, body>div.input, body>div.upload { position:fixed; z-index:10; } +fieldset.full, fieldset.float, fieldset.input, body>div.toast, body>div.carte, body>div.input, body>div.upload { position:fixed; z-index:10; } legend, select, input[type=button], div.item, div.tabs, th, td, h1, h2, h3 { cursor:pointer; } div.title, div.story[data-type=spark] { cursor:copy; } @@ -154,11 +157,13 @@ div.project::-webkit-scrollbar { width:0 !important; height:0 !important; } div.content::-webkit-scrollbar { width:0 !important; height:0 !important; } /* table card */ -div.output.card div.item { padding:10px; border:solid 1px #e7e7e7; margin:10px; height:120px; width:240px; float:left; } +div.output.card div.item { padding:10px; border:solid 1px #e7e7e7; margin:10px; width:240px; float:left; } div.output.card div.item>div.title { font-size:1.2rem; font-weight:bold; padding:10px; border-bottom: solid 1px #e7e7e7; } -div.output.card div.item>div.content { padding:10px; height:24px; } +div.output.card div.item>div.content { padding:10px; height:45px; } +body.white div.output.card div.item input[type=button] { background-color:#ff000000; } div.output.card div.item.stop { color:gray; } +/* white */ body.white { background-color:rgba(5,34,56,0.75); color:white; } body.white select { background-color:yellowgreen; color:white; } body.white textarea { background-color:white; } @@ -178,13 +183,14 @@ body.white fieldset.panel.Action div.action { color:white; } body.white fieldset.plugin { background-color:#ffffffa1; } body.white fieldset.full { background-color:#cce0f4eb; color:white; } -/* hover */ +/* white hover */ body.white legend:hover { background-color:skyblue; } body.white select:hover { background-color:#99cc667d; } body.white input[type=text]:hover { background-color:cyan; } body.white input[name=cmd]:hover { background-color:white; color:black; } body.white input[type=button]:hover { background-color:#1b7acc8c; } body.white table.content tr:hover { background-color:#4682b46b; } +body.white table.content.action td:last-child { background-color:skyblue; } body.white h1:hover { background-color:#4682b46b; } body.white h2:hover { background-color:#4682b46b; } body.white h3:hover { background-color:#4682b46b; } @@ -193,7 +199,8 @@ body.white table.content td:hover { background-color:#6495ed63; } body.white table.content td.select { background-color:#6495ed63; } body.white div.item:hover { background-color:#4682b46b; } body.white div.item.select { background-color:#4682b46b; } - + +/* print */ body.print { background-color:white; color:black; } body.print legend, body.print select, body.print input, body.print input[type=button] { background-color:lightgray; color:black; box-shadow:0px 0px 0px 0px #626bd0; } body.print table.content th { background-color:lightgray; } @@ -208,20 +215,19 @@ body.print fieldset.panel { background:white; color:black; } body.print fieldset.draw div.output div.content svg { background-color:lightgray; } body.print fieldset.draw div.output { background-color:lightgray; } -body.mobile textarea { font-size:1.2rem; } body.mobile legend { font-size:1.6rem; height:38px; } -body.mobile select { font-size:1.4rem; height:38px; } +body.mobile select { font-size:1.4rem; height:38px; border-radius:0; margin-right:10; } +body.mobile textarea { font-size:1.2rem; border-radius:0; } +body.mobile input[type=text] { font-size:1.2rem; height:38px; border-radius:0; margin-right:5px; } +body.mobile input[type=button] { font-size:1.2rem; height:38px; border-radius:0; } body.mobile fieldset.float input[type=button] { font-size:1.4rem; height:38px; } -body.mobile input[type=button] { height:31px; margin-top:-2px; } -body.mobile input[type=text] { padding-top:3px; height:31px; } +body.mobile table.layout div.toggle { font-size:48px; } body.mobile table.content th { padding:6px 6px; } body.mobile form.option>div.item { margin:0; height:38px; } body.mobile div.action>div.item { margin:0; height:38px; } -body.mobile div.output div.code { font-size:12px; } body.mobile fieldset.word.float>div.output>div.project { top:38px; } - -body.mobile>div.carte div.item { font-size:2rem; } +body.mobile>div.carte div.item { font-size:1.6rem; } body.mobile>div.input.login input { font-size:1.4rem; } body.mobile>div.input.login input[name=username] { width:264px; } body.mobile>div.input.login input[name=password] { width:264px; } @@ -233,9 +239,9 @@ body.mobile fieldset.Header.head div.output { height:3rem; } body.mobile fieldset.Header.head div.state.time { display:none; } body.mobile fieldset.Header.head div.search>input { height:38px; } body.mobile fieldset.Header.head div.output div { height:38px; } -body.mobile fieldset.River.left { background-color:#243950bf; font-size:2rem; min-width:240px; position:fixed; top:3rem; z-index:10; } +body.mobile fieldset.River.left { background-color:#243950bf; font-size:1.6rem; min-width:240px; position:fixed; top:3rem; z-index:10; } body.mobile fieldset.River>div.output { width:320px; } -body.mobile fieldset.River>div.output div.item { font-size:2rem; } +body.mobile fieldset.River>div.output div.item { font-size:1.6rem; } body.mobile fieldset.Action.main { margin-top:3rem; margin-bottom:3rem; } body.mobile fieldset.Action.main.cmd { margin-top:0; margin-bottom:0; } body.mobile fieldset.Footer.foot { width:-webkit-fill-available; } @@ -251,20 +257,23 @@ body.mobile.landscape fieldset.Action.main { margin-top:0; margin-bottom:0; } body.mobile.landscape fieldset.Footer.foot { position:unset; } body.mobile.landscape fieldset.Footer.foot input[name=cmd] { width:240px; } -body.mobile div.output.card div.item { height:160px; float:none; } -body.mobile.landscape div.output.card div.item { width:auto; float:left; } -body.mobile.landscape.simple div.output.card div.item { width:auto; float:left; } - body.mobile fieldset.draw.spide div.action { display:none; } body.mobile fieldset.draw.trend div.action { display:none; } body.mobile.landscape fieldset.draw.spide div.action { display:block; } body.mobile.landscape fieldset.draw.trend div.action { display:block; } +body.mobile div.output.card div.item { height:160px; float:none; } +body.mobile.landscape div.output.card div.item { width:auto; float:left; } +body.mobile.landscape.simple div.output.card div.item { width:auto; float:left; } /* misc */ body.mobile.simple div.output.card div.item { width:-webkit-fill-available; } fieldset.panel.Search div.story[data-type=spark] { padding:0px; margin:0px; } fieldset.panel.Action.cmd>div.toggle.project { display:none; } fieldset.plugin.config form.option input[name=key] { width:240px; } +fieldset.plugin.parse.cmd>legend { display:none; } +fieldset.plugin.parse.cmd>form.option { display:none; } +fieldset.plugin.parse.cmd>div.action { display:none; } +fieldset.plugin.parse.cmd>div.status { display:none; } body.mobile fieldset.plan>div.action { display:none; } body.white fieldset.panel.Search a { color:yellow; } body.black a { color:yellow; } @@ -301,6 +310,7 @@ body.white.simple>div.carte div.item { background-color:white; color:black; } body.white.simple div.carte div.item:hover { background-color:#e3e6f1; } body.white.simple fieldset.plugin div.output.json div.item span { color:black; } body.white.simple fieldset.plugin div.output.json div.item span.key { color:blue; } +body.white.simple fieldset.plugin div.output.json div.item span.nonce { color:lightgray; } body.white.simple div.output.card input[type=button] { background-color:#0152d9; font-size:0.8rem; padding:5px 10px; box-shadow:2px 2px 6px 1px gray; } body.white.simple div.output.card input[type=button]:hover { box-shadow:2px 2px 8px 2px gray; } body.white.simple div.output div.project div.zone>div.action>div.item input[type=text] { color:black; } diff --git a/panel/action.css b/panel/action.css index 95b95bd5..ec1788f1 100644 --- a/panel/action.css +++ b/panel/action.css @@ -12,9 +12,6 @@ fieldset.Action.free>div.output fieldset.plugin { position:absolute; } fieldset.Action.free>div.output fieldset.plugin.select { display:block; } fieldset.Action.flow>div.output fieldset.plugin { float:left; } -fieldset.Action>div.output fieldset.full { background-color:#073947f2; padding:0; margin:0; position:fixed; left:0; top:0; overflow:auto; z-index:10; } -fieldset.Action>div.output fieldset.full>legend { margin:0px; float:left; } - fieldset.panel.cmd>div.output>fieldset.plugin { padding:0; margin:0; } fieldset.panel.cmd>div.output>fieldset.plugin>legend { padding:0 10px; margin-right:3px; float:left; } @@ -23,3 +20,97 @@ fieldset.Action>div.project.toggle { border-top-right-radius:20px; border-bottom-right-radius:20px; } +div.head { background-color:#404040; color:white; padding:5px; height:42px; clear:both; } +div.head div.username { float:right; margin-right:10px; } +div.head div.username div.name { padding:10px; float:left; } +div.head div.username div.icon { float:left; } +div.head div.username img { height:42px; } +div.head div.menu { cursor:pointer; padding:10px; float:left; } +div.head>div.menu:hover { background-color:#323232; } +div.left { background-color:#323232; width:160px; padding:20px; overflow:auto; float:left; } +div.left div.item { background-color:#323232; color:white; padding:5px 10px; } +div.left div.item:hover { background-color:#404040; } +div.left div.username div { color:white; text-align:center; padding:10px; } +div.left div.username img { width:120px; } +div.main iframe { border:0; } +div.main input[type=button] { padding:0 20px; } +div.main { background-color:#cccccc; color:black; overflow:auto; float:left; } +div.main fieldset.plugin { background-color:#f8f8f8; padding:10px; margin:10px; } +div.main fieldset.plugin legend { margin-bottom:10px; display:block; float:left; } +div.main fieldset.plugin select { outline:none; box-shadow:none; } +div.main fieldset.plugin form.option { display:block; clear:both; } +div.main fieldset.plugin form.option div.item { margin:5px; } +div.main fieldset.plugin div.action div.item { margin:5px; } +div.main fieldset.plugin table.content tr { border:solid 1px lightgray; } +div.main fieldset.plugin table.content tr:hover { background-color:whitesmoke; } +div.main fieldset.plugin table.content th { background-color:whitesmoke; padding:10px; } +div.main fieldset.plugin table.content td { background-color:white; padding:10px; } +div.foot { background-color:#404040; color:white; padding:5px; height:42px; clear:both; } +div.foot div.username { float:right; margin-right:10px; } +div.foot div.username div.name { padding:10px; float:left; } +div.foot div.username div.icon { float:left; } +div.foot div.username img { height:42px; } +div.foot div.menu { cursor:pointer; padding:10px; float:left; } +div.foot>div.menu:hover { background-color:#323232; } + +div.tabs:hover { + background-color:#272727; +} +div.tabs div.name { + height:46px; width:-webkit-fill-available; + position:sticky; top:5px; + z-index:1; +} +div.tabs div.name div.item { + color:gray; padding:10px; float:left; +} +div.tabs div.name div.item.select { + background-color:#404040; color:white; + border-bottom:solid red 2px; +} +div.tabs div.page { + overflow:auto; clear:both; +} +div.tabs div.page>div.input { + padding:5px; position:sticky; top:0px; +} +div.tabs div.page>div.input input { + background-color:#212121; color:white; border:0; outline:none; width:230px; +} +div.tabs div.page>div.item { + background-color:#404040; clear:both; display:none; +} +div.tabs div.page>div.list { + padding-left:20px; display:none; clear:both; +} +div.tabs div.page>div.list.select { + background-color:#323232; display:block; +} +div.left div.list { + padding-left:20px; +} + +div.tabs.left div.name { + float:left; +} +div.tabs.left div.name div.item { + border-bottom:none; float:none; +} +div.tabs.left div.name div.item.select { + border-right:solid red 2px; +} +div.tabs.left div.page { + width:-webkit-fill-available; + clear:none; float:left; +} +div.tabs.left div.page>div.item { + display:block; +} + +div.tabs.void div.name { + display:none; +} +div.tabs.void div.page>div.item { + display:block; +} + diff --git a/panel/action.js b/panel/action.js index ed88e562..7d1dd4a9 100644 --- a/panel/action.js +++ b/panel/action.js @@ -75,22 +75,19 @@ Volcanos(chat.ONENGINE, {help: "解析引擎", _engine: function(event, page, ms }}) Volcanos(chat.ONPLUGIN, {help: "注册插件", "parse": shy("解析", { - "show": function(can, msg, cmds) { - can.require(["/plugin/story/parse.js"], function() { - can.onmotion.hidden(can, can._legend) - can.onmotion.hidden(can, can._option) - can.onmotion.hidden(can, can._status) - - can.ConfHeight(can.ConfHeight()+can.Conf(html.MARGIN_Y)-(can.user.isWindows? 17: 0)) - - can.onengine.listen(can, "menu", function(msg) { can.user.toast(can, msg.Option(html.ITEM)) }) - can.onengine.listen(can, "高级配置", function(msg) { can.user.toast(can, msg.Option(html.ITEM)) }) - can.onengine.listen(can, "h1", function(msg) { can.user.toast(can, "h1") }) - - can.onappend.parse(can, can.onappend._parse(can, cmds[0])) + "show": function(can, msg, cmds) { var name = cmds[1]||"can" + cmds && cmds[0] && Volcanos(name, {_follow: can.core.Keys(can._follow, name)}, ["/plugin/story/parse.js"], function(sub) { + sub.run = can.run, sub.Option = function() {}, can.isCmdMode() && sub.ConfHeight(window.innerHeight) + sub.onappend.parse(sub, sub.onappend._parse(sub, cmds[0], name, sub.ConfHeight()), can._output) + can.onengine.listen(can, "menu", function(msg) { + delete(msg._event), delete(msg._can) + can.user.toast(can, JSON.stringify(msg)) + }) }) }, - }, ["text", "show:button@auto"], function(can, msg, cmds, cb) { can._root.Action.run({}, cmds, cb, true) }), + }, ["text", "show:button@auto", "clear:button"], function(can, msg, cmds, cb) { + cmds && cmds[0] && can._root.Action.run({}, cmds, cb, true) + }), "plugin": shy("插件", {}, ["text", "list", "back"], function(can, msg, cmds) { msg.Echo("hello world") diff --git a/panel/header.css b/panel/header.css index 1a04b553..3cafb84a 100644 --- a/panel/header.css +++ b/panel/header.css @@ -9,167 +9,3 @@ fieldset.Header>div.output div.state.avatar>img { height:31px; } fieldset.Header>div.output div.search { margin-left:20px; float:left; } fieldset.Header>div.output div.search>input { margin-top:-5px; border-radius:0; } -div.head { - background-color:#404040; padding:5px; height:42px; clear:both; -} -div.left div.username div { - color:white; text-align:center; padding:10px; -} -div.left div.username img { - padding:0 10px; width:100px; -} -div.head div.username img { - height:40px; float:left; -} -div.head div.username div { - padding:12px; float:left; -} -div.head div.username { - color:white; float:right; - padding-right:10px; -} -div.head div.menu { - color:white; cursor:pointer; padding:10px; float:left; -} -div.head div.menu:hover { - background-color:#323232; -} -div.left { - width:120px; - background-color:#323232; overflow:auto; float:left; -} -div.left:hover { - background-color:#323232; -} -div.left div.item { - background-color:#323232; - color:white; padding:5px 10px; -} -div.left div.item:hover { - background-color:#404040; -} -div.main { - background-color:#cccccc; height:180px; width:180px; overflow:auto; float:left; -} -div.main iframe { - border:0; -} -div.main fieldset.plugin { - background-color:#f8f8f8; padding:10px; margin:10px; -} -div.main fieldset.plugin form.option div.item { - margin:10px; -} -div.main fieldset.plugin div.action div.item { - margin:10px; -} -div.main fieldset.plugin legend { - box-shadow:none; - background-color:#e4e4e4; - color:black; - display:block; - float:left; -} -div.main fieldset.plugin form.option { - display:block; - clear:both; -} -div.main fieldset.plugin select { - background-color:white; color:black; - border:solid 1px gray; outline:none; - box-shadow:none; -} -div.main fieldset.plugin input[type=text] { - background-color:white; color:black; padding:2px 10px; - border:solid 1px gray; outline:none; - border-radius:3px 3px; - box-shadow:none; -} -div.main fieldset.plugin input[type=button] { - background-color:blue; color:white; padding:4px 10px; - border:none; border-radius:3px 3px; -} -div.main fieldset.plugin table.content { - border-collapse:collapse; - display:block; -} -div.main fieldset.plugin table.content thead { - z-index:1; -} -div.main fieldset.plugin table.content tr { - border:solid 1px lightgray; -} -div.main fieldset.plugin table.content th { - background-color:#fbfbfb; color:rgba(0,0,0,.45); font-weight:100; padding:10px; -} -div.main fieldset.plugin table.content td { - background-color:white; color: #5c5c5c; padding:10px; -} -div.main fieldset.plugin div.status { - color:black; -} -div.foot { - background-color:#404040; height:31px; clear:both; -} - -div.tabs:hover { - background-color:#272727; -} -div.tabs div.name { - height:46px; width:-webkit-fill-available; - position:sticky; top:5px; - z-index:1; -} -div.tabs div.name div.item { - color:gray; padding:10px; float:left; -} -div.tabs div.name div.item.select { - background-color:#404040; color:white; - border-bottom:solid red 2px; -} -div.tabs div.page { - overflow:auto; clear:both; -} -div.tabs div.page>div.input { - padding:5px; position:sticky; top:0px; -} -div.tabs div.page>div.input input { - background-color:#212121; color:white; border:0; outline:none; width:230px; -} -div.tabs div.page>div.item { - background-color:#404040; clear:both; display:none; -} -div.tabs div.page>div.list { - padding-left:20px; display:none; clear:both; -} -div.tabs div.page>div.list.select { - background-color:#323232; display:block; -} -div.left div.list { - padding-left:20px; -} - -div.tabs.left div.name { - float:left; -} -div.tabs.left div.name div.item { - border-bottom:none; float:none; -} -div.tabs.left div.name div.item.select { - border-right:solid red 2px; -} -div.tabs.left div.page { - width:-webkit-fill-available; - clear:none; float:left; -} -div.tabs.left div.page>div.item { - display:block; -} - -div.tabs.void div.name { - display:none; -} -div.tabs.void div.page>div.item { - display:block; -} - diff --git a/panel/river.css b/panel/river.css index 83572e6e..8bad8069 100644 --- a/panel/river.css +++ b/panel/river.css @@ -1,4 +1,5 @@ fieldset.River { overflow:auto; float:left; } +fieldset.River>div.action { display:block; padding:0 12px; } fieldset.River>div.output { width:180px; } fieldset.River>div.output div.item { padding:3px 16px; border-left:solid 3px #00ffae; } fieldset.River>div.output div.list div.item { border-left:solid 3px #ccdc4c; } diff --git a/panel/river.js b/panel/river.js index 8c560a11..f82c8ce8 100644 --- a/panel/river.js +++ b/panel/river.js @@ -195,7 +195,7 @@ Volcanos(chat.ONDETAIL, {help: "菜单交互", }) }, "删除群组": function(event, can, button, river) { - can.runAction(can.request(event, {hash: river}), mdb.REMOVE, [], function(msg) { can.misc.Search(can, {}) }) + can.runAction(can.request(event, {hash: river}), mdb.REMOVE, [], function(msg) { can.misc.Search(can, {river: "", storm: ""}) }) }, "保存参数": function(event, can, button, river, storm) { @@ -217,7 +217,7 @@ Volcanos(chat.ONDETAIL, {help: "菜单交互", }, "删除应用": function(event, can, button, river, storm) { can.run(can.request(event, {hash: storm}), [river, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { - can.misc.Search(can, {river: river}) + can.misc.Search(can, {river: river, storm: ""}) }) }, diff --git a/panel/search.js b/panel/search.js index 3e31651d..504f7fd2 100644 --- a/panel/search.js +++ b/panel/search.js @@ -115,7 +115,8 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [cli.CLOSE, cli.CLEAR, cli. var cmd = line.cmd == ctx.COMMAND? can.core.Keys(line.type, line.name.split(ice.SP)[0]): can.core.Keys(line.ctx, line.cmd) can.onappend.plugin(can, {type: "plug", index: cmd||msg.Option(mdb.INDEX)}, function(sub, meta) { sub.run = function(event, cmds, cb) { can.runActionCommand(event, meta.index, cmds, cb) } - sub.ConfHeight(can.ConfHeight()-2*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth()) + can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(can.ConfWidth())) + sub.ConfHeight(can.ConfHeight()-2*html.ACTION_HEIGHT) sub.Focus() }, can.ui.profile) }, diff --git a/plugin/local/chat/div.css b/plugin/local/chat/div.css index ead2dcff..d79f1b10 100644 --- a/plugin/local/chat/div.css +++ b/plugin/local/chat/div.css @@ -1,8 +1,13 @@ +fieldset.layout legend { display:none; } +fieldset.layout fieldset.plugin { padding:0; margin:0; } + fieldset.div div.output td { vertical-align:top; } -fieldset.div div.output fieldset.span>fieldset { overflow:auto; float:left; } +fieldset.div div.output fieldset.span>div.output>fieldset { overflow:auto; float:left; } + fieldset.panel.cmd.main fieldset.div>legend { display:none; } fieldset.panel.cmd.main fieldset.div>form.option { display:none; } fieldset.panel.cmd.main fieldset.div>div.action { display:none; } fieldset.panel.cmd.main fieldset.div div.project { display:none; } fieldset.panel.cmd.main fieldset.div div.profile { display:none; } -fieldset.word>div.output fieldset.span>fieldset { overflow:auto; float:left; } +fieldset.panel.cmd.main fieldset.div>div.status { display:none; } + diff --git a/plugin/local/chat/div.js b/plugin/local/chat/div.js index 4cd2610f..090a025e 100644 --- a/plugin/local/chat/div.js +++ b/plugin/local/chat/div.js @@ -1,81 +1,59 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) { var meta = {}; msg.Table(function(value) { meta[value.key] = value.value }) - can._meta = can.base.Obj(meta.text, {meta: {name: meta.name||"hi"}, list: []}) + can._list = can.base.Obj(meta.text, {meta: {name: meta.name||html.DIV}, list: []}) + can.sup._keys = can.sup._keys||can._list.meta.name + can.onimport.layout(can, can._output) can.base.isFunc(cb) && cb(msg) - - can.ui = can.page.Appends(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [{type: html.TR, list: [ - {type: html.TD, list: [{view: chat.PROJECT}]}, - {type: html.TD, list: [{view: chat.DISPLAY}]}, - {type: html.TD, list: [{view: chat.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.ConfWidth()-260, height = can.ConfHeight()-100 - if (can.Conf("auto.cmd")) { + _item: function(can, keys, item, target, width, height) { width = width||item.meta.width, height = height||item.meta.height + var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name||html.DIV], onclick: function(event) { + can.onmotion.select(can, can.ui.project, html.DIV_ITEM, event.target), can.current = event.target, can.onimport._profile(can, keys, item.meta) + }, _add: function(data) { item.list.push(data), can.onimport._list(can, keys, item, ui.list, width, height) }}, {view: html.LIST}]) + + var field = can.onappend.field(can, item.meta.index? chat.PLUGIN: chat.LAYOUT, item.meta, target._target) + can.page.style(can, ui.list._target = field.output, {width: width, height: height}) + item.meta.style && can.page.ClassList.add(can, ui.list._target, item.meta.style) + + item.meta.index && can.onappend.plugin(can, can.base.Copy({}, item.meta), function(sub) { + can.page.style(can, sub._output, {width: width, height: height-2*html.ACTION_HEIGHT}) + }, target._target, field.fieldset) + + can.onimport._list(can, keys, item, ui.list, width, height) + can.sup._keys == keys && ui.item.click() + }, + _list: function(can, keys, item, target, width, height) { + if (item.meta.style == html.SPAN) { width = width / item.list.length } + if (item.meta.style == html.DIV) { height = height / item.list.length } + can.onmotion.clear(can, target), can.onmotion.clear(can, target._target) + can.core.List(item.list, function(item) { can.onimport._item(can, can.core.Keys(keys, item.meta.name), item, target, width, height) }) + }, + _profile: function(can, keys, meta) { can.onmotion.clear(can, can.ui.profile) + var msg = can.request({}); msg.Push(mdb.KEY, "keys"), msg.Push(mdb.VALUE, keys) + can.core.List(can.core.Split("name,index,args,style,display,height,width"), function(k) { + msg.Push(mdb.KEY, k), msg.Push(mdb.VALUE, meta[k]) + }), can.sup._keys = keys + can.onappend.table(can, msg, function(value, key, index, line, array) { + return {text: [value, html.TD], ondblclick: function(event) { var target = event.target + key == mdb.VALUE && can.onmotion.modify(can, event.target, function(event, value, old) { + target.innerText = meta[line.key] = value, can.onimport.layout(can) + }, {name: line.key}) + }} + }, can.ui.profile) + }, + layout: function(can, target) { target = target||can._output + can.onmotion.clear(can, target), can.onlayout.profile(can, target), can.ui.project._target = can.ui.content + var width = can.ConfWidth()-320, height = can.ConfHeight() + if (can.isCmdMode()) { + width = can._root._width, height = can._root._height, can.user.title(can._list.meta.name) + } else if (can.isFullMode()) { width = can.ConfWidth(), height = can.ConfHeight() - 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) + can.onmotion.toggle(can, can.ui.project, false) + } else { + can.onmotion.toggle(can, can.ui.profile, true) } - if (can.isCmdMode() || can.user.mod.isDiv) { - width = can._root._width, height = can._root._height - can.page.style(can, can._output, {width: width, height: height}) - } - return width + can.onimport._item(can, can._list.meta.name, can._list, can.ui.project, width, height) }, - _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._plugin(can, node.meta, target._fieldset, width) - - var msg = can.request({}); msg.Push(node.meta, "", true) - ui.item.onclick = function(event) { - can.onmotion.select(can, can.ui.project, "div.item", ui.item) - can.current = ui.item, can.onmotion.clear(can, can.ui.profile) - can.onappend.table(can, msg, function(value, key, index, line, array) { - return {text: [value, html.TD], ondblclick: function(event) { - key == "value" && can.onmotion.modifys(can, event.target, function(event, value, old) { - node.meta[line.key] = value - }) - }} - }, can.ui.profile) - } - - ui.item._add = function(data) { - if (node.meta.style == html.SPAN) { width = width * node.list.length } - node.list.push(data) - if (node.meta.style == html.SPAN) { width = width / node.list.length } - can.onmotion.clear(can, ui.list), can.onmotion.clear(can, ui.list._fieldset) - can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) }) - } - if (node.meta.style == html.SPAN) { width = width / node.list.length } - can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) }) - return ui.item - }, - _plugin: function(can, meta, target, width) { - var size = {width: width, height: meta.height} - var field = can.onappend.field(can, chat.LAYOUT, {}, target).fieldset - can.page.ClassList.add(can, field, meta.style) - can.page.style(can, field, size) - - meta.index && can.runAction(event, ctx.COMMAND, [meta.index], function(msg) { - can.onappend._init(can, can.base.Copy({ - 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.style(can, sub._output, size) - sub.run = function(event, cmds, cb) { - can.runActionCommand(event, meta.index, cmds, cb) - } - }, target, field) - }) - return field - }, -}, ["/plugin/local/chat/div.css"]) +}, [""]) Volcanos(chat.ONACTION, {help: "操作数据", "添加": function(event, can) { can.user.input(event, can, [mdb.NAME, ctx.INDEX, ctx.ARGS, ctx.STYLE, html.HEIGHT, html.WIDTH], function(data) { @@ -83,9 +61,6 @@ Volcanos(chat.ONACTION, {help: "操作数据", }) }, "保存": function(event, can) { var msg = can.request(event, can.Option()) - can.runAction(event, mdb.MODIFY, [mdb.TEXT, JSON.stringify(can._meta)]) - }, - "预览": function(event, can) { - can.onmotion.share(event, can, [], [mdb.LINK, can.misc.MergeURL(can, {_path: "/chat/div/"+can.Option("hash")})]) + can.runAction(event, mdb.MODIFY, [mdb.TEXT, JSON.stringify(can._list)]) }, }) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 6f9c4f17..bb6c5db7 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -6,10 +6,10 @@ fieldset.inner>div.action>div.tabs.select { background-color:steelblue; } fieldset.inner>div.output td.content { position:relative; } fieldset.inner>div.output div.content { color:white; font-size:16px; font-family:monospace; position:relative; } -fieldset.inner>div.output div.content tr.select { background-color:#0000ff6b; } -fieldset.inner>div.output div.content tr.select td.line { background-color:blue; border:solid 1px red; border-right:solid 2px red; } fieldset.inner>div.output div.content td.line { position:sticky; left:0; text-align:right; padding:0 6px; border-right:solid 2px red; } -fieldset.inner>div.output div.content td.line:hover { background-color:blue; } +fieldset.inner>div.output div.content tr:hover { background-color:#4682b46b; } +fieldset.inner>div.output div.content tr.select { background-color:#4682b46b; } +fieldset.inner>div.output div.content tr.select td.line { background-color:#6495ed63; border:solid 1px red; border-right:solid 2px red; } fieldset.inner>div.output div.content td.text { white-space:pre; padding-left:10px; cursor:text; } fieldset.inner>div.output div.content td.text span.comment { background-color:blue; color:cyan; } fieldset.inner>div.output div.content td.text span.keyword { color:yellow; font-weight:bold; } @@ -18,6 +18,7 @@ fieldset.inner>div.output div.content td.text span.function { color:cyan; font-w fieldset.inner>div.output div.content td.text span.constant { color:magenta; } fieldset.inner>div.output div.content td.text span.string { color:magenta; } fieldset.inner>div.output td.content iframe { border:0; } +fieldset.inner>div.output td.profile iframe { border:0; } fieldset.inner>div.output td.content>div.tabs { display:none; } fieldset.inner>div.output td.content>div.path { display:none; } @@ -30,6 +31,8 @@ fieldset.inner>div.status legend:hover { background-color:green; } fieldset.inner>div.status { height:31px; overflow:auto; } body.white fieldset.inner>div.output div.content { color:black; } +body.white fieldset.inner.float>div.output div.content { color:white; } +body.black fieldset.inner.float>div.output div.content { color:white; } body.simple fieldset.inner>div.output td.content>div.tabs { background-color:gray; padding:0px; height:31px; overflow:auto; display:block; } body.simple fieldset.inner>div.output td.content>div.tabs div.tabs { background-color:gray; font-family:monospace; padding:7px 20px; height:17px; float:left; } @@ -47,7 +50,7 @@ body.white.simple fieldset.inner>div.output td.content>div.tabs div.tabs.select body.white.simple fieldset.inner>div.output td.content>div.path { background-color:white; color:black; } body.white.simple fieldset.inner>div.output div.content { background-color:white; color:black; } body.white.simple fieldset.inner>div.output div.content tr.select { background-color:white; } -body.white.simple fieldset.inner>div.output div.content tr.select td.line { background-color:white; color:black; border:none; } +body.white.simple fieldset.inner>div.output div.content tr.select td.line { background-color:steelblue; color:white; border:none; } body.white.simple fieldset.inner>div.output div.content tr.select td.text { border:solid 1px lightgray; } body.white.simple fieldset.inner>div.output div.content td.text span.string { color:royalblue; } body.white.simple fieldset.inner>div.output div.content td.text span.function { color:darkred; } @@ -71,3 +74,4 @@ body.mobile.simple fieldset.inner>div.output div.toggle.display { background-col -o-user-select:none; user-select:none; } +body.white.simple fieldset.plugin div.output.json div.item span.nonce { color:lightgray; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index ef78a3f0..08e4c0a8 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -3,17 +3,20 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar var files = can.core.Split(can.Option(nfs.FILE), ice.FS); can.Option(nfs.FILE, files[0]) can.tabview = can.tabview||{}, can.history = can.history||[], can.toolkit = {}, can.extentions = {} can.profile_size = {}, can.display_size = {} - can.onengine.plugin(can, can.onplugin) - can.isCmdMode() && can.onmotion.hidden(can, can._status) can.onmotion.clear(can), can.onlayout.profile(can) can.page.styleWidth(can, can.ui.project, 240) can.onimport._project(can, can.ui.project) can.onimport._profile(can, can.ui.profile) can.onimport._display(can, can.ui.display) - can.ui._content = can.ui.content can.onimport._input(can) + can.ui._content = can.ui.content + can.ui._profile_output = can.ui.profile_output + can.isCmdMode() && can.onmotion.hidden(can, can._status) + can.onengine.plugin(can, can.onplugin) + can.base.isFunc(cb) && cb(msg) + switch (can.Mode()) { case "simple": can.onimport._simple(can); break case "float": break @@ -28,14 +31,12 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }), can.onimport._keydown(can) } - var hash = location.hash - can.isCmdMode() || (can.tabview[can.onexport.keys(can)] = msg) + var hash = location.hash; can.isCmdMode() || (can.tabview[can.onexport.keys(can)] = msg) can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (can.isCmdMode() && hash) { var args = can.core.Split(decodeURIComponent(hash).slice(1)) - can.onimport.tabview(can, can.Option(nfs.PATH), args[0], args[1]) + can.onmotion.delay(can, function() { can.onimport.tabview(can, can.Option(nfs.PATH), args[0], args[1]) }) } }) - can.base.isFunc(cb) && cb(msg) }, _input: function(can) { }, @@ -112,6 +113,11 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar if (can.user.isMobile && can.isFloatMode()) { height = can._root._height-2*html.ACTION_HEIGHT } if (can.isCmdMode()) { + if (can.ui.display.display != html.NONE) { + if (can.ui.display.offsetHeight > can.base.Min(can.ConfHeight() / 2, 200)) { + can.page.style(can, can.ui.display_output, html.MAX_HEIGHT, can.base.Min(can.ConfHeight() / 2, 200)) + } + } if (can._status.style.display == html.NONE) { height += html.ACTION_HEIGHT } var rest = can.ui.display.offsetHeight+can.ui._tabs.offsetHeight+can.ui._path.offsetHeight+4 can.page.styleHeight(can, can.ui.content, height+html.ACTION_HEIGHT-rest) @@ -126,14 +132,8 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT) can.page.styleHeight(can, can.ui.project, can.ui.content.offsetHeight+rest) } - - 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" - ) + can.page.Select(can, can.ui.profile, html.IFRAME, function(iframe) { + can.page.Modify(can, iframe, {height: can.ui.profile.offsetHeight-html.ACTION_HEIGHT-4, width: can.ui.profile.offsetWidth}) }) }, project: function(can, path) { @@ -175,7 +175,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar delete(can.tabview[key]) delete(can._cache_data[can.base.Path(path, file)]) delete(can.ui._content._cache[can.base.Path(path, file)]) - delete(can.ui.profile_output._cache[can.base.Path(path, file)]) + delete(can.ui._profile_output._cache[can.base.Path(path, file)]) delete(can.ui.display_output._cache[can.base.Path(path, file)]) msg._content != can.ui._content && can.page.Remove(can, msg._content) }, can.ui._tabs, function(item) {}) @@ -188,18 +188,27 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, profile: function(can, msg) { var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2 - msg && can.onmotion.delay(can, function() { - can.onimport.process(can, msg, can.ui.profile_output, width, can.ui.profile.offsetHeight) - can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can) - }), can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can) + if (msg) { + var sup = can.tabview[can.onexport.keys(can)] + can.onmotion.toggle(can, can.ui.profile_output, false) + if (msg.Result().indexOf(" -1) { + if (sup._profile_output != can.ui._profile_output) { can.page.Remove(can, sup._profile_output) } + can.ui.profile_output = sup._profile_output = can.page.Append(can, can.ui.profile_output.parentNode, [{view: "output", inner: msg.Result()}]).output + } else { + can.ui.profile_output = sup._profile_output = can.ui._profile_output + can.onimport.process(can, msg, can.ui._profile_output, width, can.ui.profile.offsetHeight) + } + } + can.onmotion.toggle(can, can.ui.profile_output, true) + can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can) }, display: function(can, msg) { var height = can.display_size[can.onexport.keys(can)]||{sh: can.ConfHeight()/2}[can.parse]||can.ConfHeight()/4 - msg && can.onmotion.delay(can, function() { + if (msg) { can.onimport.process(can, msg, can.ui.display_output, can.ui.display.offsetWidth, height) can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.ui.display_status) - can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can) - }), can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can) + } + can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can) }, process: function(can, msg, target, width, height) { can.onmotion.clear(can, target), can.user.toastSuccess(can) if (msg.Option(ice.MSG_PROCESS) == "_field") { @@ -207,7 +216,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.onimport.plug(can, meta, target, function(sub) { width && sub.ConfWidth(width), height && sub.ConfHeight(height), sub.Focus() }) }) } else if (msg.Option(ice.MSG_DISPLAY) != "") { - can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY), target, false, function(msg) { can.onimport.layout(can) }) + can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY), target, false, function(msg) { can.onmotion.delay(can, function() { can.onimport.layout(can) }) }) } else { can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target) } @@ -292,23 +301,21 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }) - can.page.Select(can, can._output, can.page.Keys("div.content", html.IFRAME), function(item) { + can.page.Select(can, can.ui._content.parentNode, can.page.Keys("div.content", html.IFRAME), function(item) { if (can.onmotion.toggle(can, item, item == msg._content)) { can.ui.content = msg._content } }) + can.page.Select(can, can.ui._profile_output.parentNode, can.page.Keys("div.output"), function(item) { + if (can.onmotion.toggle(can, item, item == msg._profile_output)) { msg._profile_output } + }) return can.file - }, can.ui._content, can.ui.profile_output, can.ui.display_output) && !skip) { + }, can.ui._content, can.ui._profile_output, can.ui.display_output) && !skip) { return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } can.onmotion.clear(can, can.ui.content), can.onimport.layout(can) if (msg.Option(ctx.INDEX)) { if (msg.Option(nfs.LINE) == web.DREAM) { - if (msg._content) { - can.page.Select(can, can._output, can.page.Keys("div.content", html.IFRAME), function(item) { - if (can.onmotion.toggle(can, item, item == msg._content)) { can.ui.content = msg._content } - }) - return - } + if (msg._content) { return } can.ui.content = msg._content = can.page.insertBefore(can, [{type: html.IFRAME, src: can.misc.MergeURL(can, {pod: msg.Option(nfs.FILE), topic: can.misc.Search(can, "topic")}, true), width: can.ui.content.offsetWidth, height: can.ui.content.offsetHeight}], can.ui.content) return can.onimport.layout(can) } @@ -411,6 +418,30 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line "complex": "function", "real": "function", "imag": "function", }, }, + zml: { + prefix: { + "# ": "comment", + }, + keyword: { + "return": "keyword", + + "head": "keyword", + "left": "keyword", + "main": "keyword", + "foot": "keyword", + "tabs": "keyword", + + "index": "function", + "action": "function", + "args": "function", + "type": "function", + "style": "function", + "width": "function", + + "auto": "constant", + "username": "constant", + }, + }, css: { keyword: { "body": "keyword", diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index e86e123e..f6c8444a 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -1,6 +1,6 @@ fieldset.vimer>div.output input.current { background-color:#00000000; color:#00000000; font-size:1em; font-family:monospace; - padding:0; padding-left:12px; border:none; outline:none; margin:0; margin-top:1px; + padding:0; padding-left:12px; border:none; outline:none; margin:0; margin-top:-3px; height:22px; position:absolute; } fieldset.vimer>div.output input.current.normal { caret-color:gray; } @@ -33,6 +33,9 @@ body.simple fieldset.vimer>div.output div.complete table.content td { font-size:1rem; } +body.simple fieldset.vimer>div.output input.current { + margin-top:1px; +} body.white fieldset.vimer>div.output input.current.insert { caret-color:black; } body.white fieldset.vimer>div.output input.current.normal { caret-color:lightgray; } diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index fe9b069a..cc5b8094 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -28,7 +28,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar project: function(can, path) { can.onimport.zone(can, [ can.isCmdMode() && {name: "create", _init: function(target) { can.onappend._action(can, can.onaction.list, target) }}, - {name: "source", _init: function(target) { var total = 0 + {name: "source", _init: function(target, zone) { var total = 0 function show(path, target) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table() can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } item._init = function(target) { target.onmouseenter = function(event) { can.user.carteRight(event, can, { @@ -39,25 +39,29 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) { can.onimport.tabview(can, path, item.path) // 显示文件 }, target), can.Status("文件数", total += msg.Length()) + can.page.Modify(can, zone._search, {placeholder: "search in "+total+" item"}) }, true) } if (path.length == 1) { return show(path[0], target) } can.onimport.zone(can, can.core.List(path, function(path) { return {name: path, _init: function(target) { show(path, target) }} }), target) can.onmotion.delay(can, function() { target.previousSibling.innerHTML = "" }) }}, - {name: "plugin", _init: function(target) { - can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) { + {name: "plugin", _init: function(target, zone) { var total = 0 + can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) { can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX) // 显示插件 }, target) + can.page.Modify(can, zone._search, {placeholder: "search in "+total+" item"}) }}, - {name: "module", _init: function(target) { + {name: "module", _init: function(target, zone) { can.runAction(can.request({}, {fields: ctx.INDEX}), ctx.COMMAND, [mdb.SEARCH, ctx.COMMAND], function(msg) { + can.page.Modify(can, zone._search, {placeholder: "search in "+msg.Length()+" item"}) can.onimport.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) { can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX) // 显示模块 }, target) }) }}, - {name: "dreams", _init: function(target) { var call = arguments.callee + {name: "dreams", _init: function(target, zone) { var call = arguments.callee can.runAction({}, ice.RUN, [web.DREAM], function(msg) { + can.page.Modify(can, zone._search, {placeholder: "search in "+msg.Length()+" item"}) msg.Table(function(item) { function carte(event) { var list = []; switch (item.status) { diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index b1c94d9a..b2dd2f49 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -21,7 +21,7 @@ fieldset.word.float { padding:0; margin:0; width:-webkit-fill-available; positio fieldset.word.float>div.action { display:contents; } fieldset.word.float>div.status { clear:none; } fieldset.word.float>div.output { background-color:#f0f8ff80; padding:20px; overflow:auto; } -fieldset.word.float>div.output>div.project { background:darkcyan; padding:10px; position:fixed; right:0; top:31px; z-index:10; } +fieldset.word.float>div.output>div.project { background:#4682b46b; padding:10px; position:fixed; right:0; top:31px; z-index:10; } fieldset.word.float div.content div.page { margin-top:31px; display:none; } fieldset.word.float div.content div.page.show { display:block; } fieldset.word.float div.content.grid div.page { background-color:#a4cbecb5; margin:10px; height:200px; width:200px; overflow:auto; display:block; float:left; } diff --git a/plugin/state.js b/plugin/state.js index 2634083e..7523c2d3 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -94,14 +94,13 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [ "刷新数据": function(event, can) { can.Update({}, can.Input([], true)) }, "切换全屏": function(event, can) { var sub = can._outputs[can._outputs.length-1] if (can.page.ClassList.neg(can, can._target, "full")) { - var height = can._root._height-(can._status.innerText? 2: 1)*html.ACTION_HEIGHT; can.user.isMobile && (height -= 2*html.ACTION_HEIGHT) - can._mode = can.Mode(), can._height_bak = sub.ConfHeight(), can._width_bak = sub.ConfWidth() - can.Mode("full"), can.ConfHeight(height), can.ConfWidth(can._root._width) - sub.Mode("full") - can.page.style(can, can._output, html.HEIGHT, sub.ConfHeight(height), html.MIN_WIDTH, sub.ConfWidth(can._root._width)) + var height = window.innerHeight-(can._status.innerText? 2: 1)*html.ACTION_HEIGHT; can.user.isMobile && (height -= 2*html.ACTION_HEIGHT) + can._mode_bak = can.Mode(), can._height_bak = sub.ConfHeight(), can._width_bak = sub.ConfWidth() + sub.Mode("full"), can.Mode("full"), can.ConfHeight(height), can.ConfWidth(window.innerWidth) + can.page.style(can, can._output, html.HEIGHT, sub.ConfHeight(height), html.MIN_WIDTH, sub.ConfWidth(window.innerWidth)) } else { - can.Mode(can._mode), can.ConfHeight(can._height_bak), can.ConfWidth(can._width_bak) - sub.Mode(can._mode), sub.ConfHeight(can._height_bak), sub.ConfWidth(can._width_bak) + can.Mode(can._mode_bak||""), can.ConfHeight(can._height_bak), can.ConfWidth(can._width_bak) + sub.Mode(can._mode_bak||""), sub.ConfHeight(can._height_bak), sub.ConfWidth(can._width_bak) can.page.style(can, can._output, html.HEIGHT, "", html.MIN_WIDTH, "") } can.core.CallFunc([sub, chat.ONIMPORT, html.LAYOUT], {can: sub}) diff --git a/plugin/story/parse.js b/plugin/story/parse.js index 5feffef2..49fd0011 100644 --- a/plugin/story/parse.js +++ b/plugin/story/parse.js @@ -1,181 +1,157 @@ -Volcanos(chat.ONAPPEND, {help: "渲染引擎", +Volcanos(chat.ONAPPEND, {help: "渲染引擎", list: ["{", "}", html.HEAD, html.LEFT, html.MAIN, html.FOOT], + _parse: function(can, text, name, height) { var stack = [{_deep: -1, list: []}], finish = false + can.core.List(can.core.Split(text, ice.NL, ice.NL, ice.NL), function(line) { if (line == "" || finish) { return } + var deep = 0; for (var i = 0; i < line.length; i++) { if (line[i] == ice.SP) { deep++ } else if (line[i] == ice.TB) { deep += 4 } else { break } } + for (var i = stack.length-1; i > 0; i--) { if (deep <= stack[i]._deep) { stack.pop() } } + + var ls = can.core.Split(line); if (ls[0] == "return ") { return finish = true } + var item = {_deep: deep, list: []}; var list = stack[stack.length-1]; list.list.push(item); if (deep > list._deep) { stack.push(item) } + can.onappend.list.indexOf(ls[0]) > -1 || can.onappend[ls[0]]? item.type = ls[0]: item.name = ls[0] + for (var i = 1; i < ls.length; i += 2) { can.core.Value(item, ls[i], ls[i+1]) } + }) + return {type: name, style: {height: height||can.ConfHeight()||window.innerHeight}, list: stack[0].list} + }, parse: function(can, list, target, keys, data, type) { target = target||can._output, data = data||{} if (!list) { return } else if (can.base.isArray(list)) { - return can.core.List(list, function(meta, index) { - return can.onappend.parse(can, meta, target, keys, data, type) - }) + return can.core.List(list, function(meta, index) { return can.onappend.parse(can, meta, target, keys, data, type) }) } else if (can.base.isString(list)) { var ls = can.core.Split(list, "", ":=@"); if (ls.length == 1) { var meta = type? {type: type, name: ls[0]}: {type: ls[0]} } else { var meta = {name: ls[0]}; for (var i = 1; i < ls.length; i += 2) { switch (ls[i]) { - case ":": meta.type = ls[i+1]; break - case "=": meta.value = ls[i+1]; break case "@": meta.action = ls[i+1]; break + case "=": meta.value = ls[i+1]; break + case ":": meta.type = ls[i+1]; break } } } } else if (can.base.isObject(list)) { var meta = list } - keys = can.core.Keys(keys, meta.name||meta.type) - var item = {view: meta.type}, init, subtype; switch (meta.type) { - case html.HEAD: subtype = "menu", data = {} - init = function(target) { data.head = target - can.page.ClassList.add(can, target, html.LAYOUT) - } + var item = {view: meta.type}; switch (meta.type) { + case html.HEAD: meta.subtype = html.MENU + meta.init = function(target) { can.page.ClassList.add(can, target, html.LAYOUT), data.head = target } break - case html.LEFT: subtype = "item" - init = function(target) { - can.page.ClassList.add(can, target, html.LAYOUT) - can.core.Timer(10, function() { var height = target.parentNode.offsetHeight + case "{": if (meta._deep > 0) { return } + item.view = meta.type = html.LEFT // no break + case html.LEFT: meta.subtype = html.ITEM + meta.init = function(target) { can.page.ClassList.add(can, target, html.LAYOUT), data.left = target + can.onmotion.delay(can, function() { var height = target.parentNode.offsetHeight can.page.Select(can, target.parentNode, can.page.Keys(html.DIV_LAYOUT_HEAD, html.DIV_LAYOUT_FOOT), function(item) { - height -= item.offsetHeight - }), can.page.style(can, target, html.HEIGHT, height) - }) - } - break - case html.MAIN: - init = function(target) { data.main = target - can.page.ClassList.add(can, target, html.LAYOUT) - can.core.Timer(10, function() { var height = target.parentNode.offsetHeight - can.page.Select(can, target.parentNode, can.page.Keys(html.DIV_LAYOUT_HEAD, html.DIV_LAYOUT_FOOT), function(item) { - height -= item.offsetHeight - }), can.page.style(can, target, html.HEIGHT, height) - }) - - can.core.Timer(100, function() { - var width = target.parentNode.offsetWidth - can.page.Select(can, target.parentNode, html.DIV_LAYOUT_LEFT, function(item) { - width -= item.offsetWidth+1 - }), can.page.style(can, target, html.WIDTH, width) - }) - - } - break - case html.FOOT: - init = function(target) { data.foot = target - can.page.ClassList.add(can, target, html.LAYOUT) - } - break - case html.TABS: - item.list = [{view: "name"}, {view: html.PAGE}], item._init = function(_target, ui) { - can.page.Append(can, ui.page, [{view: html.INPUT, list: [{type: html.INPUT, onkeyup: function(event) { - can.page.Select(can, _target, [html.DIV_PAGE, html.DIV_ITEM], function(item) { - can.page.ClassList.set(can, item, html.HIDE, item.innerText.indexOf(event.target.value) == -1) - }) - }}]}]) - can.core.List(meta.list, function(item, index) { - can.page.Append(can, ui.name, [{view: [html.ITEM, html.DIV, item.name||item], onclick: function(event) { - can.onmotion.select(can, _target, [[html.DIV_PAGE, html.DIV_LIST]], index) - can.onmotion.select(can, ui.name, html.DIV_ITEM, index) - ui.page.scrollTo(0, 0) - }}]) - can.page.Append(can, ui.page, [{view: [html.ITEM, html.DIV, item.name], onclick: function(event) { - can.page.ClassList.neg(can, event.target.nextSibling, html.SELECT) - can.onmotion.select(can, ui.name, html.DIV_ITEM, index) - }}, {view: [html.LIST], _init: function(target) { - can.onappend.parse(can, item.list, target, can.core.Keys(keys, item.name), data, html.ITEM) - }}]) - }) - can.core.Timer(100, function() { var height = target.offsetHeight - can.page.style(can, ui.page, html.HEIGHT, height-10-(meta.style? 0: ui.name.offsetHeight)) - can.page.style(can, _target, html.HEIGHT, height-10) - }), can.page.Select(can, ui.name, html.DIV_ITEM)[0].click() - } - break - case aaa.USERNAME: - can.page.Append(can, target, [ - can.base.Copy({view: [aaa.USERNAME, html.DIV], onclick: function(event) { - }, list: [{view: ["some", html.DIV, can.user.info.usernick]}, {img: can.user.info.avatar}]})]) - return - } - - item._init = item._init||function(target) { - meta.list && can.onappend.parse(can, meta.list, target, keys, data, type||subtype) - can.base.isFunc(init) && init(target), can.base.isFunc(meta.init) && meta.init(target) - } - if (can.base.isString(meta.style)) { item.className = meta.style } - if (can.base.isObject(meta.style)) { item.style = meta.style } - - if ((meta.type||type) == html.MENU) { - can.page.Append(can, target, [can.base.Copy({view: [html.MENU, html.DIV, meta.name||meta], onclick: function(event) { - if (meta.list && meta.list.length > 0) { return } - can.onengine.signal(can, meta.name) || can.onengine.signal(can, html.MENU, can.request(event, {item: meta.name})) - }, onmouseenter: function(event) { - meta.list && meta.list.length > 0 && can.user.carte(event, can, {}, meta.list, function(event, item) { - can.onengine.signal(can, item) || can.onengine.signal(can, meta.name, can.request(event, {item: item})) - }) - }})]).first - return - } - if ((type||subtype) == html.ITEM) { item.view = item.view||html.LIST - if (meta.action == "auto") { - meta.init = meta.init||function(item) { can.core.Timer(100, function() { item.click() }) } - } - if (decodeURIComponent(location.hash) == "#"+can.core.Keys(keys, item.name)) { - meta.init = meta.init||function(item) { can.core.Timer(300, function() { item.click() }) } - } - - var _item = can.page.Append(can, target, [can.base.Copy({view: [html.ITEM, html.DIV, meta.name||meta], onclick: function(event) { - var url = can.misc.MergeURL(can, {pod: can.misc.Search(can, "pod"), cmd: meta.index}) - if (meta.action == "push") { return can.user.jumps(url) } - if (meta.action == "open") { return can.user.open(url) } - location.hash = can.core.Keys(keys, item.name) - - switch (meta.type) { - case html.PLUGIN: - if (can.onmotion.cache(can, function() { return keys }, data.main)) { break } - if (can.base.Ext(meta.index) == nfs.ZML || can.base.Ext(meta.index) == nfs.IML) { - can.page.Append(can, data.main, [{type: html.IFRAME, src: "/chat/cmd/"+meta.index, - height: data.main.offsetHeight, width: data.main.offsetWidth, - }]) - break - } - - can.onappend.plugin(can, {index: meta.index, args: can.base.Obj(meta.args)}, function(sub) { - sub.ConfHeight(data.main.offsetHeight-160) - sub.run = function(event, cmds, cb, silent) { - can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(data.main.offsetWidth-40)) - can.runActionCommand(event, sub._index||meta.index, cmds, function(msg) { - cb(msg), can.core.Timer(10, function() { - can.page.style(can, sub._table, html.MAX_HEIGHT, data.main.offsetHeight-150) - }) - }) + if (item.parentNode == target.parentNode) { + height -= item.offsetHeight // 高度 } - }, data.main) - default: - meta.list && can.onmotion.toggle(can, event.target.nextSibling) + }), can.page.style(can, target, html.HEIGHT, height) + }) } - }})]).first; can.core.ItemCB(meta, function(key, cb) { _item[key] = can.base.isFunc(cb)? cb: function(event) { - can.onengine.signal(can, cb, can.request(event)) - } }) - can.core.Timer(10, function() { meta.init && meta.init(_item) }) - if (!meta.list) { return } - } - return can.page.Append(can, target, [item]).first - }, - _parse: function(can, text) { var stack = [{_deep: -1, list: []}] - can.core.List(can.core.Split(text, ice.NL, ice.NL, ice.NL), function(line) { if (line == "") { return } - var deep = 0; for (var i = 0; i < line.length; i++) { if (line[i] == ice.SP) { deep++ } else if (line[i] == ice.TB) { deep += 4 } else { break } } - for (var i = stack.length-1; i > 0; i--) { if (deep <= stack[i]._deep) { stack.pop() } } + break + case "}": if (meta._deep > 0) { return } + item.view = meta.type = html.MAIN // no break + case html.MAIN: + meta.init = function(target) { can.page.ClassList.add(can, target, html.LAYOUT) + can.onmotion.delay(can, function() { var height = target.parentNode.offsetHeight + can.page.Select(can, target.parentNode, can.page.Keys(html.DIV_LAYOUT_HEAD, html.DIV_LAYOUT_FOOT), function(item) { + if (item.parentNode == target.parentNode) { + height -= item.offsetHeight // 高度 + } + }), can.page.style(can, target, html.HEIGHT, height) + }, data.main? 10: 100) + can.onmotion.delay(can, function() { var width = target.parentNode.offsetWidth + can.page.Select(can, target.parentNode, html.DIV_LAYOUT_LEFT, function(item) { + if (item.parentNode == target.parentNode) { + width -= item.offsetWidth // 宽度 + } + }), can.page.style(can, target, html.WIDTH, width) + }, data.main? 10: 100) - var item = {_deep: deep, list: []}; var list = stack[stack.length-1]; list.list.push(item); if (deep > list._deep) { stack.push(item) } - var ls = can.core.Split(line); switch (ls[0]) { - case html.HEAD: - case html.LEFT: - case html.MAIN: - case html.FOOT: - case html.TABS: - case aaa.USERNAME: - case html.MENU: item.type = ls[0]; break - default: item.name = ls[0]; break - } - for (var i = 1; i < ls.length; i += 2) { can.core.Value(item, ls[i], ls[i+1]) - if (ls[i] == ctx.INDEX) { item.type = item.type||html.PLUGIN } - } - }) - return {type: "demo", style: {height: can.ConfHeight()||can._root._height}, list: stack[0].list} + if (!data.main) { data.main = target + can.onmotion.delay(can, function() { data.main_init && data.main_init() }, 300) + } + } + break + case html.FOOT: meta.subtype = html.MENU + meta.init = function(target) { can.page.ClassList.add(can, target, html.LAYOUT), data.foot = target } + break + default: var cb = can.onappend[meta.type]; cb && cb(can, item, meta, target, data) + } + if (can.base.isObject(meta.style)) { item.style = meta.style } + if (can.base.isString(meta.style)) { item.className = meta.style } + + meta.keys = meta.keys||can.core.Keys(keys, meta.name||meta.type) + var cb = can.onappend[type]; !can.onappend[meta.type] && cb && cb(can, item, meta, target, data) + item._init = item._init||function(target) { meta.list && can.onappend.parse(can, meta.list, target, meta.keys, data, meta.subtype||type) } + item.target = can.page.Append(can, target, [item]).first; meta.init && meta.init(item.target) + can.core.ItemCB(meta, function(key, cb) { item.target[key] = can.base.isFunc(cb)? cb: function(event) { can.onengine.signal(can, cb, can.request(event, meta)) } }) + }, + username: function(can, item, meta, target) { + can.base.Copy(item, {view: [aaa.USERNAME, html.DIV], list: [{view: [html.NAME, html.DIV, can.user.info.usernick]}, {view: [html.ICON, html.DIV], list: [{img: can.user.info.avatar}]}]}) + }, + menu: function(can, item, meta, target) { + can.base.Copy(item, meta.list && meta.list.length > 0? {view: [html.MENU, html.DIV, meta.name], onmouseenter: function(event) { + can.user.carte(event, can, {}, can.core.List(meta.list, function(item) { return item.name }), function(event, button, meta) { + can.onengine.signal(can, button) || can.onengine.signal(can, html.MENU, can.request(event, {item: button})) + }) + }, _init: function() {}}: {view: [html.MENU, html.DIV, meta.name], onclick: function(event) { + can.onengine.signal(can, meta.name) || can.onengine.signal(can, html.MENU, can.request(event, {item: meta.name})) + }, _init: function() {}}) + }, + item: function(can, item, meta, target, data) { item.view = item.view||html.LIST + if (decodeURIComponent(location.hash) == "#"+meta.keys) { + data.main_init = function() { can.onappend._show(can, meta, data) } + } + if (meta.action == ice.AUTO && !location.hash) { + data.main_init = function() { can.onappend._show(can, meta, data) } + } + + can.base.Copy(item, {view: "some", list: [{view: [html.ITEM, html.DIV, meta.name||meta], onclick: function(event) { + can.onappend._show(can, meta, data), can.onkeymap.prevent(event), event.target.nextSibling && can.onmotion.toggle(can, event.target.nextSibling) + }}, {view: html.LIST, _init: function(target) { meta.list && can.onappend.parse(can, meta.list, target, meta.keys, data, html.ITEM) }}], _init: function() {}}) + }, + tabs: function(can, item, meta, target) { + item.list = [{view: "name"}, {view: html.PAGE}], item._init = function(_target, ui) { + can.page.Append(can, ui.page, [{view: html.INPUT, list: [{type: html.INPUT, onkeyup: function(event) { + can.page.Select(can, _target, [html.DIV_PAGE, html.DIV_ITEM], function(item) { + can.page.ClassList.set(can, item, html.HIDE, item.innerText.indexOf(event.target.value) == -1) + }) + }}]}]) + can.core.List(meta.list, function(item, index) { + can.page.Append(can, ui.name, [{view: [html.ITEM, html.DIV, item.name||item], onclick: function(event) { + can.onmotion.select(can, _target, [[html.DIV_PAGE, html.DIV_LIST]], index) + can.onmotion.select(can, ui.name, html.DIV_ITEM, index) + ui.page.scrollTo(0, 0) + }}]) + can.page.Append(can, ui.page, [{view: [html.ITEM, html.DIV, item.name], onclick: function(event) { + can.page.ClassList.neg(can, event.target.nextSibling, html.SELECT) + can.onmotion.select(can, ui.name, html.DIV_ITEM, index) + }}, {view: [html.LIST], _init: function(target) { + can.onappend.parse(can, item.list, target, can.core.Keys(meta.keys, item.name), data, html.ITEM) + }}]) + }) + can.core.Timer(100, function() { var height = target.offsetHeight + can.page.style(can, ui.page, html.HEIGHT, height-10-(meta.style? 0: ui.name.offsetHeight)) + can.page.style(can, _target, html.HEIGHT, height-10) + }), can.page.Select(can, ui.name, html.DIV_ITEM)[0].click() + } + }, + _show: function(can, meta, data) { var target = data.main + if (!meta.index) { return } + var url = can.misc.MergeURL(can, {pod: can.misc.Search(can, "pod"), cmd: meta.index}) + if (meta.action == "push") { return can.user.jumps(url) } + if (meta.action == "open") { return can.user.open(url) } + + location.hash = meta.keys + if (can.onmotion.cache(can, function() { return meta.keys }, target)) { return } + + if (can.base.Ext(meta.index) == nfs.ZML || can.base.Ext(meta.index) == nfs.IML) { + return can.page.Append(can, target, [{type: html.IFRAME, src: "/chat/cmd/"+meta.index, height: target.offsetHeight, width: target.offsetWidth}]) + } + + can.onappend.plugin(can, {index: meta.index, args: can.base.Obj(meta.args)}, function(sub) { + sub.run = function(event, cmds, cb) { can.runActionCommand(event, sub._index||meta.index, cmds, cb) } + sub.ConfHeight(target.offsetHeight-3*html.ACTION_HEIGHT-6*html.PLUGIN_MARGIN), sub.ConfWidth(target.offsetWidth-4*html.PLUGIN_MARGIN) + can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight()) + can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth()) + }, target) }, }) diff --git a/plugin/story/trend.js b/plugin/story/trend.js index 75aa94dc..b3b5341b 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -116,7 +116,7 @@ Volcanos(chat.ONDETAIL, {help: "用户交互", Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["from", "commit", "total", "max", "date", "text", "add", "del"], height: function(can) { var height = can.Action(html.HEIGHT) if (height == ice.AUTO) { height = can.ConfHeight() - can.isFullMode() || (height = can.base.Max(can.ConfHeight(), 600)) + // can.isFullMode() || (height = can.base.Max(can.ConfHeight(), 600)) } if (height < 200) { height = 200 } return parseInt(height||can._root._height/2) diff --git a/plugin/table.js b/plugin/table.js index 71caa737..3e8c3410 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -37,13 +37,13 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }) }, onclick: function(event) { can.onmotion.focus(can, event.target) - }, _init: function(target) { + }, _init: function(target) { zone._search = target can.onmotion.delay(can, function() { can.page.styleWidth(can, target, target.parentNode.parentNode.parentNode.offsetWidth-32) }) }}], target, {}) }}, {view: html.LIST, _init: function(target) { can.ui[zone.name] = zone zone._target = target, zone.refresh = function() { can.onmotion.clear(can, target), zone._init(target) } - can.base.isFunc(zone._init) && zone._init(target) + can.base.isFunc(zone._init) && zone._init(target, zone) }} ]} })) }, @@ -109,7 +109,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar {view: [wiki.TITLE, html.DIV, value.name]}, {view: [wiki.CONTENT, html.DIV, value.text]}, {view: html.ACTION, inner: value.action, onclick: function(event) { - can.runAction(can.request(event, value), event.target.name, []) + can.runAction(can.request(event, value, {_handle: ice.FALSE}), event.target.name, []) }}, ]} })) diff --git a/proto.js b/proto.js index 4ddb2757..14ab0adc 100644 --- a/proto.js +++ b/proto.js @@ -245,6 +245,7 @@ var html = { MENU: "menu", NODE: "node", ZONE: "zone", NAME: "name", LIST: "list", ITEM: "item", + ICON: "icon", HIDE: "hide", SHOW: "show", AUTO: "auto", HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot",