diff --git a/frame.js b/frame.js index 85c80fcb..fded72ed 100644 --- a/frame.js +++ b/frame.js @@ -289,7 +289,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, if (typeof key == "object") { return sub.core.Item(key, sub.Option), key } if (key == undefined) { value = {} sub.page.Select(sub, option, "select.args,input.args,textarea.args", function(item) { - value[item.name] = item.value + item.name && item.value && (value[item.name] = item.value) }) return value } @@ -333,28 +333,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, CloneInput: function() { add(item, function() {})._target.focus() }, CloneField: function() { can.Clone() }, }, Volcanos.meta.libs.concat([item.display||"/plugin/input.js", "/frame.js"]), function(input) { input.sup = can - input.run = function(event, cmds, cb, silent) { var msg = can.request(event) - var prefix = []; can.onkeypop.show({key: meta.name[0]}, can) - switch (item.name) { - case "打开": - case "查看": - break - case "返回": - can._history.pop(); var his = can._history.pop(); if (his) { - can.page.Select(can, can._option, "input.args", function(item, index) { - item.value = his[index] || "" - }) - } - break - case "清空": - can._output.innerHTML = "" - return typeof cb == "function" && cb(can.request(event)) - default: - cmds && cmds[0] == "action" || prefix.push(item.name||item.value) - } - - msg.Option(can.Conf("option")) - return can.onappend._output(can, meta, event, prefix.concat(can.Pack(cmds)), cb, silent) + input.run = function(event, cmds, cb, silent) { + var msg = can.request(event); msg.Option(can.Conf("option")) + return can.onappend._output(can, meta, event, can.Pack(cmds), cb, silent) } input.onimport && input.onimport._init(input, input.Conf(item), item.list||[], function() {}, input._target) @@ -401,7 +382,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, _target: can._output, _option: can._option, _action: can._action, _output: can._output, _status: can._status, _fields: can._target, Option: can.Option, Action: can.Action, Status: can.Status, }, Volcanos.meta.libs.concat([display, "/frame.js"]), function(table) { table.Conf(can.Conf()), table._msg = msg - table.run = function(event, cmds, cb, silent) { var msg = can.request(event) + table.sup = can, table.run = function(event, cmds, cb, silent) { var msg = can.request(event) can.core.Item(can.Conf("option"), msg.Option) return can.onappend._output(can, meta, event, can.Pack(cmds), cb, silent) } @@ -534,63 +515,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return target }, table: function(can, target, type, msg, cb) { - var table = can.page.AppendTable(can, target, msg, msg.append, cb || function(value, key, index, line) { - function run(event, item, value) { - var msg = can.request(event); msg.Option(can.Option()), msg.Option(line) - var toast = can.user.toast(can, item+"中...", item, 1000000) - - var cb = can.onaction[item] || can.onaction["运行"] - cb? cb(event, can, item): can.run(event, ["action", item, key=="value"? line.key: key, value.trim()], function(res) { - toast.Close(), can.user.toast(can, item+"成功"), can.run({}) - }, true) - } - return {type: "td", inner: value, click: function(event) { - var target = event.target; if (target.tagName == "INPUT" && target.type == "button") { - if (can.Conf("feature")[target.value]) { - // 输入参数 - can.user.input(event, can, can.Conf("feature")[target.value], function(event, button, data, list) { - var msg = can.request(event); msg.Option(can.Option()), msg.Option(line), msg.Option(data) - var args = ["action", target.value]; can.core.Item(data, function(key, value) { - key && value && args.push(key, value) - }) - - can.run(event, args, function(msg) { - can.user.toast(can, target.value+"成功"), can.run({}) - }, true) - return true - }) - return - } - return run(event, event.target.value, value) - } - - can.page.Select(can, can._option, "input.args", function(input) { if (input.name == key) { var data = input.dataset || {} - // 补全参数 - input.value = value, typeof cb == "function" && cb(event, value); if (data.action == "auto") { - var msg = can.request(event); msg.Option(can.Option()), msg.Option(line) - can.Option("_action", msg.Option("_action")) - can.run(event) - } - } }) - }, ondblclick: function(event) { - can.onmotion.modify(can, event.target, function(event, value, old) { - run(event, "编辑", value) - }) - }, oncontextmenu: function(event) { - can.user.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail") || can.ondetail.list, function(event, item, meta) { - switch (item) { - case "编辑": - can.onmotion.modify(can, event.target, function(event, value, old) { - run(event, "编辑", value) - }) - break - default: - run(event, item, value) - } - }) - }, } - }) - return table + return can.page.AppendTable(can, target, msg, msg.append, cb) }, board: function(can, target, type, msg, text) { text = text || can.page.Display(msg.Result()) return text && can.page.Append(can, target, [{view: ["code", "div", text]}]).code diff --git a/index.css b/index.css index bc6a122c..ff893038 100644 --- a/index.css +++ b/index.css @@ -270,6 +270,12 @@ body.white input[type=button] { background-color:#FF9900; color:white; } +body.white table input[type=button][value=结束] { + background:red; +} +body.white table input[type=button][value=启动] { + background:#52ce78; +} body.white input[type=button]:hover { border-radius:10px 10px 10px 10px; border:2px solid #FFCC33; @@ -377,6 +383,9 @@ body.white fieldset.Action fieldset.plugin div.item input[type=button] { body.white fieldset.Action fieldset.plugin div.item input { box-shadow: 4px 4px 10px 1px #626bd0; } +body.white fieldset.Action fieldset.plugin div.item input[name=cmd] { + width:160px; +} body.white fieldset.Action fieldset.plugin div.item select { box-shadow: 4px 4px 10px 1px #626bd0; margin-top:-2px; diff --git a/lib/page.js b/lib/page.js index 20bfa094..36c1b99a 100644 --- a/lib/page.js +++ b/lib/page.js @@ -199,9 +199,9 @@ var page = Volcanos("page", {help: "网页模块", } }); - can.page.Append(can, table, can.core.List(msg.Table(), function(line, index) { + can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) { return {type: "tr", dataset: {index: index}, list: can.core.List(list, function(key) {if (key.indexOf("_") == 0) {return} - return cb(can.page.Display(line[key]).trim(), key, index, line) + return cb(can.page.Display(line[key]).trim(), key, index, line, array) })} })) return table; diff --git a/pane/Action.js b/pane/Action.js index a88fdc2b..98e63f48 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -6,6 +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 + } + } + }, 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) { value.args = can.core.List(value.inputs, function(item) { @@ -19,36 +38,18 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, var opt = {pod: can.user.Search(can, "pod"), river: river, storm: storm, active: value.name} can.core.Item(sub.Option(), function(key, value) { opt[key] = value }) location.href = can.user.Share(can, opt, true) - } - sub.run = function(event, cmds, cb, silent) { var msg = can.request(event) - var _action = msg.Option("_action") + sub.run = function(event, cmds, cb, silent) { var msg = can.request(event); cmds = cmds || [] can.Conf("active", sub.Option()) 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) - 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 - } - } - can.user.toast(can, "执行成功", value.name, 400) }, silent) } sub._target.oncontextmenu = function(event) { diff --git a/plugin/input.js b/plugin/input.js index 767ea6c6..e8cee4f1 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,47 +1,50 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, output, action, option, field) { +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { }, }) Volcanos("onaction", {help: "控件交互", list: [], + "上传": function(event, can) { can.user.upload(event, can) }, + "查看": function(event, can) { can.run(event) }, + "返回": function(event, can) { + can.sup._history.pop(); var his = can.sup._history.pop(); if (his) { + can.page.Select(can, can._option, "input.args", function(item, index) { + item.value = his[index] || "" + }) + } + can.run(event) + }, + onchange: function(event, can) { if (event.target.tagName == "SELECT") { can.run(event) } }, - onclick: function(event, can) { var name = can.Conf("name") - var msg = can.sup.request(event) - // 前端回调 - var sub = can.sup && can.sup._outputs && can.sup._outputs[can.sup._outputs.length-1] + onclick: function(event, can) { var msg = can.sup.request(event) + // 插件回调 + var name = can.Conf("name") + var sub = can.sup._outputs && can.sup._outputs[can.sup._outputs.length-1] var cb = sub && sub.onaction && sub.onaction[name] if (typeof cb == "function") { return cb(event, sub, name) } - // 通用回调 - var cb = can.onaction[name] - if (can.sup && typeof cb == "function") { return cb(event, can.sup, name) } - - // 后端回调 + // 交互回调 var feature = can.sup.Conf("feature") var input = feature && feature[name]; if (input) { - return can.user.input(event, can, input,function(event, button, data, list) { - var msg = can.request(event); msg.Option(can.sup.Option()) - var args = ["action", name]; can.core.Item(data, function(key, value) { - key && value && args.push(key, value) - }) - can.run(event, args, function(msg) { can.run(event) }, true) - return true + return can.sup.onaction.input(event, can.sup, name, function(msg) { + can.run({}) }) } + // 控件回调 + var cb = can.onaction[name] + if (typeof cb == "function") { return cb(event, can, name) } + // 通用回调 - if (can.Conf("type") == "button") { can.run(event) } + 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) switch (event.key) { case "Enter": - if (event.target.tagName == "TEXTAREA") { - break - } - if (event.target.tagName == "INPUT") { - can.run(event) - } + if (event.target.tagName == "INPUT") { event.target.setSelectionRange(0, -1), can.run(event) } + if (event.target.tagName == "TEXTAREA") { break } event.stopPropagation() event.preventDefault() break @@ -53,13 +56,12 @@ Volcanos("onaction", {help: "控件交互", list: [], onkeyup: function(event, can) { switch (event.key) { case "Enter": + if (event.target.tagName == "TEXTAREA") { break } event.stopPropagation() event.preventDefault() break default: return } }, - - "上传": function(event, can) { can.user.upload(event, can) }, }) diff --git a/plugin/input/key.js b/plugin/input/key.js index e9cdad62..2f46df81 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,25 +1,24 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: {onclick: function(event, can, item, target) { - function run() { var msg = can.request(event); msg.Option(item) - can.page.Select(can, event.target.parentNode.parentNode.parentNode, "input", function(item) { - msg.Option(item.name, item.value) - }) + function run() { var msg = can.request(event); msg.Option(can.Option()) can.run(event, ["action", "inputs", item.name, target.value], function(msg) { if (!msg.append) { return } - var figure = can.onappend.field(can, document.body, "input key", {}) - can.page.Modify(can, figure.fieldset, {style: {top: event.clientY+10, left: event.clientX}}) - can.page.Remove(can, figure.legend) + can._figure && can.page.Remove(can, can._figure.fieldset) + can._figure = can.onappend.field(can, document.body, "input key", {}) - can.page.Append(can, figure.action, [ + can.page.Modify(can, can._figure.fieldset, {style: {top: event.clientY+10, left: event.clientX}}) + can.page.Remove(can, can._figure.legend) + + can.page.Append(can, can._figure.action, [ {button: ["清空", function(event) { target.value = "" }]}, - {button: ["关闭", function(event) { can.page.Remove(can, figure.fieldset) }]}, + {button: ["关闭", function(event) { can.page.Remove(can, can._figure.fieldset) }]}, ]) - can.page.AppendTable(can, figure.output, msg, msg.append, function(value, key, index, line) { + can.page.AppendTable(can, can._figure.output, msg, msg.append, function(value, key, index, line) { return {type: "td", inner: value, onclick: function() { target.value = value; msg.Option("_refresh") && run() - can.page.Remove(can, figure.fieldset) + can.page.Remove(can, can._figure.fieldset) }} }) }, true) diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index e773d361..5c494cc6 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -9,6 +9,14 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) return typeof cb == "function" && cb(msg) }, + table: function(can, list, target) { + can.page.Select(can, target, "td", function(item) { + item.title = "点击复制" + item.onclick = function(event) { + can.user.copy(can, item.innerText) + } + }) + }, spark: function(can, list, target) { if (list["name"] == "inner") { target.title = "点击复制" diff --git a/plugin/state.js b/plugin/state.js index 5f962f32..534bbd52 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -1,4 +1,28 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { }, }) +Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { + }, + input: function(event, can, name, cb) { var feature = can.Conf("feature") + feature[name]? can.user.input(event, can, feature[name], function(ev, button, data, list) { + var msg = can.request(event); msg.Option(can.Option()) + var args = ["action", name]; can.core.Item(data, function(key, value) { + key && value && args.push(key, value) + }) + can.run(event, args, function(msg) { + typeof cb == "function" && cb(msg) + }) + return true + }): can.run(event, ["action", name], function(msg) { + typeof cb == "function" && cb(msg) + }, true) + }, + change: function(event, can, name, value, cb) { + can.page.Select(can, can._option, "input.args", function(input) { if (input.name == name) { var data = input.dataset || {} + if (value != input.value) { input.value = value; + data.action == "auto" && typeof cb == "function" && cb() + } + } }) + }, +}) diff --git a/plugin/table.js b/plugin/table.js index dba70003..d312f183 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,53 +1,87 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - if (msg.Option("_progress")) { - // 异步进度 - can.page.Select(can, can._output, "td", function(td) { - if (td.innerText == msg.Option("name")) { - can.page.Modify(can, td, {style: { - "background-color": "green", - }}) - } - }) - return + if (can.onimport._process(can, msg)) { + return typeof cb == "function" && cb(msg) } - // 自动刷新 - var refresh = msg.Option("_refresh") || can.Conf("feature")["_refresh"] - var i = 0; refresh && can.Timer(refresh, function(timer) { - if (i > 100) { timer.stop = true} else { can.run({}) } - }) - - // 展示数据 - can.ui = can.page.Appends(can, can._target, [ + can.ui = can.page.Appends(can, target, [ {view: ["content", "div"]}, {view: ["display", "pre"]}, ]) - can.onappend.table(can, can.ui.content, "table", msg) - can.onappend.board(can, can.ui.display, "board", msg) - - can.page.Select(can, target, ".story", function(item) { var data = item.dataset - can.page.Modify(can, item, {style: can.base.Obj(data.style)}) - var cb = can.onimport[data.type]; typeof cb == "function" && cb(can, data, item) + can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line, array) { + return can.onimport._table(can, value, key, index, line, array) }) + + can.onappend.board(can, can.ui.display, "board", msg) + can.onimport._board(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) + if (can.onimport._progress(can, msg)) { + return true + }; can.onimport._refresh(can, msg) + }, + _progress: function(can, msg) { + var progress = msg.Option("_progress") || can.Conf("feature")["_progress"] + if (progress) { + can.page.Select(can, can._output, "td", function(td) { + if (td.innerText == msg.Option("name")) { + can.page.Modify(can, td, {style: {"background-color": "green"}}) + } + }) + return true + } + }, + _refresh: function(can, msg) { + var refresh = msg.Option("_refresh") || can.Conf("feature")["_refresh"] + can.Timer({interval: 500, length: parseInt(refresh)}, function(timer) { + can.run({}) + }) + }, + _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 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({}) }) + } + can.sup.onaction.change(event, can.sup, key, value, function(msg) { + can.run(event) + }) + + }, ondblclick: function(event) { + can.onmotion.modify(can, event.target, function(event, value, old) { + can.run(event, ["action", "编辑", key, value], function(msg) { can.run({}) }, true) + }) + }, onmouseover: function(event) { + can.user.toast(can, index+1+"/"+array.length) + }} + }, + _board: function(can, msg) { + can.page.Select(can, can.ui.display, ".story", function(item) { var data = item.dataset + var cb = can.onimport[data.type]; typeof cb == "function" && cb(can, data, item) + can.page.Modify(can, item, {style: can.base.Obj(data.style)}) + }) + }, + spark: function(can, list, target) { if (list["name"] == "inner") { - target.title = "点击复制" - target.onclick = function(event) { + target.title = "点击复制", target.onclick = function(event) { can.user.copy(can, target.innerText) } return } can.page.Select(can, target, "span", function(item) { - item.title = "点击复制" - item.onclick = function(event) { + item.title = "点击复制", item.onclick = function(event) { can.user.copy(can, item.innerText) } }) }, }) Volcanos("onaction", {help: "控件交互", list: [], - onclick: function(event, can) { - can.run(event, [], function() {}) - }, + "清空": function(event, can, name) { can._output.innerHTML = "" }, + "结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) { + can.run({}) + }, true) }, })