From 0e48f88874e413d43ffec14727c93034b42c0fd2 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Mon, 4 Apr 2022 09:59:50 +0800 Subject: [PATCH] opt inner --- frame.js | 79 +++++++++++--------- lib/core.js | 17 +++++ lib/misc.js | 6 +- lib/page.js | 6 ++ lib/user.js | 4 + page/index.css | 107 +++++++++++++++++++++++++-- page/index.js | 1 + panel/action.js | 26 ++++++- panel/header.js | 31 ++++++-- plugin/local/code/inner.css | 10 ++- plugin/local/code/inner.js | 142 +++++++++++++++++++++++++++--------- plugin/local/code/vimer.css | 6 +- plugin/local/code/vimer.js | 4 +- plugin/table.js | 23 +++++- proto.js | 9 ++- 15 files changed, 369 insertions(+), 102 deletions(-) diff --git a/frame.js b/frame.js index 932f5b36..658c803c 100644 --- a/frame.js +++ b/frame.js @@ -1,4 +1,5 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, list, cb, target) { + Volcanos.meta._load_time = can.base.Time() can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[] return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) } @@ -48,8 +49,13 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin.meta[cmds[2]]) { return can.core.CallFunc(can.onengine.plugin.meta[cmds[2]], {msg: msg, cmds: cmds.slice(3), cb: cb}), true } - if (can.onengine.plugin.meta[cmds[0]]) { - return can.core.CallFunc(can.onengine.plugin.meta[cmds[0]], {msg: msg, cmds: cmds.slice(1), cb: cb}), true + var p = can.onengine.plugin.meta[cmds[0]]; if (p) { + if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { + return can.core.CallFunc(p.meta[cmds[1]], {msg: msg, cmds: cmds.slice(3), cb: cb}), true + } else if (p.meta && p.meta[cmds[0]]) { + return can.core.CallFunc(p.meta[cmds[0]], {msg: msg, cmds: cmds.slice(2), cb: cb}), true + } + return can.core.CallFunc(p, {msg: msg, cmds: cmds.slice(1), cb: cb}), true } return false }, @@ -78,14 +84,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, var type = html.TEXT; command.list = can.core.List(command.list, function(item) { switch (typeof item) { case lang.OBJECT: return type = item.type||type, item - case lang.STRING: - switch (item) { - case mdb.LIST: - case cli.BACK: return {type: type = html.BUTTON, name: item} - case mdb.NAME: return {type: type = html.TEXT, name: item} - case mdb.TEXT: return {type: type = html.TEXTAREA, name: item} - default: return {type: type, name: item} - } + case lang.STRING: return can.core.SplitInput(item) } }), arguments.callee.meta[can.core.Keys("can", name)] = command }), @@ -195,24 +194,15 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list = can.base.Obj(list, can.core.Value(can, [chat.ONACTION, mdb.LIST])) var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) { case "": _list.push(""); break - case "page": - _list.push({type: "text", name: "limit", value: can._msg.Option("limit")}) - _list.push({type: "text", name: "offend", value: can._msg.Option("offend")}) - _list.push("prev", "next") + case mdb.PAGE: + _list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT)}) + _list.push({type: html.TEXT, name: mdb.OFFEND, value: can._msg.Option(mdb.OFFEND)}) + _list.push(mdb.PREV, mdb.NEXT) break default: - if (can.base.isObject(list[i])) { _list.push(list[i]); break } - var ls = can.core.Split(list[i], "\t \n", ":=@"); if (ls.length == 1) { _list.push(list[i]) } else { - var item = {name: ls[0]}; for (var j = 1; j < ls.length; j+=2) { - switch (ls[j]) { - case ":": item.type = ls[j+1]; break - case "=": item.value = ls[j+1]; break - case "@": item.action = ls[j+1]; (function() { - item._init = function(target) { can.onappend.figure(can, item, target) } - })(); break - } - }; _list.push(item) - } + var item = can.core.SplitInput(list[i], html.BUTTON); item.action && (function() { + item._init = function(target) { can.onappend.figure(can, item, target) } + })(), item.type == html.BUTTON? _list.push(list[i]): _list.push(item) } } meta = meta||can.onaction, action = action||can._action, can.onmotion.clear(can, action) @@ -220,6 +210,11 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.base.isString(item)? /*按键*/ {type: html.BUTTON, value: can.user.trans(can, item), onclick: function(event) { var cb = meta[item]||meta["_engine"]; cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) + }, onkeydown: function(event) { + if (event.key == lang.ENTER) { + var cb = meta[item]||meta["_engine"]; cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) + } + }}: item.length > 0? /*列表*/ {type: html.SELECT, name: item[0], values: item.slice(1), onchange: function(event) { var which = item[event.target.selectedIndex+1] can.core.CallFunc(meta[which], [event, can, which]) @@ -228,7 +223,8 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }}: /*其它*/ item, "", action)}), meta }, _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); if (msg.RunAction(event, can, cmds)) { return } - if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { can.request(event, {action: cmds[1]}) + if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]}) + if (can.base.isFunc(meta.feature[cmds[1]])) { return can.core.CallFunc(meta.feature[cmds[1]], {can: can, msg: msg, cmds: cmds.slice(2)}) } return can.user.input(event, can, meta.feature[cmds[1]], function(ev, button, data, list, args) { var msg = can.request(event, {_handle: ice.TRUE}, can.Option()) can.Update(event, cmds.slice(0, 2).concat(args), cb||function() { if (can.core.CallFunc([can.sup, chat.ONIMPORT, ice.MSG_PROCESS], {can: can.sup, msg: msg})) { return } @@ -277,6 +273,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: table.onimport.list}) } + table._args = can.base.ParseURL(table._display) 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) { action === false || table.onappend._action(table, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), action) @@ -293,9 +290,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }) }, - tabs: function(can, list, cb, cbs, action) { action = action||can._action + tabs: function(can, list, cb, cbs, action, each) { action = action||can._action return can.page.Append(can, action, can.core.List(list, function(meta) { return {text: [meta.name, html.DIV, html.TABS], title: meta.text, onclick: function(event) { + can.onmotion.select(can, action, "div.tabs", event.target) can.base.isFunc(cb) && cb(event, meta) }, _init: function(item) { const OVER = "over" function close(item) { var next = item.nextSibling||item.previousSibling @@ -317,6 +315,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, ondragover: function(event) { event.preventDefault(), action._drop(event, event.target) }, ondrop: function(event) { event.preventDefault(), action._drop(event, event.target) }, }), can.core.Timer(10, function() { item.click() }) + can.base.isFunc(each) && each(item) }} })).first }, @@ -339,11 +338,16 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, node = node||{"": target}; can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split) - - node[name] || (node[name] = can.page.Append(can, node[last], [{view: [html.ITEM, html.DIV, value+(index==array.length-1?"":split)], onclick: function(event) { - index < array.length - 1? can.onmotion.toggle(can, node[name]): can.base.isFunc(cb) && cb(event, item) + if (node[name]) { return } + var ui = can.page.Append(can, node[last], [{view: "item", list: [{view: ["switch", "div", (index==array.length-1?"":"⌃")]}, {view: ["name", html.DIV, value+(index==array.length-1?"":"")]}], onclick: function(event) { + index < array.length - 1? can.onmotion.toggle(can, node[name], function() { + can.page.ClassList.add(can, ui["switch"], "open") + }, function() { + can.page.ClassList.del(can, ui["switch"], "open") + }): can.base.isFunc(cb) && cb(event, item) if (node[name].childElementCount == 2) { node[name].firstChild.click() } - }}, {view: html.LIST, style: {display: html.NONE}, _init: function(list) { item.expand && can.page.style(can, list, html.DISPLAY, html.BLOCK) }}]).last) + }}, {view: html.LIST, style: {display: html.NONE}, _init: function(list) { item.expand && can.page.style(can, list, html.DISPLAY, html.BLOCK) }}]) + node[name] = ui.list }) }); return node }, @@ -439,7 +443,15 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, 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): 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) { can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb}) } + sub.run = function(event, cmds, cb) { + if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { + can.core.CallFunc(p.meta[cmds[1]], {msg: can.request(event), cmds: cmds, cb: cb}) + } else if (p.meta && p.meta[cmds[0]]) { + can.core.CallFunc(p.meta[cmds[0]], {msg: can.request(event), cmds: cmds, cb: cb}) + } else { + can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb}) + } + } can.base.isFunc(cbs) && cbs(sub, meta, skip) }, target): /* 后端命令 */ can.run(can.request({}, meta)._event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) { msg.Table(function(value) { can.onappend._plugin(can, value, meta, cbs, target) @@ -545,7 +557,6 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe }, topic: function(can, topic) { topic && (can._topic = topic) can.user.topic(can, can._topic || can.misc.Search(can, chat.TOPIC) || Volcanos.meta.args.topic || (can.base.isNight()? chat.BLACK: chat.WHITE)) - can.page.ClassList.add(can, document.body, can.user.language(can)) }, background: function(can, url, target) { can.page.style(can, target||document.body, html.BACKGROUND, url == "" || url == "void"? "": 'url("'+url+'")') diff --git a/lib/core.js b/lib/core.js index e7fe003e..ec473ec2 100644 --- a/lib/core.js +++ b/lib/core.js @@ -172,6 +172,23 @@ Volcanos("core", {help: "数据结构", return list }), + SplitInput: function(item, type) { if (typeof item == lang.OBJECT) { return item } + type = type||html.TEXT; switch (item) { + case mdb.LIST: return {type: type = html.BUTTON, name: item, action: ice.AUTO} + case cli.BACK: return {type: type = html.BUTTON, name: item} + case mdb.NAME: return {type: type = html.TEXT, name: item} + case mdb.TEXT: return {type: type = html.TEXTAREA, name: item} + default: var ls = this.Split(item, " ", ":=@"), res = {type: type, name: ls[0]}; for (var i = 1; i < ls.length; i += 2) { + switch (ls[i]) { + case ":": res[mdb.TYPE] = ls[i+1]; break + case "=": + if (res[mdb.TYPE] == html.SELECT) { res["values"] = this.Split(ls[i+1]) } else { res["value"] = ls[i+1] } + break + case "@": res[ctx.ACTION] = ls[i+1]; break + } + } return res + } + }, Timer300ms: function(cb) { this.Timer(300, cb) }, Timer300: function(cb) { this.Timer(300, cb) }, Timer3s: function(cb) { this.Timer(3000, cb) }, diff --git a/lib/misc.js b/lib/misc.js index 251af887..6fa7b489 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -7,6 +7,8 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg } return false }, + Display: function(file) { msg.Option(ice.MSG_DISPLAY, file) }, + DisplayStory: function(file) { msg.Option(ice.MSG_DISPLAY, "/plugin/story/"+file) }, OptionStatus: function() { return msg.Option(ice.MSG_STATUS) }, OptionProcess: function() { return msg.Option(ice.MSG_PROCESS) }, OptionOrSearch: function(key) { return can.misc.Search(can, key)||msg.Option(key) }, @@ -74,6 +76,8 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg msg[key].push(can.base.isString(value)||can.base.isFunction(value)? value: JSON.stringify(value)) return msg }, + Status: function(obj) { msg.Option(ice.MSG_STATUS, JSON.stringify(can.core.Item(obj, function(key, value) { return {name: key, value: value} }))) }, + StatusTimeCount: function(obj) { msg.append && msg.Status(can.base.Copy({"time": can.base.Time(), "count": msg.Length()+"x"+msg.append.length}, obj)) }, Echo: function(res) { msg.result = msg.result || [] for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) } return msg._hand = true, msg @@ -172,7 +176,7 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg var val = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) return val && val.length > 0? val[1]: "" }), - SearchOrConf: function(can, key, def) { can.base.getValid(can.misc.Search(can, key), can.Conf(key), def) }, + SearchOrConf: function(can, key, def) { return can.base.getValid(can.misc.Search(can, key), can.Conf(key), def) }, 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] } diff --git a/lib/page.js b/lib/page.js index a37884f0..11c65ede 100644 --- a/lib/page.js +++ b/lib/page.js @@ -422,5 +422,11 @@ Volcanos("page", {help: "用户界面", ClassList: { }) }) }, + + insertBefore: function(can, list, before) { + var item = can.page.Append(can, before.parentNode, list).first + before.parentNode.insertBefore(item, before) + return item + }, }) diff --git a/lib/user.js b/lib/user.js index 9d1518a2..37fb5d28 100644 --- a/lib/user.js +++ b/lib/user.js @@ -50,7 +50,10 @@ Volcanos("user", {help: "用户操作", agent: { title: function(text) { return text && (document.title = Volcanos.meta.args.name||text), document.title }, topic: function(can, name) { + can.user.mod.isCmd && (name += " simple") + can.Conf("display") && (name += " "+can.Conf("display")) can.user.isMobile && (name += " mobile") && can.user.isLandscape() && (name += " landscape") + can.user.language(can) && (name += " "+can.user.language(can)) can.page.Modify(can, document.body, {className: name}) }, language: function(can) { return can.misc.Search(can, "language") }, @@ -269,6 +272,7 @@ Volcanos("user", {help: "用户操作", agent: { }) var msg = can.request(event, {_handle: ice.TRUE}) can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel() + can.onkeymap.prevent(event) }, _target: ui._target, }) if (button === true) { return action.submit(event, can, "submit"), action } diff --git a/page/index.css b/page/index.css index c8611d18..980c07dd 100644 --- a/page/index.css +++ b/page/index.css @@ -30,11 +30,8 @@ table.content tr { background-color:#04272f45; } table.content tr.show { background-color:red; } table.content th { background-color:#0fbd45; padding:2px 6px; } table.content td { padding:2px 6px; } -table.content.action td:last-child, table.content.action th:last-child { -background-color:#7dc6d7eb; - position:sticky; - right:0; -} +table.content tr:first-child { position:sticky; top:2px; } +table.content.action td:last-child, table.content.action th:last-child { background-color:#7dc6d7eb; position:sticky; right:0; } td>input[type=button][name=create] { background-color:blue; } td>input[type=button][name=remove] { background-color:red; } @@ -102,6 +99,7 @@ body>div.carte { background-color:#295b61; color:white; padding:4px; min-width:8 body>div.carte div.item { padding:3px 12px; } body>div.input { background-color:#0d4142a6; padding:5px; } body>div.input div.item { float:left; } +body>div.input tr td:first-child { text-align:center; } body>div.input select { width:183px; margin:5px; } body>div.input input[type=text] { width:171px; margin:5px; } body>div.input input[name=username] { width:171px; } @@ -251,3 +249,102 @@ body.white table.content tr:hover { background-color:#4682b46b; } body.white div.item.select, body.white div.item:hover { background-color:steelblue; } body.white fieldset.float table { color:white; } +div.output.card div.item { + /* background-color:#48959a66; */ + padding:10px; margin:10px; height:120px; float:left; + position:relative; + border:solid 1px #e7e7e7; +} +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; +} +div.output.card div.item>div.operate { + position:absolute; + bottom:10px; +} + +body.simple { background-color:white; } +body.simple fieldset.Header { border-bottom:solid 1px #e7e7e7; height:60px; display:block; } +body.simple fieldset.River { border-right:solid 1px #e7e7e7; } +body.simple fieldset.River>div.output { padding:10px 10px; width:200px; } +body.simple fieldset.River>div.output div.item { color:black; padding:10px 40px; border-left:none; } +body.simple fieldset.River>div.output div.item.select { background-color:white; } +body.simple fieldset.River>div.output div.item:hover { background-color:#0152d9; color:white; } +body.simple fieldset.River>div.output div.list div.item { background-color:white; color:black; border-left:none; } +body.simple fieldset.River>div.output div.list div.item.select { background-color:#0152d9; color:white; } +body.simple fieldset.River>div.output div.list div.item:hover { background-color:#0152d9; color:white; } + +body.simple fieldset.Action { background-color:white; } +body.simple fieldset.Action>div.action { background:white; padding:10px; border-bottom: solid 1px red; height:38px; width:600px; } +body.simple fieldset.Action>div.action div.tabs { padding:10px; margin:10px; } +body.simple fieldset.Action.tabs>div.output { margin-top:58px; } +body.simple fieldset.Action>div.output>fieldset.plugin { box-shadow:none; } +body.simple fieldset.Action>div.output>fieldset.plugin>legend { display:none; } +body.simple fieldset.Action>div.output>fieldset.plugin>form.option { display:none; } +body.simple fieldset.Action>div.output>fieldset.plugin>div.action { display:none; } +body.simple fieldset.Action>div.output>fieldset.plugin>div.status { display:none; } + +body.simple div.output.card div.item { min-width:240px; border-radius:5px; box-shadow:2px 2px 6px 1px gray; } +body.simple div.output.card div.item:hover { background-color:white; box-shadow:5px 5px 10px 5px gray; } +body.simple div.output.card div.item>div.title { border-bottom:solid 1px #e7e7e7; } +body.white.simple div.output.card input[type=button]:hover { box-shadow:2px 2px 8px 2px gray; } +body.white.simple div.output.card input[type=button] { box-shadow:2px 2px 6px 1px gray; } +body.white.simple div.output.card input[type=button] { background-color:#0152d9; font-size:0.8rem; font-weight:100; padding:5px 10px; border:none; border-radius:5px; } + +body.white.simple>div.carte { background-color:white; color:black; border:solid 1px #e7e7e7; } +body.white.simple>div.carte div.item { font-size:1rem; } +body.white.simple>div.carte div.item:hover { background-color:#0152d9; color:white; } + +body.white.simple input[type=button] { background-color:#0152d9; border:none; border-radius:5px; height:31px; box-shadow:2px 2px 6px 1px gray; } +body.white.simple fieldset.panel.cmd>div.output>fieldset.plugin>legend { background-color:white; color:black; border-radius:0px; } + +div.switch { color:#0d1bc2; width:12px; float:left; transform: rotate(90deg) translate(2px, 0px); } +div.switch.open { transform: rotate(180deg) translate(-4px, 1px); } + +body fieldset.inner>div.output td.content>div.tabs { display:none; } +body fieldset.inner>div.output td.content>div.path { display:none; } + +body.simple fieldset.inner>div.output td.content>div.tabs { background:#546E7A; padding:0px; height:38px; overflow:auto; display:block; } +body.simple fieldset.inner>div.output td.content>div.tabs div.tabs { background:#B0BEC5; color:white; font-size:1rem; padding:10px; float:left; } +body.simple fieldset.inner>div.output td.content>div.tabs div.tabs.select { background:#455A64; box-shadow:0px 0px 5px 1px grey; } +body.simple fieldset.inner>div.output td.content>div.path { + background:#455A64; color:white; padding:4px 10px; + margin-bottom:4px; box-shadow:0px 0px 5px 1px #90A4AE; + clear:both; display:block; +} + +body.simple fieldset.inner>div.output td.project div.project { width:240px; } +body.simple fieldset.inner>div.output td.project div.project div.kind { color: white; font-size: 1.2rem; font-family: monospace; height:18px; } +body.simple fieldset.inner>div.output td.project div.project div.kind:first-child { position:sticky; top:0 } +body.simple fieldset.inner>div.output div.content { background-color:#263238; font-size:16px; } +body.simple fieldset.inner>div.output div.toggle { display:none; } + +body.white.simple fieldset.inner>div.output div.project div.action div.item { float:left; width:auto; padding:unset; } +body.white.simple fieldset.inner>div.output div.project { background:lightyellow; } +body.white.simple fieldset.inner>div.output div.project div.item { color:black; font-size:16px; width:-webkit-fill-available; } +body.white.simple fieldset.inner>div.output div.project div.item:hover { background:#e3e6f1; } +body.white.simple fieldset.inner>div.output div.content { background-color:white; font-size:16px; } +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.text { border:solid 1px #e7e7e7; } +body.white.simple fieldset.inner>div.output div.content td.line { background-color:white; color:#237893; padding-top:4px; border-right:none; } +body.white.simple fieldset.inner>div.output div.content td.text { color:black; padding-top:2px; border:solid 1px white; } +body.white.simple fieldset.inner>div.output div.content td.text span.string { color:#a31515; } +body.white.simple fieldset.inner>div.output div.content td.text span.function { color:#795e26; } +body.white.simple fieldset.inner>div.output div.content td.text span.keyword { color:blue; } +body.white.simple td.content>div.content { background: white; box-shadow:0px 0px 5px 1px grey; } +body.white.simple div.status { color:black; } + +body.white fieldset.inner>div.output td.content>div.tabs { background:#f3f3f3; } +body.white fieldset.inner>div.output td.content>div.tabs div.tabs { background:#ececec; color:black; font-size:1rem; padding:10px; float:left; } +body.white fieldset.inner>div.output td.content>div.tabs div.tabs.select { background: white; box-shadow:0px 0px 5px 1px grey; } +body.white fieldset.inner>div.output td.content>div.path { background:white; color:black; box-shadow:0px 0px 5px 1px grey; } +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.simple fieldset.plugin div.output.json div.item span.string { color:magenta; } + diff --git a/page/index.js b/page/index.js index c17bd35e..1740fe82 100644 --- a/page/index.js +++ b/page/index.js @@ -19,6 +19,7 @@ Volcanos({name: "chat", panels: [ {name: "vimer", help: "编辑器", index: "web.code.vimer"}, {name: "repos", help: "代码库", index: "web.code.git.status"}, {name: "plan", help: "任务表", index: "web.team.plan"}, + {name: "todo", help: "待办项", index: "web.team.todo"}, {name: "ctx", help: "上下文", index: "web.wiki.word"}, ]}, }}, diff --git a/panel/action.js b/panel/action.js index 337b45ee..141879d1 100644 --- a/panel/action.js +++ b/panel/action.js @@ -1,5 +1,4 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) { - can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout||"auto", true) var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM) can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { item.height = can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y) @@ -10,7 +9,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) can.onappend.plugin(can, item, function(sub, meta, skip) { can.onimport._plugin(can, river, storm, sub, meta), skip || next() }) - }, function() { can.onimport._menu(can, msg), can.onkeymap._init(can) }) + }, function() { + can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)||Volcanos.meta.args.layout||"auto", true) + can.onimport._menu(can, msg), can.onkeymap._init(can) + }) }, _plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta sub.run = function(event, cmds, cb) { var msg = sub.request(event) @@ -98,14 +100,30 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, t }}]) } + can.onengine.plugin(can, "cookie", shy("提示", {}, ["text", "list", "back"], function(msg, cmds) { + can.core.Item(can.misc.Cookie(can), function(key, value) { + msg.Push("key", key) + msg.Push("value", value) + }) + })) + can.onengine.plugin(can, "alert", shy("提示", {}, ["text", "list", "back"], function(msg, cmds) { + can.user.alert(cmds[0]) + })) can.onengine.plugin(can, "info", shy("信息", {}, ["text", "list", "back"], function(msg, cmds) { - msg.Echo(JSON.stringify(can)) + msg.Echo("hello world") })) can.onengine.plugin(can, "log", shy("日志", {}, ["text", "list", "back"], function(msg, cmds) { console.log(cmds[0]) })) + + can.onengine.plugin(can, "nfs.save", shy("保存文件", {}, ["file=hi.txt", "text:textarea='hello world'", "save:button"], function(msg, cmds, cb) { + can.misc.runAction(can, msg, cmds, cb, kit.Dict( + "save", function(cmds) { can.user.downloads(can, cmds[1], cmds[0]) } + )) + })) + can.onengine.plugin(can, "pie", shy("比例图", {}, ["list", "back"], function(msg, cmds) { - msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js") + msg.DisplayStory("pie.js") msg.Push("value", 200) msg.Push("value", 300) msg.Push("value", 400) diff --git a/panel/header.js b/panel/header.js index d0927cd2..24231a07 100644 --- a/panel/header.js +++ b/panel/header.js @@ -1,15 +1,30 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) { can.Conf(aaa.USERNICK, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNICK)) + can.onengine.plugin(can, "topic", shy("主题", { + "demo": function(can, msg, cmds) { can.onlayout.topic(can, cmds[0]) }, + }, ["topic:select=white,black", "run:button", "demo:button"], function(msg, cmds) { + can.onlayout.topic(can, cmds[0]) + })) + + can.onlayout.topic(can, can.Conf("topic")) + if (can.user.mod.isCmd) { + can.onmotion.hidden(can, can._fields) + can.page.ClassList.add(can, document.body, "simple") + } + can.onmotion.clear(can) can.onimport._agent(can, msg, target) can.onimport._grant(can, msg, target) - can.onimport._title(can, msg, target) - can.onimport._state(can, msg, target) - can.onimport._search(can, msg, target) - can.onimport._background(can, msg, target) - can.onimport._avatar(can, msg, target) - can.onimport._menus(can, msg, target) + if (can.Conf("display") != "simple") { + can.onimport._title(can, msg, target) + can.onimport._state(can, msg, target) + can.onimport._search(can, msg, target) + can.onimport._background(can, msg, target) + can.onimport._avatar(can, msg, target) + can.onimport._menus(can, msg, target) + + } can.base.isFunc(cb) && cb(msg) }, _agent: function(can, msg, target) { @@ -61,7 +76,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }}] }]) can.user.isMobile && can.page.Modify(can, ui, {style: {float: html.RIGHT}}) }, - _background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } + _background: function(can, msg) { + if (can.Conf("background") == "_") { return } + if (can.user.isExtension || can.user.isLocalFile) { return } msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body) }, _avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index ff4a1f48..fe5a2421 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -6,18 +6,22 @@ fieldset.inner>div.action>div.tabs:hover { background-color:#013b675c; } fieldset.inner>div.action>div.tabs.select { background-color:#013b675c; border-bottom:solid 2px #7999b2; font-size:1rem; height:19px; } fieldset.inner>div.output { color:white; } -fieldset.inner>div.output div.content { color:white; font-size:1.2rem; font-family:monospace; position:relative; } +fieldset.inner>div.output td.project div.project { width:180px; } +fieldset.inner>div.output div.project div.kind { background-color:cornflowerblue; color:black; text-align:center; padding:10px; clear:both; } +fieldset.inner>div.output div.project div.item div.name { padding:0 16px; } +fieldset.inner>div.output div.content { color:white; font-size:1.1rem; 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:hover { background-color:green; } -fieldset.inner>div.output div.content td.line { text-align:right; padding:0 6px; border-right:solid 2px red; } -fieldset.inner>div.output div.content td.text { text-align:left; white-space:pre; padding-left:10px; height:20px; } +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.text { text-align:left; 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; } fieldset.inner>div.output div.content td.text span.datatype { color:lightgreen; font-weight:bold; } fieldset.inner>div.output div.content td.text span.function { color:cyan; font-weight:bold; } 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 div.content legend { margin-right:4px; height:30px; float:left; } fieldset.inner>div.output div.profile>div.output>fieldset>legend { padding:0.1rem; float:left; } fieldset.inner>div.output div.display { border:solid 1px greenyellow; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index d91da92f..93742f10 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,7 +1,27 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) { - can.onengine.plugin(can, "can.code.inner.plugin", shy("插件", {}, [{type: "button", name: "list", action: "auto"}, "back"], function(msg, cmds) { + can.onengine.plugin(can, "can.code.inner.plugin", shy("插件", {}, [ice.LIST, ice.BACK], function(msg, cmds) { console.log("what") })) + + can.onengine.plugin(can, "can.code.inner.keymap", shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(msg, cmds) { + can.core.Item(can.onkeymap._mode, function(mode, value) { + (!cmds[0] || cmds[0] == mode) && can.core.Item(value, function(key, func) { + if (cmds[0] == mode && cmds[1] == key) { + msg.Push("key", "mode") + msg.Push("value", mode) + msg.Push("key", "key") + msg.Push("value", key) + msg.Push("key", "help") + msg.Push("value", func.help) + msg.Push("key", "func") + msg.Push("value", func.toString()) + } else if (!cmds[0] || !cmds[1]) { + func.help && msg.Push(kit.Dict("mode", mode, "key", key, "help", func.help)) + } + }) + }), msg.StatusTimeCount() + })) + can.onengine.listen(can, "orientationchange", function(event) { if (can.user.mod.isCmd) { can.ConfHeight(window.innerHeight), can.ConfWidth(window.innerWidth) } can.user.toast(can, can.ConfHeight()+"") @@ -10,13 +30,17 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target var paths = can.core.Split(can.Option(nfs.PATH), ice.FS); can.Option(nfs.PATH, paths[0]) var files = can.core.Split(can.Option(nfs.FILE), ice.FS); can.Option(nfs.FILE, files[0]) - can.tabview = can.tabview||{}, can.tabview[can.onexport.keys(can)] = msg + // can.tabview = can.tabview||{}, can.tabview[can.onexport.keys(can)] = msg + can.tabview = can.tabview||{} can.history = can.history||[], can.toolkit = {}, can.extentions = {}, can.profile_size = {} can.onmotion.clear(can), can.onlayout.profile(can) can.onimport._project(can, can.ui.project) can.onimport._profile(can, can.ui.profile) can.onimport._display(can, can.ui.display) + + can.ui._tabs = can.page.insertBefore(can, [{view: "tabs"}], can.ui.content) + can.ui._path = can.page.insertBefore(can, [{view: "path"}], can.ui.content) can.base.isFunc(cb) && cb(msg) can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) @@ -25,7 +49,8 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.onmotion.delay(can, function() { can.core.Next(files.slice(1), function(file, next) { can.onimport.tabview(can, can.Option(nfs.PATH), file, can.Option(nfs.LINE), next) - }, function() { can.onimport.tabview(can, paths[0], files[0]) }) + // }, function() { can.onimport.tabview(can, paths[0], files[0]) }) + }) }) }) can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can.ui.project) @@ -97,9 +122,35 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, project: function(can, path, cb) { can.onmotion.clear(can, can.ui.project) + // can.onappend._action(can, ["执行", "预览", "保存"], can.page.Append(can, can.ui.project, [{view: "action"}]).first, { + // "执行": function(event) { can.onaction["执行"](event, can) }, + // "预览": function(event) { can.onaction["展示"](event, can) }, + // "保存": function(event) { can.onaction["保存"](event, can) }, + // }) + // can.page.Append(can, can.ui.project, [{view: "item", list: [{type: "input", data: {type: "text"}, onkeyup: function(event) { + // can.page.Select(can, can.ui.project, "div.item", function(item) { + // if (item.innerText.indexOf(event.target.value) == -1) { + // can.page.ClassList.add(can, item, "hide") + // } else { + // can.page.ClassList.del(can, item, "hide") + // } + // }) + // }} ]}, ]) + var project = can.page.Append(can, can.ui.project, [ + {view: "kind", inner: "projects", onclick: function(event) { + can.onmotion.toggle(can, event.target.nextSibling) + }}, {view: "projects"}, + {view: "kind", inner: "icebergs", onclick: function(event) { + can.onmotion.toggle(can, event.target.nextSibling) + }}, {view: "icebergs"}, + {view: "kind", inner: "volcanos", onclick: function(event) { + can.onmotion.toggle(can, event.target.nextSibling) + }}, {view: "volcanos"}, + ]) + can.core.Next(path, function(path, next, index, array) { - var list = can.ui.project; if (array.length > 1) { - var ui = can.page.Append(can, can.ui.project, [{view: [html.ITEM, html.DIV, path], onclick: function(event) { + var list = project.projects; if (array.length > 1) { + var ui = can.page.Append(can, project.projects, [{view: [html.ITEM, html.DIV, path], onclick: function(event) { can.onmotion.toggle(can, ui.list) }}, {view: html.LIST}]); list = ui.list if (index > 0) { ui.item.click() } @@ -111,6 +162,16 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, list), can.onimport.layout(can), can.Status("文件数", msg.Length()), next() }, true) }, function() { can.base.isFunc(cb) && cb() }) + + can.run(can.request({}, {fields: "index"})._event, [ctx.ACTION, ctx.COMMAND, "search", "command"], function(msg) { + can.onappend.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) { + can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX) + }, project.icebergs) + }) + + can.onappend.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) { + can.onimport.tabview(can, can.Option(nfs.PATH), "can."+item.index, ctx.INDEX) + }, project.volcanos) }, tabview: function(can, path, file, line, cb, skip, skip2) { var key = can.onexport.keys(can, file, path) if (!skip && can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file) @@ -121,9 +182,12 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target function show(msg) { can.tabview[key] = msg var skip2 = skip - msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) { + msg._tab = can.onappend.tabs(can, [{name: file.split(msg.Option(nfs.LINE) == ctx.INDEX? ice.PT: ice.PS).pop(), text: file}], function(event, meta) { can.onimport.tabview(can, path, file, "", cb, false, skip2), cb = null, skip2 = false - }, function(item) { delete(can.tabview[key]) }) + }, function(item) { delete(can.tabview[key]) }, can.ui._tabs, function(item) { + can.page.Modify(can, item, {onmouseenter: function(event) { + }}) + }) } can.Option({path: path, file: file, line: line||1}) @@ -189,33 +253,29 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, target) }, layout: function(can) { - var height = can.ConfHeight()-(can.user.isMobile && can.user.mod.isCmd? (can.user.isLandscape()? 14: 54): 0)-(can.user.isWindows? 20: 0), - width = can.ConfWidth()-(can.user.isWindows && !can.user.mod.isCmd? 20: 0)+(can.user.isMobile && can.user.mod.isCmd && can.user.isLandscape()? 16: 0) - if (!height || height > window.innerHeight) { height = window.innerHeight - 200 } - if (can.user.isMobile && can.user.isLandscape() && height < 200) { height = 200 } - + var width = can.ConfWidth()+(can.user.isMobile && can.user.mod.isCmd && can.user.isLandscape()? 16: 0)-(can.user.isWindows && !can.user.mod.isCmd? 20: 0) can.page.styleWidth(can, can.ui.profile_output, can.profile_size[can.onexport.keys(can)]||(width-can.ui.project.offsetWidth)/2) can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth) can.page.styleWidth(can, can.ui.display, width-can.ui.project.offsetWidth) - if (!height) { return } - can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height) - if (can.ui.project.style.display != html.NONE) { - if (!can.user.mod.isCmd && can.ui.display.style.display != html.NONE) { - can.page.styleHeight(can, can.ui.project, can.ui.content.offsetHeight+can.ui.display.offsetHeight+html.ACTION_HEIGHT) + var height = can.ConfHeight()-(can.user.isMobile && can.user.mod.isCmd? (can.user.isLandscape()? 14: 54): 0)-(can.user.isWindows? 20: 0) + if (!height || height > window.innerHeight) { height = window.innerHeight - 200 } + if (can.user.isMobile && can.user.isLandscape() && height < 200) { height = 200 } + + var rest = can.ui.display.offsetHeight+can.ui._path.offsetHeight+can.ui._tabs.offsetHeight+5 + if (can.user.mod.isCmd) { can.page.styleHeight(can, can.ui.project, height+2*html.ACTION_HEIGHT) + can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-rest) + can.page.styleHeight(can, can.ui.profile_output, can.ui.project.offsetHeight-html.ACTION_HEIGHT-2) + } else { + can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height) + can.page.styleHeight(can, can.ui.project, can.ui.content.offsetHeight+rest) + 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.project, can.ui.content.offsetHeight) + can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT-2) } } - if (can.user.mod.isCmd) { - can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight) - } - 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-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, @@ -239,6 +299,12 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, }, [""]) Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb, skip) { + if (msg.Option(ctx.INDEX)) { + can.ui._path.innerText = msg.Option(nfs.FILE) + } else { + can.ui._path.innerText = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE)) + } + if (can.onmotion.cache(can, function(cache_data) { can.file && (cache_data[can.file] = {current: can.current, max: can.max, profile_display: can.ui.profile.style.display, display_display: can.ui.display.style.display, @@ -250,6 +316,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}}) can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}}) can.onmotion.select(can, can._action, html.DIV_TABS, msg._tab) + can.onmotion.select(can, can.ui._tabs, html.DIV_TABS, msg._tab) can.onmotion.delay(can, function() { can.onimport.layout(can) msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }) @@ -260,6 +327,9 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], if (msg.Option(ctx.INDEX)) { can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { + can.onimport.layout(can) + can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(can.ui.content.offsetWidth)) + can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT)) can.onmotion.delay(can, function() { can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }), can.base.isFunc(cb) && cb() @@ -276,6 +346,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], p && p.render && can.onaction["展示"]({}, can) p && p.engine && can.onaction["执行"]({}, can) } + can.onimport.layout(can) if (!can.page.ClassList.has(can, can._fields, chat.STORY) && !can.user.mod.isCmd) { can.page.style(can, can.ui.project, html.MIN_HEIGHT, can.ConfHeight()-200) can.page.style(can, can.ui.content, html.MIN_HEIGHT, can.ConfHeight()-200) @@ -323,21 +394,20 @@ Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target _insert: function(event, can) {}, _mode: { plugin: { - 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, "扩展") }, + Escape: shy("清屏", function(event, can) { can.actions(event, "清屏") }), + g: shy("搜索", function(event, can) { can.actions(event, "搜索") }), + f: shy("打开文件", function(event, can) { can.actions(event, "打开") }), + t: shy("添加命令", function(event, can) { can.actions(event, "添加") }), + p: shy("添加插件", function(event, can) { can.actions(event, "插件") }), + e: shy("添加扩展", function(event, can) { can.actions(event, "扩展") }), 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, "全屏") }, + r: shy("执行命令", function(event, can) { can.actions(event, "执行") }), + v: shy("展示", function(event, can) { can.actions(event, "展示") }), + a: shy("全屏", 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.css b/plugin/local/code/vimer.css index c9bd4d4b..d6a2e82e 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -1,7 +1,7 @@ fieldset.vimer>div.output input.current { background-color:#00000000; color:#00000000; font-size:1em; font-family:monospace; - padding:0; padding-left:9px; margin:0; margin-top:-2px; position:absolute; left:0; - width:-webkit-fill-available; + padding:0; padding-left:11px; border:none; outline:none; margin:0; margin-top:-1px; + height:22px; position:absolute; } -fieldset.vimer>div.output input.current.insert { caret-color:yellow; } +fieldset.vimer>div.output input.current.insert { caret-color:black; } fieldset.vimer>div.output input.current.normal { caret-color:blue; } diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index cd3804f5..4ec7d343 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -18,12 +18,14 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, _input: function(can) { can.ui.current = can.page.Append(can, can.ui.content.parentNode, [ - {view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return } + {view: ["current", html.INPUT], spellcheck: false, onkeydown: function(event) { if (event.metaKey) { return } can.misc.Debug("key", event.key) can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current) can.mode == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) }) can.mode == "normal" && can.Status("按键", can._keylist.join("")) can.mode == "normal" && can.onkeymap.prevent(event) + }, onfocus: function(event) { + can.page.styleWidth(can, can.ui.current, can.ui.content.style.width) }, onclick: function(event) { can.onkeymap._insert(event, can) }, ondblclick: function(event) { var target = event.target can.onaction.searchLine(event, can, target.value.slice(target.selectionStart, target.selectionEnd)) diff --git a/plugin/table.js b/plugin/table.js index c1324195..4ada0a73 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,16 +1,31 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) { - can.onmotion.clear(can, target) + can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can._action) + can.onmotion.clear(can, target), can.base.isFunc(cb) && cb(msg) + var cbs = can.onimport[can._args["style"]]; if (can.base.isFunc(cbs)) { + can.page.ClassList.add(can, target, can._args["style"]) + return cbs(can, msg, target) + } can.onappend.table(can, msg, null, target) can.onappend.board(can, msg, target) - can.onmotion.story.auto(can) - can.base.isFunc(cb) && cb(msg) - can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can._action) + can.onmotion.story.auto(can, target) }, _process: function(can, msg) { msg.Option(ice.MSG_TOAST) && can.user.toast(can, msg.Option(ice.MSG_TOAST)) return can.core.CallFunc([can.onimport, msg.Option(ice.MSG_PROCESS)], [can, msg]) }, + card: function(can, msg, target) { + can.page.Append(can, target, msg.Table(function(value) { + return {view: "item", list: [ + {view: ["title", "div", value.name]}, + {view: ["content", "div", value.text]}, + {view: "operate", inner: value.action, onclick: function(event) { + can.request(event, value) + can.run(event, [ctx.ACTION, event.target.name]) + }}, + ]} + })) + }, }) Volcanos("onaction", {help: "控件交互", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/proto.js b/proto.js index 033c2e78..db4f362c 100644 --- a/proto.js +++ b/proto.js @@ -13,9 +13,9 @@ var ice = { OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process", - AUTO: "auto", HELP: "help", HTTP: "http", - VIEW: "view", MODE: "mode", SHIP: "ship", - COPY: "copy", SHOW: "show", HIDE: "hide", + AUTO: "auto", LIST: "list", BACK: "back", EXEC: "exec", + SHOW: "show", HIDE: "hide", HELP: "help", HTTP: "http", + VIEW: "view", MODE: "mode", SHIP: "ship", COPY: "copy", MSG_DETAIL: "detail", MSG_OPTION: "option", @@ -92,7 +92,8 @@ var mdb = { UPLOAD: "upload", SEARCH: "search", ENGINE: "engine", RENDER: "render", PLUGIN: "plugin", - NEXT: "next", PREV: "prev", PAGE: "page", MAIN: "main", + PAGE: "page", NEXT: "next", PREV: "prev", LIMIT: "limit", OFFEND: "offend", + MAIN: "main", FOREACH: "*", RANDOMS: "%", }