diff --git a/frame.js b/frame.js index 20ef3b6c..a9c9d194 100644 --- a/frame.js +++ b/frame.js @@ -235,9 +235,25 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, Option: can.Option, Action: can.Action, Status: can.Status, }, [item.display||"/plugin/input.js"].concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(input) { input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) { - return can.onappend._output(can, meta, event, can.Pack(cmds), cb, silent) + if (cmds && cmds[0] == "action" && input.onaction[cmds[1]]) { + return input.onaction[cmds[1]](event, input) + } + + var sub = can.core.Value(can, "_outputs.-1") + if (cmds && cmds[0] == "action" && sub && sub.onaction[cmds[1]]) { + return sub.onaction[cmds[1]](event, sub) + } + + return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) } + can.onappend.figure(input, item, item.value, input._target) + can.core.Item(input.onaction, function(key, value) { + key.indexOf("on") == 0 && (input._target[key] = input._target[key] || function(event) { + value(event, input) + }) + }) + input.onaction && input.onaction._init && input.onaction._init(input, item, [], next, input._target) }); return can._inputs[item.name] = input }; can.core.Next(can.base.Obj(meta.inputs, []), add) @@ -268,8 +284,28 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return can.onaction[cmds[1]](event, can) } + var feature = can.Conf("feature") + var input = feature && feature[cmds[1]]; if (cmds[0] == "action" && input) { + can.user.input(event, can, input, function(ev, button, data, list) { + can.core.Item(data, function(key, value) { + key && value && cmds.push(key, value) + }) + + can.run(event, cmds, function(msg) { + var sub = can.core.Value(can, "_outputs.-1") + if (can.core.CallFunc("onimport._process", [sub, msg, cmds, cb], sub)) { return } + if (can.core.CallFunc("onimport._process", [can, msg, cmds, cb], can)) { return } + typeof cb == "function" && cb(msg) + }, silent) + return true + }) + return + } + return can.run(event, cmds||[], function(msg) { - if (can.onimport._process(can, msg, cmds, cb)) { return } + var sub = can.core.Value(can, "_outputs.-1") + if (can.core.CallFunc("onimport._process", [sub, msg, cmds, cb], sub)) { return } + if (can.core.CallFunc("onimport._process", [can, msg, cmds, cb], can)) { return } typeof cb == "function" && cb(msg) if (silent) { return } @@ -281,6 +317,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, Option: can.Option, Action: can.Action, Status: can.Status, }, [display].concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(table) { table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) { + if (cmds && cmds[0] == "action" && table.onaction[cmds[1]]) { + return table.onaction[cmds[1]](event, table) + } + return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) }, table._msg = msg @@ -319,6 +359,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var node = {}; can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { 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]||target, [{view: ["item", "div", value+(index==array.length-1?"":split)], onclick: function(event) { index < array.length - 1? can.onmotion.toggle(can, node[name]): typeof cb == "function" && cb(event, item) }}, {view: "list", style: {display: "none"}}]).last) @@ -361,6 +402,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, case "text": item.value = value || item.value || "" item.className || can.page.ClassList.add(can, item, "args") + item.autocomplete = "off" break } @@ -381,28 +423,38 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, if (key.indexOf("@") != 0) { return } var list = can.core.Split(key, "@=", "@=", {simple: true}) var pkey = list[0], pval = list[1]||"" + can.page.Modify(can, target, {autocomplete: "off"}) target.type != "button" && target.value.startsWith("@") && (target.value = pval||"") pkey && can.require(["/plugin/input/"+pkey+".js"], function(can) { can.onfigure && can.core.Item(can.onfigure[pkey], function(key, cb) { if (key.startsWith("on")) { - target[key] = function(event) { cb(event, can, meta, target) } + target[key] = function(event) { + can._figure && can.page.Remove(can, can._figure.fieldset) + var figure = can.onappend.field(can, "input "+pkey, {}, document.body) + can._figure = figure; can.onlayout.figure(can, figure, event) + + cb(event, can, meta, target, figure) + } } }) }) }, + _plugin: function(can, msg, meta, cb, target) { + meta.feature = can.base.Obj(msg.meta&&msg.meta[0] || "{}", {}) + meta.inputs = can.base.Obj(msg.list&&msg.list[0] || "[]", []) + + meta.name = meta.name || msg.name&&msg.name[0] || "story" + meta.help = meta.help || msg.help&&msg.help[0] || "story" + meta.width = meta.width || can.Conf("width") + meta.type = "story" + + can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) { + typeof cb == "function" && cb(sub, meta) + sub.page.Remove(sub, sub._legend) + }, target || can._output) + }, plugin: function(can, meta, cb, target) { meta = meta || {} can.run({}, ["action", "command", meta.index], function(msg) { - meta.feature = can.base.Obj(msg.meta&&msg.meta[0] || "{}", {}) - meta.inputs = can.base.Obj(msg.list&&msg.list[0] || "[]", []) - - meta.name = meta.name || msg.name&&msg.name[0] || "story" - meta.help = meta.help || msg.help&&msg.help[0] || "story" - meta.width = meta.width || can._target.offsetWidth - meta.type = "story" - - can.onappend._init(can, meta, ["/plugin/state.js"], function(story) { - typeof cb == "function" && cb(story, meta) - story.page.Remove(story, story._legend) - }, target || can._output) + can.onappend._plugin(can, msg, meta, cb, target) }, true) }, plugins: function(can, meta, cb, target) { @@ -653,7 +705,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe show: function(can, time, cb, target) { target = target || can._target time = typeof time == "object"? time: {value: 10, length: time||20} - can.page.Modify(can, target, {style: {opacity: 0, display: ""}}) + can.page.Modify(can, target, {style: {opacity: 0, display: "block"}}) can.core.Timer(time, function(event, value, index) { can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) }, cb) diff --git a/lib/core.js b/lib/core.js index 708a1215..d4875e20 100644 --- a/lib/core.js +++ b/lib/core.js @@ -56,6 +56,7 @@ Volcanos("core", {help: "核心模块", }), Value: function(data, key, value) { + if (data == undefined) { return } if (key == undefined) { return data } if (typeof key == "object") { for (var k in key) { arguments.callee.call(this, data, k, key[k]) @@ -65,6 +66,7 @@ Volcanos("core", {help: "核心模块", if (data[key] != undefined) { return data[key] } var p = data, ls = key.split("."); while (p && ls.length > 0) { + if (ls[0] == "-1") { ls[0] = p.length-1 } p = p[ls[0]], ls = ls.slice(1) }; return p }, @@ -75,8 +77,8 @@ Volcanos("core", {help: "核心模块", var ls = func.toString(); ls = ls.split(")")[0], ls = ls.split("(")[1] var msg = args["msg"], can = args["can"], echo = false - var list = []; this.List(ls.split(","), function(item) { item = item.trim() - list.push(args[item] || msg&&msg.Option(item) || can&&can.Conf(item) || args) + var list = []; this.List(ls.split(","), function(item, index) { item = item.trim() + list.push(args[index] || args[item] || msg&&msg.Option(item) || can&&can.Conf(item)) if (item == "cb") { echo = true } }) diff --git a/page/index.css b/page/index.css index bec50d56..0c7d1a87 100644 --- a/page/index.css +++ b/page/index.css @@ -236,6 +236,13 @@ body>fieldset.input.key { body>fieldset.input.date { z-index:70; } +body>fieldset.input.date table { + text-align:center; + width:260px; +} +body>fieldset.input.date table td:hover { + background-color:red; +} div.carte { position:fixed; diff --git a/plugin/input.js b/plugin/input.js index 793fd001..6fc407d4 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -2,38 +2,28 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, }, }) Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) { - can.core.Item(can.onaction, function(key, value) { - key.indexOf("on") == 0 && (can._target[key] = can._target[key] || function(event) { - value(event, can) - }) - }) , typeof cb == "function" && cb() - - switch (meta.type) { + typeof cb == "function" && cb(); switch (meta.type) { case "textarea": case "text": - !target.placeholder && (target.placeholder = meta.name || "") + !target.placeholder && (target.placeholder = can.user.trans(can, meta.name) || "") !target.title && (target.title = target.placeholder) break - case "button": meta.action == "auto" && can._target.click(); break case "select": meta.value && (target.value = meta.value); break + case "button": meta.action == "auto" && target.click(); break } - - can.onappend.figure(can, meta, meta.value, target) }, "upload": function(event, can) { can.user.upload(event, can) }, - "关闭": 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.run(event) }, "返回": function(event, can) { - can.sup._history.pop(); var his = can.sup._history.pop(); if (his) { + can.sup._history.pop(); for (var his = can.sup._history.pop(); his; his = can.sup._history.pop()) { + if (his[0] == "action") { continue } can.page.Select(can, can._option, "textarea.args,input.args,select.args", function(item, index) { item.value = his[index] || "" - }) + }), can.run(event); break } - can.run(event) }, onchange: function(event, can) { @@ -41,58 +31,22 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, }, ondblclick: function(event, can) { if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1) } - if (can.Conf("type") == "textarea") { event.target.setSelectionRange(0, -1) } }, - onclick: function(event, can) { var msg = can.sup.request(event) - // 插件回调 - var name = can.Conf("name"), action = can.Conf("action") - var sub = can.sup._outputs && can.sup._outputs[can.sup._outputs.length-1] - var cb = sub && sub.onaction && (sub.onaction[action] || sub.onaction[name]) - if (typeof cb == "function") { return cb(event, sub, name) } - - // 交互回调 - var feature = can.sup.Conf("feature") - var input = feature && feature[name]; if (input) { - return can.sup.onaction.input(event, can.sup, name, function(msg) { - can.user.toast(can, can.Conf("value")+"成功") - if (can.sup._outputs && can.sup._outputs.length > 0) { var i = can.sup._outputs.length - 1 - can.sup._outputs[i].onimport._process && can.sup._outputs[i].onimport._process(can.sup._outputs[i], msg) - return - }; can.sup.onimport._process(can.sup, msg) - }) - } - - // 控件回调 - var cb = can.onaction[action] || can.onaction[name] - if (typeof cb == "function") { return cb(event, can, name) } - - // 组件回调 - var cb = can.sup.onaction[action] || can.sup.onaction[name] - if (typeof cb == "function") { return cb(event, can, name) } - - // 通用回调 - if (can.Conf("type") == "button") { can.run(event, [name].concat(can.sup.Pack())) } + onclick: function(event, can) { + if (can.Conf("type") == "button") { can.run(event, ["action", can.Conf("name")].concat(can.sup.Pack())) } }, + onkeydown: function(event, can) { var target = event.target - can.onkeypop.input(event, can, target) - switch (event.key) { + can.onkeypop.input(event, can, target); switch (event.key) { case "Enter": if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1), can.run(event) } - if (can.Conf("type") == "textarea") { if (!event.ctrlKey) { break }; can.run(event) } - event.stopPropagation(), event.preventDefault() - break - case "b": if (!event.ctrlKey) { break }; can.CloneInput(); break - case "m": if (!event.ctrlKey) { break }; can.CloneField(); break - } - }, - onkeyup: function(event, can) { - switch (event.key) { - case "Enter": - if (can.Conf("type") == "textarea") { break } - event.stopPropagation(), event.preventDefault() - break + if (can.Conf("type") == "textarea") { if (event.ctrlKey) { break } can.run(event) } + event.stopPropagation(), event.preventDefault(); break + case "b": if (event.ctrlKey) { can.CloneInput() } break + case "m": if (event.ctrlKey) { can.CloneField() } break } }, + onkeyup: function(event, can) { }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/input/city.js b/plugin/input/city.js deleted file mode 100644 index c21db1e3..00000000 --- a/plugin/input/city.js +++ /dev/null @@ -1,13 +0,0 @@ -Volcanos("onfigure", {help: "控件详情", list: [], - city: {click: function(event, can, value, cmd, target, figure) { - function run() {figure.output.innerHTML = "" - can.Run(event, ["action", "input", can.item.name, target.value], function(msg) { - can.page.AppendTable(can, msg, figure.output, msg.append, function(event, value, key, index, tr, td) { - target.value = value; msg.Option("_refresh") && run() - }) - }, true) - } - run() - }}, -}) - diff --git a/plugin/input/date.css b/plugin/input/date.css deleted file mode 100644 index 43aa6ff8..00000000 --- a/plugin/input/date.css +++ /dev/null @@ -1,12 +0,0 @@ -fieldset.input.date { - background-color:black; - position:fixed; - z-index:100; -} -fieldset.input.date div.action>hr { - clear:both; -} -fieldset.input.date div.output table { - text-align:center; - width:260px; -} diff --git a/plugin/input/date.js b/plugin/input/date.js index 2926a0a6..3f1cd523 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -1,4 +1,4 @@ -Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(event, can, item, target) { +Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(event, can, item, target, figure) { // 设置输入 function set(now) { @@ -6,10 +6,6 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e item && item.action == "auto" && can.run({}) } - // 添加插件 - can._figure && can.page.Remove(can, can._figure.fieldset) - var figure = can.onappend.field(can, "input date", {}, document.body) - can._figure = figure; can.onlayout.figure(can, figure, event) figure.table = can.page.Append(can, figure.output, [{type: "table"}]).first // 添加控件 @@ -73,5 +69,5 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) {add(day, "next")} return now }; show(now) -}} }, ["/plugin/input/date.css"]) +}} }, []) diff --git a/plugin/input/key.css b/plugin/input/key.css deleted file mode 100644 index a54a29f9..00000000 --- a/plugin/input/key.css +++ /dev/null @@ -1,4 +0,0 @@ -fieldset.input.key div.output { - max-height:400px; - overflow:auto; -} diff --git a/plugin/input/key.js b/plugin/input/key.js index 15b4de8e..c3d066f2 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,23 +1,19 @@ -Volcanos("onfigure", {help: "控件详情", list: [], key: {onclick: function(event, can, item, target) { function run() { - var msg = can.request(event, can.Option()); msg.Option("action", item._action) +Volcanos("onfigure", {help: "控件详情", list: [], key: {onclick: function(event, can, item, target, figure) { function run() { + var msg = can.request(event, can.Option()) can.run(event, ["action", "inputs", item.name, target.value], function(msg) { if (!msg.append) { return } - can._figure && can.page.Remove(can, can._figure.fieldset) - var figure = can.onappend.field(can, "input key", {}, document.body) - can._figure = figure; can.onlayout.figure(can, figure, event) - can.onappend._action(can, [ {button: ["清空", function(event) { target.value = "" }]}, - {button: ["关闭", function(event) { can.page.Remove(can, can._figure.fieldset) }]}, - ], can._figure.action) + {button: ["关闭", function(event) { can.page.Remove(can, figure.fieldset) }]}, + ], figure.action) can.onappend.table(can, "content", msg, function(value, key, index, line) { return {type: "td", inner: value, onclick: function() { - target.value = value; msg.Option("_refresh") && run() - can.page.Remove(can, can._figure.fieldset) + target.value = value, msg.Option("_refresh") && run() + can.page.Remove(can, figure.fieldset) }} - }, can._figure.output) + }, figure.output) }, true) -}; run() }}, }, ["/plugin/input/key.css"]) +}; run() }}, }, []) diff --git a/plugin/input/location.js b/plugin/input/location.js deleted file mode 100644 index bfceaa72..00000000 --- a/plugin/input/location.js +++ /dev/null @@ -1,4 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { - }, -}) - diff --git a/plugin/input/paste.js b/plugin/input/paste.js deleted file mode 100644 index 456fb824..00000000 --- a/plugin/input/paste.js +++ /dev/null @@ -1,3 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { - }, -}) diff --git a/plugin/input/province.js b/plugin/input/province.js index 358ae317..56f974be 100644 --- a/plugin/input/province.js +++ b/plugin/input/province.js @@ -1,17 +1,18 @@ Volcanos("onfigure", {help: "控件详情", list: [], - province: {click: function(event, can, value, cmd, target, figure) { - figure.fieldset.style.left = "20px" - figure.fieldset.style.top = "200px" + province: {onclick: function(event, can, item, target, figure) { + can.onappend._action(can, [ + {button: ["清空", function(event) { target.value = "" }]}, + {button: ["关闭", function(event) { can.page.Remove(can, figure.fieldset) }]}, + ], figure.action) - var china_chart = echarts.init(can.page.Append(can, figure.output, [{type: "div", style: {width: "600px", height: "400px"}}]).last); - - var option = {geo: {map: 'china'}}; - china_chart.setOption(option); - - china_chart.on('click', function (params) { - target.value = params.name; - }); - // , ["require/github.com/shylinux/echarts/echarts.js","require/github.com/shylinux/echarts/china.js"]) + can.page.Modify(can, figure.fieldset, {style: {left: 120}}) + can.require(["/require/github.com/shylinux/echarts/echarts.js","/require/github.com/shylinux/echarts/china.js"], function() { + var china_chart = echarts.init(can.page.Append(can, figure.output, [{type: "div", style: {width: "600px", height: "400px"}}]).first); + china_chart.setOption({geo: {map: 'china'}}), china_chart.on('click', function (params) { + target.value = params.name, msg.Option("_refresh") && run() + can.page.Remove(can, figure.fieldset) + }) + }) }}, }) diff --git a/plugin/input/scan.js b/plugin/input/scan.js deleted file mode 100644 index bfceaa72..00000000 --- a/plugin/input/scan.js +++ /dev/null @@ -1,4 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { - }, -}) - diff --git a/plugin/input/upload.js b/plugin/input/upload.js deleted file mode 100644 index 85774d8f..00000000 --- a/plugin/input/upload.js +++ /dev/null @@ -1,39 +0,0 @@ -Volcanos("onfigure", {help: "控件详情", list: [], - upload: {click: function(event, can, value, cmd, target, figure) {figure.stick = true - var begin = new Date(); - function show(event, value, total, loaded) { - var now = new Date(); can.page.Appends(can, figure.output, [ - {view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{ - view: ["progress"], style: {height: "10px", width: value + "%", background: "red"}, - }]}, - {text: [value+"%", "div"], style: {"float": "right"}}, - {text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}}, - {text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}}, - ]); - } - - var action = can.page.AppendAction(can, figure.action, [ - {type: "input", data: {name: "upload", type: "file", onchange: function(event) { - var file = action.upload.files[0] - console.log(file) - show(event, 0, file.size, 0) - }}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) { - if (action.upload.files.length == 0) {return action.upload.focus()} - if (value == "关闭") {figure.stick = false; return} - - var msg = can.Event(event); - can.page.Select(can, can._plugin.option, "input", function(item) { - item.name && item.value && msg.Option(item.name, item.value) - }) - - // 上传文件 - begin = new Date(); - msg._progress = show - msg.upload = action.upload.files[0]; - can.run(event, ["action", "upload"], function(msg) { - can.user.toast(can, "上传成功") - }, true); - }) - }}, -}) - diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 2d58768c..be7654b0 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -23,7 +23,7 @@ body fieldset div.story[data-type=spark] { background-color:#2169a9; color:white; box-shadow: 4px 4px 10px 1px #626bd0; border-left:solid 4px blue; - padding:4px 10px; margin:10px; + padding:4px 10px; margin:10px 0px; } body fieldset div.story[data-type=spark] span:hover { background-color:#c10c8a; diff --git a/plugin/state.js b/plugin/state.js index 94e10a23..38f21410 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -30,48 +30,28 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, return true }, _refresh: function(can, msg) { - can.core.Timer(500, function(timer) { + can.core.Timer(parseInt(msg.Option("_delay")||"500"), function() { var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1}) - can.onappend._output(can, can.Conf(), {}, can.Pack()) + can.onappend._output(can, can.Conf(), sub._event, can.Pack()) }) }, _field: function(can, msg) { - msg.Table(function(value) { - value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) - value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) - value.width = can._target.offsetWidth - value.type = "story" - - can.onappend._init(can, value, ["/plugin/state.js"], function(sub) { - sub.run = function(event, cmds, cb, silent) { - var res = can.request(event) - can.core.Item(can.Option(), function(key, value) { - res.Option(key) || res.Option(key, value) - }) - can.run(event, (msg["_prefix"]||[]).concat(cmds), cb, true) - } - }, can._output) + can.onappend._plugin(can, msg, {}, function(sub, meta) { + sub.run = function(event, cmds, cb, silent) { + var res = can.request(event); can.core.Item(can.Option(), function(key, value) { + res.Option(key) || res.Option(key, value) + }) + can.run(event, (msg["_prefix"]||[]).concat(cmds), cb, true) + } }) return true }, }) Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { }, - input: function(event, can, name, cb) { var feature = can.Conf("feature") - var msg = can.request(event, can.Option()) - feature[name]? can.user.input(event, can, feature[name], function(ev, button, data, list) { - var args = ["action", name]; can.core.Item(data, function(key, value) { - key && value && args.push(key, value) - }) - - var sub = can._outputs && can._outputs[can._outputs.length-1] || can - sub.run(event, args, function(msg) { typeof cb == "function" && cb(msg) }, true) - 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 && value != input.value) { input.value = value; + if (input.name == name && value != input.value) { input.value = value var data = input.dataset || {}; data.action == "auto" && can.run(event, can.Pack(), cb) } }) diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 1cf9c06a..603f7fb8 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -2,8 +2,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, typeof cb == "function" && cb(msg) can.msg = msg, can.data = msg.Table() can.dir_root = msg.Option("dir_root") - can._tree = can.onimport._tree(can, msg) can.Action("scale", parseInt(msg.Option("scale")||"1")) + can._tree = can.onimport._tree(can, msg.Table(), "path", "/") can.onmotion.clear(can) can.onappend.plugins(can, {index: "web.wiki.draw"}, function(sub) { @@ -23,20 +23,24 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, - _tree: function(can, msg) { var list = {} - msg.Table(function(value, index) { - value.path && can.core.List(value.path.split("/"), function(item, index, array) { - var last = array.slice(0, index).join("/") || "" - var name = array.slice(0, index+1).join("/") - list[last] = list[last] || {name: last, list: []} - if (!item || list[name]) { return } - list[last].list.push(list[name] = {hide: true, file: value.path, name: item+(index==array.length-1? "": "/"), last: last, list: []}) + _tree: function(can, list, field, split) { + var node = {}; can.core.List(list, function(item) { + item[field] && can.core.List(item[field].split(split), function(value, index, array) { + var last = array.slice(0, index).join(split) || "", name = array.slice(0, index+1).join(split) + if (!value || node[name]) { return } + + node[last] = node[last] || {name: last, list: []} + node[last].list.push(node[name] = { + name: value+(index==array.length-1? "": split), + meta: item, list: [], last: last, + file: item[field], hide: true, + }) }) }) - return list + return node }, _height: function(can, tree) { - if (!tree) { return } + if (!tree) { return 0 } if (tree.hide) { return tree.height = 1 } if (tree.list.length == 0) { return tree.height = 1 } @@ -66,17 +70,16 @@ Volcanos("onaction", {help: "操作数据", list: ["编辑", ["view", "横向", }, _show: function(can, args, layout) { - can.page.Remove(can, can.inner), can.onappend.plugin(can, { + can.onappend.plugin(can, { index: "web.code.inner", args: args, _action: ["关闭", "最大", "分屏", "复制"], width: layout.width, height: layout.height, - }, function(sub) { can.inner = sub._target + }, function(sub) { can.page.Modify(can, sub._target, {style: layout}) sub.run = function(event, cmds, cb, silent) { can.run(event, ["action", "inner"].concat(cmds), function(msg) { typeof cb == "function" && cb(msg) }, true) } - can.page.Modify(can, sub._target, {style: layout}) }) }, _draw: function(can, tree, x, y) { var sub = can.sub, name = tree.name || can.Option("name") || "." @@ -151,8 +154,8 @@ Volcanos("onaction", {help: "操作数据", list: ["编辑", ["view", "横向", }, "横向": function(event, can) { if (!can._tree[""]) { return } - can.onmotion.clear(can, can.sub.svg) + can.onimport._height(can, can._tree[""]) can.sub.svg.Val("height", can._tree[""].height*30) can.width = 0, can.onaction._draw(can, can._tree[""], 0, 0) diff --git a/plugin/table.js b/plugin/table.js index f738bf4e..f9a83d5d 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,47 +1,113 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { if (can.onimport._process(can, msg)) { return typeof cb == "function" && cb(can, msg) } + if (can.sup.onimport._process(can.sup, msg)) { return typeof cb == "function" && cb(can, msg) } + can.onmotion.clear(can) can.ui = can.onlayout.display(can) - // can.ui = can.page.Appends(can, target, [can.onimport._control(can, msg)].concat([ - // {view: ["content", "div"]}, {view: ["display", "pre"]}, - // ])) + typeof cb == "function" && cb(msg) + can.page.Append(can, can.ui.content, [can.onimport._control(can, msg)]) can.onappend.table(can, "content", msg, function(value, key, index, line, array) { return can.onimport._table(can, value, key, index, line, array) }, can.ui.content) can.onappend.board(can, "content", msg.Result(), can.ui.display) can.onimport._board(can, msg) - - typeof cb == "function" && cb(msg) }, + _table: function(can, value, key, index, line, array) { + return {text: [value, "td"], onclick: function(event) { var target = event.target + if (target.tagName == "INPUT" && target.type == "button") { var msg = can.sup.request(event, can.Option()) + key == "value"? can.core.List(array, function(item, index) { msg.Option(item.key, item.value) }): msg.Option(line) + return can.run(event, ["action", target.name], function(msg) { can.run() }, true) + } + can.sup.onaction.change(event, can.sup, key, value, function(msg) { can.onimport._init(can, msg) }) + + }, ondblclick: function(event) { + can.onmotion.modify(can, event.target, function(event, value, old) { + var msg = can.sup.request(event, can.Option()); + can.run(event, ["action", "modify", key == "value"? line.key: key, value], function(msg) { }, true) + }) + }, onmouseover: function(event) { + can.user.toast(can, index+1+"/"+array.length) + }} + }, + _board: function(can, msg) { + can.page.Select(can, can._output, ".story", function(item) { var data = item.dataset + can.page.Modify(can, item, {style: can.base.Obj(data.style)}) + can.core.CallFunc(can.onimport[data.type], [can, data, item]) + }) + }, + spark: function(can, list, target) { + if (list["name"] == "inner") { + target.title = "点击复制", target.onclick = function(event) { + can.user.copy(event, can, target.innerText) + } + return + } + can.page.Select(can, target, "span", function(item) { + item.title = "点击复制", item.onclick = function(event) { + can.user.copy(event, can, item.innerText) + } + }) + }, + _process: function(can, msg) { + var cb = can.onimport[msg.Option("_process")] + return typeof cb == "function" && cb(can, msg) + }, + _follow: function(can, msg) { + if (msg.Option("cache.status") == "stop") { return can.user.toast(can, msg.Option("cache.action")+" done!")} + + can.page.Modify(can, can.ui.display, {className: "code", style: {"max-height": 400}}) + can.page.Append(can, can.ui.display, [{text: msg.Result()}]) + can.ui.display.scrollBy(0, 1000) + + can.core.Timer(100, function() { var sub = can.request({}) + sub.Option("cache.hash", msg.Option("cache.hash")) + sub.Option("cache.begin", msg.Option("cache.begin")) + sub.Option("cache.limit", msg.Option("cache.limit")) + can.run(sub._event, ["action", msg.Option("cache.action")], function(msg) { + can.onimport._follow(can, msg) + }, true) + }) + return true + }, + _inner: function(can, msg) { + can.onappend.table(can, "content", msg, function(value, key, index, line, array) { + return can.onimport._table(can, value, key, index, line, array) + }, can.ui.display) + + can.onappend.board(can, "content", msg.Result(), can.ui.display) + can.onimport._board(can, msg) + return true + }, + _control: function(can, msg) { var cb = can.onimport[msg.Option("_control")] return typeof cb == "function" && cb(can, msg) }, - _page: function(can, msg) { + _page: function(can, msg) { var ui = {} return {view: ["control", "div"], list: [ {button: ["上一页", function(event) { - can.ui["cache.offend"].value = parseInt(can.ui["cache.offend"].value||0) + parseInt(can.ui["cache.limit"].value) + ui.offend.value = parseInt(ui.offend.value||0) + parseInt(ui.limit.value) can.run(event) }]}, {input: ["cache.offend", function(event) { event.key == "Enter" && can.run(event) }], style: {width: 50}, _init: function(item) { - item.value = msg.Option("cache.offend") + ui.offend = item, item.value = msg.Option("cache.offend") }, data: {"className": "args"}}, {select: [["cache.limit", 10, 30, 100, 1000], function(event) { can.run(event) }], _init: function(item) { - item.value = msg.Option("cache.limit") + ui.limit = item, item.value = msg.Option("cache.limit") }, data: {"className": "args"}}, {button: ["下一页", function(event) { - can.ui["cache.offend"].value = parseInt(can.ui["cache.offend"].value||0) - parseInt(can.ui["cache.limit"].value) - if (can.ui["cache.offend"].value < 0) { - can.ui["cache.offend"].value = 0 + ui.offend.value = parseInt(ui.offend.value||0) - parseInt(ui.limit.value) + if (ui.offend.value < 0) { + ui.offend.value = 0 } can.run(event) }]}, @@ -56,7 +122,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, {input: ["cache.value", function(event) { if (event.key == "Enter") { can.page.Select(can, can.ui.content, "tr", function(tr, index) { - if (event.target.value == "" && can.page.Modify(can, tr, {style: {"display": ""}})) { return } + if (event.target.value == "") { can.page.Modify(can, tr, {style: {"display": ""}}); return } index > 0 && can.page.Modify(can, tr, {style: {"display": "none"}}) can.page.Select(can, tr, "td", function(td, index) { if (td.innerText.indexOf(event.target.value) > -1) { @@ -70,95 +136,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, data: {"className": "args"}}, ]} }, - _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, can.Option()) - key == "value"? can.core.List(array, function(item, index) { msg.Option(item.key, item.value) }): msg.Option(line) - var cb = can.onaction[msg.Option("action", target.name)] - typeof cb == "function"? cb(event, can, target.name): can.sup.onaction.input(event, can.sup, target.name, function(msg) { - can.onimport._process(can, msg) || can.run({}) - }) - } else { - can.sup.onaction.change(event, can.sup, key, value, function(msg) { - can.run(event) - }) - } - }, ondblclick: function(event) { - 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()) - if (can._msg.Option("modify.hold") == "true") { - if (can._msg.append.length == 2 && can._msg.append[0] == "key" && can._msg.append[1] == "value") { - can.core.List(can._msg.key, function(key, index) { - msg.Option(key, can._msg.value[index]) - }) - } - can.run(event, ["action", "modify"]) - return - } - - msg.Option(line) - if (key == "value") { key = line.key } - can.run(event, ["action", "modify", 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)}) - }) - }, - - _process: function(can, msg) { - var cb = can.onimport[msg.Option("_process") || can.Conf("feature._process")] - return typeof cb == "function" && cb(can, msg) - }, - _follow: function(can, msg) { - if (msg.Option("cache.status") == "stop") { return can.user.toast(can, msg.Option("cache.action")+" done!")} - can.ui || (can.ui = can.page.Appends(can, can._target, [{view: ["content", "div"]}])) - can.page.ClassList.add(can, can.ui.content, "code") - can.page.Modify(can, can.ui.content, {style: {"max-height": 400}}) - can.page.Append(can, can.ui.content, [{text: msg.Result()}]) - can.ui.content.scrollBy(0, 1000) - - can.core.Timer(100, function() { - var sub = can.request({}) - sub.Option("cache.hash", msg.Option("cache.hash")) - sub.Option("cache.begin", msg.Option("cache.begin")) - sub.Option("cache.limit", msg.Option("cache.limit")) - can.run(sub._event, [msg.Option("cache.action")], function(msg) { - can.onimport._follow(can, msg) - }, true) - }) - return true - }, - _inner: function(can, msg) { - can.onappend.table(can, "content", msg, function(value, key, index, line, array) { - return can.onimport._table(can, value, key, index, line, array) - }, can._output) - - can.onappend.board(can, "content", msg.Result(), can._output) - // can.onimport._board(can, msg) - return true - }, - - spark: function(can, list, target) { - if (list["name"] == "inner") { - target.title = "点击复制", target.onclick = function(event) { - can.user.copy(event, can, target.innerText) - } - return - } - can.page.Select(can, target, "span", function(item) { - item.title = "点击复制", item.onclick = function(event) { - can.user.copy(event, can, item.innerText) - } - }) - }, }) Volcanos("onaction", {help: "控件交互", list: []}) Volcanos("onexport", {help: "导出数据", list: []})