From 03efbdc570ab2c35eb17de05de06f4a97053d995 Mon Sep 17 00:00:00 2001 From: shaoying Date: Thu, 10 Sep 2020 20:58:53 +0800 Subject: [PATCH] opt onmotion.modify --- frame.js | 31 ++++++++++++++++++++------- lib/user.js | 40 +++++++++++++++++------------------ pane/Action.js | 42 ++++++++++++++++++------------------- plugin/input.js | 7 ++++++- plugin/local/code/inner.css | 13 +++++++----- plugin/table.js | 9 +++++--- 6 files changed, 83 insertions(+), 59 deletions(-) diff --git a/frame.js b/frame.js index 542e2830..bc3f8269 100644 --- a/frame.js +++ b/frame.js @@ -189,17 +189,16 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, "project": {name: "研发群", storm: { "studio": {name: "研发 studio", action: [ {name: "route", help: "路由器", index: "web.route"}, - {name: "shell", help: "命令行", index: "ssh.listen"}, {name: "inner", help: "编辑器", index: "web.code.inner", args: ["src/", "main.go"]}, - {name: "status", help: "代码状态", index: "web.code.git.status"}, - {name: "total", help: "代码统计", index: "web.code.git.total"}, - {name: "paste", help: "粘贴板", index: "web.code.tmux.text"}, + {name: "repos", help: "代码库", index: "web.code.git.status"}, + {name: "total", help: "统计量", index: "web.code.git.total"}, {name: "contexts", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, ]}, "cli": {name: "命令 cli", action: [ - {name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]}, - {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, + {name: "ssh", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/base/ssh/ssh.shy"]}, {name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]}, + {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, + {name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]}, {name: "zsh", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/zsh/zsh.shy"]}, ]}, "web": {name: "网页 web", action: [ @@ -709,6 +708,24 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) { }}) Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) { }, + modifys: function(can, target, cb) { var back = target.innerHTML + var ui = can.page.Appends(can, target, [{type: "textarea", value: back, style: {height: "80px"}, onkeydown: function(event) { + switch (event.key) { + case "Enter": + if (event.ctrlKey) { target.innerHTML = event.target.value + if (event.target.value != back) { + cb(event, event.target.value, back) + } + } + break + case "Escape": + td.innerHTML = back + break + } + }, onkeyup: function(event) { + + }}]); ui.first.focus(), ui.first.setSelectionRange(0, -1) + }, modify: function(can, target, cb) { var back = target.innerHTML var ui = can.page.Appends(can, target, [{type: "input", value: back, onkeydown: function(event) { switch (event.key) { @@ -724,7 +741,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) { } }, onkeyup: function(event) { - }}]); ui.input.focus(), ui.input.setSelectionRange(0, -1) + }}]); ui.first.focus(), ui.first.setSelectionRange(0, -1) }, show: function(can, target, time, cb) { time = time || {value: 100, length: 30} can.page.Modify(can, target, {style: {opacity: 0}}) diff --git a/lib/user.js b/lib/user.js index 262a8279..903b954a 100644 --- a/lib/user.js +++ b/lib/user.js @@ -108,32 +108,30 @@ var user = Volcanos("user", {help: "用户模块", if (item.button) { button = can.core.List(item.button, function(item) { return {button: typeof item == "object"? item: [item, function(event) { cbs(event, item) }]} }); return } + + function _init(target) { var pval = "" + if (item.value && item.value.indexOf("@") == 0) { + var pkey = item.value.slice(1).split("=")[0] + if (item.value.indexOf("=") > 0) { + var pval = item.value.slice(1).split("=")[1] + } + + can.require(["/plugin/input/"+pkey], function(can) { + can.core.Item(can.onfigure[pkey], function(key, value) { if (key.startsWith("on")) { + target[key] = function(event) { value(event, can, item, target) } + } }) + target.type != "button" && (target.value = pval) + }) + can.page.Modify(can, target, {autocomplete: "off"}) + } + } return {type: ["tr"], list: [ {type: "td", list: [{text: typeof item == "string"? item: item.length > 0? item[0]: item.name || ""}]}, {type: "td", list: [typeof item == "string"? /* input */ {input: item, data: {autofocus: true}}: item.length > 0? /* select */ {select: [item]}: - item._input == "textarea"? /* textarea */ {type: "textarea", data: item}: + item._input == "textarea"? /* textarea */ {type: "textarea", data: item, _init: _init}: item._input == "select"? /* select */ {select: [[item.name].concat(item.values)], data: item}: - item._input? /* input */ {type: "input", data: (item.type = item._input, item), _init: function(target) { - var pval = "" - if (item.value && item.value.indexOf("@") == 0) { - var pkey = item.value.slice(1).split("=")[0] - if (item.value.indexOf("=") > 0) { - var pval = item.value.slice(1).split("=")[1] - } - } - - - if (item._input == "text" && item.value && item.value.startsWith("@")) { - can.require(["/plugin/input/"+pkey], function(can) { - can.core.Item(can.onfigure[pkey], function(key, value) { if (key.startsWith("on")) { - target[key] = function(event) { value(event, can, item, target) } - } }) - target.type != "button" && (target.value = pval) - }) - can.page.Modify(can, target, {autocomplete: "off"}) - } - }}: /* other */ item, + item._input? /* input */ {type: "input", data: (item.type = item._input, item), _init: _init}: /* other */ item, ]}, ]} })}, diff --git a/pane/Action.js b/pane/Action.js index 98e63f48..03731aa8 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -6,24 +6,25 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, can.onexport._init(can, msg, list, cb, target) }, - _progress: function(can, msg) { - if (msg.Option("_progress")) { - if (msg.Append("count") != msg.Append("total")) { - can.user.toast(can, { - text: "执行进度: "+msg.Append("count")+"/"+msg.Append("total")+"\n"+msg.Append("name"), - title: value.name, - duration: 1100, - progress: parseInt(msg.Append("count"))*100/parseInt(msg.Append("total")), - }) - can.Timer(1000, function() { - var res = can.request({}) - res.Option("_action", _action) - res.Option("_progress", msg.Option("_progress")) - sub.run(res._event, cmds, cb, silent) - }) - return - } + _process: function(can, sub, conf, msg, cmds, cb, silent) { + var p = can.onaction[msg.Option("_process")] + typeof p == "function"? p(can, sub, conf, msg, cmds, cb, silent): typeof cb == "function" && cb(msg) + can.run(msg._event, ["search", "Footer.onaction.ncmd"]) + }, + _progress: function(can, sub, conf, msg, cmds, cb, silent) { + if (msg.Append("size") != "" && msg.Append("size") == msg.Append("total")) { + return typeof cb == "function" && cb(msg) } + can.user.toast(can, { + width: 400, + title: conf.name+" "+msg.Append("step")+"% ", duration: 1100, + text: "执行进度: "+can.base.Size(msg.Append("size")||0)+"/"+can.base.Size(msg.Append("total")||"1000")+"\n"+msg.Append("name"), + progress: parseInt(msg.Append("step")), + }) + can.Timer(1000, function() { + var res = sub.request({}) + sub.run(res._event, cmds, cb, silent) + }) }, add_plugin: function(can, river, storm, value) { if (can.user.Search(can, "river") == river && can.user.Search(can, "storm") == storm && can.user.Search(can, "active") == value.name) { @@ -44,12 +45,9 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, can.Conf("action", value.name) can.Conf("current", sub) // 插件回调 - var toast = can.user.toast(can, "执行中...", value.name) return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { - toast.Close(), can.user.toast(can, "执行成功", value.name, 400) - can.run(msg._event, ["search", "Footer.onaction.ncmd"]) - can.onaction._progress(can, msg) - typeof cb == "function" && cb(msg) + // return typeof cb == "function" && cb(msg) + can.onaction._process(can, sub, value, msg, cmds, cb, silent) }, silent) } sub._target.oncontextmenu = function(event) { diff --git a/plugin/input.js b/plugin/input.js index e8cee4f1..6fe7c7be 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -2,7 +2,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, }, }) Volcanos("onaction", {help: "控件交互", list: [], + "关闭": function(event, can) { can.page.Remove(can, can.sup._target) }, "上传": function(event, can) { can.user.upload(event, can) }, + "刷新": function(event, can) { can.run(event) }, "查看": function(event, can) { can.run(event) }, "返回": function(event, can) { can.sup._history.pop(); var his = can.sup._history.pop(); if (his) { @@ -16,6 +18,10 @@ Volcanos("onaction", {help: "控件交互", list: [], onchange: function(event, can) { if (event.target.tagName == "SELECT") { can.run(event) } }, + ondblclick: function(event, can) { + if (can.Conf("type") == "textarea") { event.target.setSelectionRange(0, -1) } + if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1) } + }, onclick: function(event, can) { var msg = can.sup.request(event) // 插件回调 var name = can.Conf("name") @@ -37,7 +43,6 @@ Volcanos("onaction", {help: "控件交互", list: [], // 通用回调 if (can.Conf("type") == "button") { can.run(event, [name].concat(can.sup.Pack())) } - if (event.target.tagName == "INPUT") { event.target.setSelectionRange(0, -1) } }, onkeydown: function(event, can) { can.onkeypop.show(event, can) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 10636922..2c7ee24d 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -1,3 +1,6 @@ +body.white fieldset.plugin.editor { + background-color:#173d4000; +} fieldset.editor>div.action>div.file { border:solid 2px red; padding:2px; float:left; margin:2px 0; @@ -15,7 +18,7 @@ fieldset.editor>form.option div.item input.args[name=line] { } fieldset.editor>div.output { - background-color:black; + background-color:#173d40cc; } fieldset.editor>div.output div.project { max-height:400px; overflow:auto; @@ -39,7 +42,8 @@ fieldset.editor>div.output div.preview { } fieldset.editor>div.output div.preview>div.item { text-align:right; padding:0 4px; margin:0; - height:20px; border:solid 1px black; + height:20px; + border:solid 1px #173d4000; color:white; } fieldset.editor>div.output div.preview>div.item:hover { @@ -59,11 +63,10 @@ fieldset.editor>div.output div.content { float:left; } fieldset.editor>div.output div.content>pre.item { - text-align:left; - height:20px; border:solid 1px black; + text-align:left; height:20px; + border:solid 1px #173d4000; padding:0; margin:0; padding-left:10px; - background-color:black; color:white; } fieldset.editor>div.output div.content>pre.item.select { diff --git a/plugin/table.js b/plugin/table.js index d312f183..cd0c475f 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -15,14 +15,15 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, return typeof cb == "function" && cb(msg) }, _process: function(can, msg) { - return var process = msg.Option("_process") || can.Conf("feature")["_process"] var cb = can.onaction[process]; typeof cb == "function" && cb(can, msg) + return if (can.onimport._progress(can, msg)) { return true }; can.onimport._refresh(can, msg) }, _progress: function(can, msg) { + return var progress = msg.Option("_progress") || can.Conf("feature")["_progress"] if (progress) { can.page.Select(can, can._output, "td", function(td) { @@ -42,7 +43,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _table: function(can, value, key, index, line, array) { return {type: "td", inner: value, click: function(event) { var target = event.target; if (target.tagName == "INPUT" && target.type == "button") { - var msg = can.sup.request(event); msg.Option(line) + var msg = can.sup.request(event); msg.Option(can.Option()), msg.Option(line) var cb = can.onaction[target.value]; return typeof cb == "function"? cb(event, can, target.value): can.sup.onaction.input(event, can.sup, target.value, function(msg) { can.run({}) }) } @@ -51,7 +52,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, ondblclick: function(event) { - can.onmotion.modify(can, event.target, function(event, value, old) { + can.onmotion[value.indexOf("\n") >= 0 || event.ctrlKey? "modifys": "modify"](can, event.target, function(event, value, old) { + var msg = can.sup.request(event); msg.Option(can.Option()), msg.Option(line) + if (key == "value") { key = line.key } can.run(event, ["action", "编辑", key, value], function(msg) { can.run({}) }, true) }) }, onmouseover: function(event) {