diff --git a/frame.js b/frame.js index c76baa39..3772126d 100644 --- a/frame.js +++ b/frame.js @@ -15,46 +15,57 @@ var can = Volcanos("chat", { page[item.name] = can.Pane(page, item.name, item, cb, can.page.Select(can, body, "fieldset."+item.name)[0] || can.page.AppendField(can, body, item.name+" dialog", item)) }, function() {typeof cb == "function" && cb(page)}) - }) + }, conf) return page.target = body, page }), Pane: shy("构造面板", function(can, name, meta, cb, field) { - var option = field.querySelector("form.option"); - var action = field.querySelector("div.action"); - var output = field.querySelector("div.output"); - var river = "", storm = ""; var pane = Volcanos(name, {type: "local", + option: field.querySelector("form.option"), + action: field.querySelector("div.action"), + output: field.querySelector("div.output"), Plugin: can.Plugin, Inputs: can.Inputs, Output: can.Output, Export: function(event, value, key) {can.Report(event, value, key)}, Import: function(event, value, key) {var cb = pane.onimport[key]; - typeof cb == "function" && cb(event, pane, value, key, output); + typeof cb == "function" && cb(event, pane, value, key, pane.output); }, Show: function(width, height) {field.style.display = "block"; - if (width > 0) { - field.style.width = width + "px"; + if (width < 0) {field.style.left = -width / 2 + "px"; + field.style.width = (document.body.offsetWidth + width) / 2 + "px"; + } + if (height < 0) {field.style.top = -height / 2 + "px"; + field.style.height = (document.body.offsetHeight + height) / 2 + "px"; + } + if (width > 0) {field.style.width = width + "px"; field.style.left = (document.body.offsetWidth - width) / 2 + "px"; } - if (height > 0) { - field.style.height = height + "px"; + if (height > 0) {field.style.height = height + "px"; field.style.top = (document.body.offsetHeight - height) / 2 + "px"; } }, Hide: function() {field.style.display = "none"}, run: function(event, cmds, cb) {var msg = pane.Event(event) - can.page.Select(can, action, "input", function(item, index) { + can.page.Select(can, pane.action, "input", function(item, index) { msg.Option(name, item.value) }) - can.run(event, option.dataset, cmds, cb) + can.run(event, pane.option.dataset, cmds, cb) }, }, Config.libs.concat(["pane/"+name]), function(pane) { - pane.onimport._init && pane.onimport._init(pane, output, action, option, field) + pane.onimport._init && pane.onimport._init(pane, pane.output, pane.action, pane.option, field) + + function deal(event, value) { + typeof pane.onaction[value] == "function" && pane.onaction[value](event, pane, meta, value, pane.output) + } + + can.page.Append(can, pane.action, can.core.List(pane.onaction.list, function(line) { + return typeof line == "string"? {button: [line, deal]}: line.length > 0? {select: [line, deal]}: line + })) typeof cb == "function" && cb(pane) - }) + }, meta) return pane.target = field, pane }), Plugin: shy("构造插件", function(can, name, meta, run, field) { @@ -119,7 +130,7 @@ var can = Volcanos("chat", { }, }, Config.libs.concat(["plugin/"+(meta.type||"state")]), function(plugin) { can.core.Next(JSON.parse(meta.inputs||"[]"), plugin.Append) - }) + }, meta) return plugin.target = field, field.Plugin = plugin }), Inputs: shy("构造控件", function(can, item, type, name, value, cb, option) { diff --git a/lib/page.js b/lib/page.js index 65ce97c0..f782bc3b 100644 --- a/lib/page.js +++ b/lib/page.js @@ -63,15 +63,42 @@ Volcanos("page", {help: "网页模块", }) if (item.view) {var list = can.core.List(item.view); - (list.length > 0 && list[0]) && can.page.ClassList.add(can, data, list[0]) - type = list[1] || "div" - data.innerHTML = list[2] || data.innerHTML || "" - name = name || list[3] || "" + (list.length > 0 && list[0]) && can.page.ClassList.add(can, data, list[0]); + type = list[1] || "div"; + data.innerHTML = list[2] || data.innerHTML || ""; + name = name || list[3] || ""; } else if (item.text) {var list = can.core.List(item.text); - data.innerHTML = list[0] || data.innerHTML || "" - type = list[1] || "span" - list.length > 2 && (data.className = list[2]) + data.innerHTML = list[0] || data.innerHTML || ""; + type = list[1] || "span"; + list.length > 2 && (data.className = list[2]); + + } else if (item.button) {var list = can.core.List(item.button); + type = "button", name = name || list[0]; + data.innerText = list[0], data.onclick = function(event) { + typeof list[1] == "function" && list[1](event, name); + } + + } else if (item.select) {var list = item.select; + type = "select", name = name || list[0][0]; + data.onchange = function(event) { + typeof list[1] == "function" && list[1](event, event.target.value); + } + item.list = list[0].slice(1).map(function(value) { + return {type: "option", value: value, inner: value}; + }) + data.className = list[0][0] || "" + + } else if (item.input) {var list = can.core.List(item.input); + type = "input", name = name || list[0]; + data.onkeydown = function(event) { + typeof list[1] == "function" && list[1](event); + } + data.onkeyup = function(event) { + typeof list[2] == "function" && list[2](event); + } + } else if (item.row) {type = "tr" + item.list = item.row.map(function(text) {return {text: [text, item.sub||"td"]}}) } @@ -88,7 +115,7 @@ Volcanos("page", {help: "网页模块", return target.innerHTML = "", can.page.Append(can, target, key, value) }), - AppendItem: shy("添加插件", function(can, target, list, click, cb) { + AppendItem: shy("添加插件", function(can, target, list, click, cb, cbs) { can.core.List(list, function(line, index) { var item = can.page.Append(can, target, [{view: ["item "+line.key], list: [{text: [line.nick||line.key]}], click: function(event) { typeof cb == "function" && cb(event, line, item) @@ -96,7 +123,15 @@ Volcanos("page", {help: "网页模块", can.page.ClassList.del(can, item, "select") }) can.page.ClassList.add(can, item, "select") - }}]).first + }, data: {oncontextmenu: function(event) { + can.user.carte(event, shy("", can.ondetail, can.ondetail.list, function(event, value, meta) {var cb = meta[value]; + typeof cb == "function"? cb(event, can, line, value, item, target): + can.run(event, [typeof cb == "string"? cb: value, item], null, true) + })) + + event.stopPropagation() + event.preventDefault() + }}}]).first }) if (click === false) {return} @@ -115,13 +150,18 @@ Volcanos("page", {help: "网页模块", ]}]).first; return field; }), - AppendTable: shy("添加表格", function(can, target, msg, list) { + AppendTable: shy("添加表格", function(can, target, msg, list, cb, cbs) { var table = can.page.Append(can, target, "table"); var tr = can.page.Append(can, table, "tr"); can.core.List(list, function(key) {can.page.Append(can, tr, "th", key)}); - msg.Table(function(line) {var tr = can.page.Append(can, table, "tr"); - can.core.List(list, function(key) {can.page.Append(can, tr, "td", can.page.Display(line[key]))}); - }) + + can.page.Append(can, table, can.core.List(msg.Table(), function(line, index) { + return {type: "tr", list: can.core.List(list, function(key) {var cbcb, cbcbs; + typeof cb == "function" && (cbcb = function(event) {cb(event, line[key], key, index, event.target.parentNode, event.target)}); + typeof cbs == "function" && (cbcbs = function(event) {cbs(event, line[key], key, index, event.target.parentNode, event.target)}); + return {type: "td", inner: can.page.Display(line[key]), click: cbcb, oncontextmenu: cbcbs}; + })} + })) return table; }), diff --git a/lib/user.js b/lib/user.js index 6a98ab67..56de3fd6 100644 --- a/lib/user.js +++ b/lib/user.js @@ -7,24 +7,11 @@ Volcanos("user", {help: "用户模块", toast: function(text) {}, carte: function(event, cb) {}, - Cookie: shy("会话变量", function(can, key, value, path) { - function set(k, v) {document.cookie = k+"="+v+";path="+(path||"/")} - - if (typeof key == "object") { - for (var k in key) {set(k, key[k])} - key = null - } - if (key == undefined) {var cs = {} - document.cookie.split("; ").forEach(function(item) { - var cookie = item.split("=") - cs[cookie[0]] = cookie[1] - }) - return cs - } - - value != undefined && set(key, value) - var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) - return result && result.length > 0? result[1]: "" + Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; + !clear && can.core.Item(can.user.Search(), function(key, value) {obj[key] || (obj[key] = value)}); + return location.origin+location.pathname+(objs? "?"+can.core.Item(obj, function(key, value) { + return can.core.List(value, function(value) {return key+"="+encodeURIComponent(value)}).join("&"); + }).join("&"): ""); }), Search: shy("请求参数", function(can, key, value) {var args = {} location.search && location.search.slice(1).split("&").forEach(function(item) {var x = item.split("=") @@ -47,6 +34,25 @@ Volcanos("user", {help: "用户模块", return key+"="+encodeURIComponent(value) }).join("&") }), + Cookie: shy("会话变量", function(can, key, value, path) { + function set(k, v) {document.cookie = k+"="+v+";path="+(path||"/")} + + if (typeof key == "object") { + for (var k in key) {set(k, key[k])} + key = null + } + if (key == undefined) {var cs = {} + document.cookie.split("; ").forEach(function(item) { + var cookie = item.split("=") + cs[cookie[0]] = cookie[1] + }) + return cs + } + + value != undefined && set(key, value) + var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) + return result && result.length > 0? result[1]: "" + }), isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, isMobile: navigator.userAgent.indexOf("Mobile") > -1, diff --git a/order.js b/order.js index f86b6688..38694406 100644 --- a/order.js +++ b/order.js @@ -3,6 +3,7 @@ var Config = { "page/chat", "pane/Toast", "pane/Carte", "pane/Debug", "pane/River", "pane/Storm", "pane/Action", + "pane/Ocean", "pane/Steam", "plugin/state", "plugin/input", "plugin/table", "plugin/inner", ], libs: ["lib/base", "lib/core", "lib/misc", "lib/page", "lib/user"], @@ -14,5 +15,8 @@ var Config = { {group: "index", name: "River"}, {group: "index", name: "Storm"}, {group: "index", name: "Action"}, + + {group: "index", name: "Steam"}, + {group: "index", name: "Ocean"}, ], } diff --git a/pane/Action.js b/pane/Action.js index 46563231..6fb38a99 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -1,5 +1,5 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(can, msg, output) {output.innerHTML = ""; + init: function(event, can, msg, key, output) {output.innerHTML = ""; msg.Table(function(item, index) {if (!item.name) {return} can[item.name] = can.Plugin(can, item.name, item, function(event, cmds, cbs) { can.run(event, [item.river, item.storm, item.action].concat(cmds), cbs) @@ -7,6 +7,7 @@ Volcanos("onimport", {help: "导入数据", list: [], }) }, river: function(event, can, value, key, output) { + if (value == "update") {return} can.Conf("temp_river", value) }, storm: function(event, can, value, key, output) { @@ -16,7 +17,7 @@ Volcanos("onimport", {help: "导入数据", list: [], can.Conf("storm", value) if (!can.Cache(can.Conf("river")+"."+can.Conf("storm"), output)) { can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { - can.onimport.init(can, msg, output) + can.onimport.init(event, can, msg, key, output) }) } }, @@ -52,11 +53,11 @@ Volcanos("ondetail", {help: "组件详情", list: ["选择", "修改", "删除", }, true) }}}]) }, - "复制": function(event, can, msg, value, index, key, target) { - can.user.toast(can.page.CopyText(can, target.innerHTML), "复制成功") + "复制": function(event, can, msg, value, index, key, td) { + can.user.toast(can.page.CopyText(can, td.innerHTML), "复制成功") }, - "下载": function(event, can, msg, value, index, key, target) { - can.page.Download(can, key, target.innerHTML); + "下载": function(event, can, msg, value, index, key, td) { + can.page.Download(can, key, td.innerHTML); }, }) Volcanos("onexport", {help: "导出数据", list: [], @@ -70,5 +71,3 @@ Volcanos("onexport", {help: "导出数据", list: [], }, }) - - diff --git a/pane/Carte.js b/pane/Carte.js index 6edc12e7..e552a251 100644 --- a/pane/Carte.js +++ b/pane/Carte.js @@ -2,7 +2,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, outpu can.user.carte = function(event, cb) {if (!cb || !cb.list || cb.list.length == 0) {return} output.innerHTML = "", can.page.AppendItem(can, output, can.core.List(cb.list, function(item) { return {key: item}; - }), "", function(event, line, item) { + }), false, function(event, line, item) { typeof cb == "function" && cb(event, line.key, cb.meta) }) diff --git a/pane/Debug.js b/pane/Debug.js index 39963642..8f13a0b9 100644 --- a/pane/Debug.js +++ b/pane/Debug.js @@ -1,54 +1,8 @@ -Volcanos("onimport", {help: "导入数据", list: [], - init: function(can, field, option, action, output) {output.innerHTML = ""; - }, -}) -Volcanos("onaction", {help: "组件交互", list: [], -}) -Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空", "复制", "下载", "表格", "绘图", "媒体"], - "返回": function(event, can, msg, value, target) { - can.run(event, ["", "Last"]) - }, - "清空": function(event, can, msg, value, target) { - can.target.innerHTML = ""; - }, - "复制": function(event, can, msg, value, target) { - var list = can.onexport.Format(can, msg, "data"); - can.user.toast(can.page.CopyText(can, list[2]), "复制成功") - }, - "下载": function(event, can, msg, value, target) { - var list = can.onexport.Format(can, msg, msg._plugin_name||"data"); - can.page.Download(can, list[0]+list[1], list[2]); - }, -}) -Volcanos("ondetail", {help: "组件详情", list: ["选择", "修改", "删除", "复制", "下载"], - "选择": "select", - "删除": "delete", - "修改": function(event, can, msg, value, index, key, td) { - var text = td.innerHTML; - can.page.Appends(can, td, [{type: "input", style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) { - if (event.key != "Enter") {return} - can.run(event, [index, "modify", key == "value" && msg.key? msg[key][index]: key, event.target.value,], function(msg) { - td.innerHTML = event.target.value; - can.user.toast("修改成功") - }, true) - }}}]) - }, - "复制": function(event, can, msg, value, index, key, target) { - can.user.toast(can.page.CopyText(can, target.innerHTML), "复制成功") - }, - "下载": function(event, can, msg, value, index, key, target) { - can.page.Download(can, key, target.innerHTML); - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - Format: function(can, msg, name) { - var ext = ".csv", txt = can.page.Select(can, can.target, "tr", function(tr) { - return can.page.Select(can, tr, "td,th", function(td) {return td.innerText}).join(",") - }).join("\n"); - - !txt && (ext = ".txt", txt = msg.result && msg.result.join("") || ""); - return [name, ext, txt] - }, -}) +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, output, action, option, field) { +}}) +Volcanos("onaction", {help: "组件交互", list: []}) +Volcanos("onchoice", {help: "组件菜单", list: []}) +Volcanos("ondetail", {help: "组件详情", list: []}) +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Ocean.js b/pane/Ocean.js new file mode 100644 index 00000000..aafe9c16 --- /dev/null +++ b/pane/Ocean.js @@ -0,0 +1,63 @@ +Volcanos("onimport", {help: "导入数据", list: [], + _init: function(can, output, action, option, field) {output.innerHTML = ""; + var ui = can.page.Append(can, field, [{view: ["create"], list: [ + {input: ["name"], title: "群聊名称"}, + {button: ["创建群聊", function(event) { + if (!ui.name.value) {ui.name.focus(); can.user.toast("请输入群名"); return} + + var list = can.page.Select(can, ui.list, "tr", function(item) { + return item.dataset.user + }) + if (list.length == 0) {can.user.toast("请添加组员"); return} + + can.run(event, ["spawn", "", ui.name.value].concat(list), function(msg) { + can.Hide(), can.Export(event, "update", "river"); + }) + }]}, {name: "list", view: ["list", "table"], list: [{text: ["2. 已选用户列表", "caption"]}]}, + ]}]) + can.ui = ui + }, + init: function(event, can, msg, key, output) {output.innerHTML = ""; + var table = can.page.Append(can, output, "table"); + can.page.Append(can, table, [{text: ["1. 选择用户节点 ->", "caption"]}]) + + can.page.AppendTable(can, table, msg, ["key", "user.route"], function(event, value, key, index, tr, td) { + tr.className = "hidden"; + var uis = kit.AppendChild(can.ui.list, [{type: "tr", list: [{text: [key, "td"]}, {text: [msg["user.route"][index], "td"]}], dataset: {user: key}, click: function(event) { + tr.className = "normal", uis.last.parentNode.removeChild(uis.last) + }}]) + }) + }, + ocean: function(event, can, value, key, output) { + if (value == "create") {can.Show(); + can.run(event, [], function(msg) { + can.onimport.init(event, can, msg, key, output); + }); + } + }, +}) +Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新"], + "关闭": function(event, can, meta, key, output) { + can.Hide() + }, + "刷新": function(event, can, meta, key, output) { + can.run(event, [], function(msg) { + can.onimport.init(event, can, msg, key, output) + }) + }, +}) +Volcanos("onchoice", {help: "组件菜单", list: ["关闭", "刷新"], + "关闭": function(event, can, msg, key, target) { + can.onaction[key](event, can, key, can.output) + }, + "刷新": function(event, can, msg, key, target) { + can.onaction[key](event, can, key, can.output) + }, +}) +Volcanos("ondetail", {help: "组件详情", list: ["共享"], + "共享": function(event, can, line, key, target) { + can.user.toast(can.user.Share(can, {river: line.key}), "共享链接", 10000) + }, +}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/pane/River.js b/pane/River.js index 3a28be49..474a1938 100644 --- a/pane/River.js +++ b/pane/River.js @@ -1,64 +1,44 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(can, msg, output) {output.innerHTML = ""; + init: function(event, can, msg, key, output) {output.innerHTML = ""; can.page.AppendItem(can, output, msg.Table(), can.user.Search(can, "river"), function(event, line, item) { can.Export(event, line.key, "river") }) }, username: function(event, can, value, key, output) { can.run(event, [], function(msg) { - can.onimport.init(can, msg, output) + can.onimport.init(event, can, msg, key, output) + }) + }, + river: function(event, can, value, key, output) { + if (value == "update") { + can.run(event, [], function(msg) { + can.onimport.init(event, can, msg, key, output) + }) + } + }, +}) +Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], + "创建": function(event, can, meta, key, output) { + can.Export(event, "create", "ocean") + }, + "刷新": function(event, can, meta, key, output) { + can.run(event, [], function(msg) { + can.onimport.init(event, can, msg, key, output) }) }, }) -Volcanos("onaction", {help: "组件交互", list: [], -}) -Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空", "复制", "下载", "表格", "绘图", "媒体"], - "返回": function(event, can, msg, value, target) { - can.run(event, ["", "Last"]) +Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新"], + "创建": function(event, can, msg, key, target) { + can.Export(event, "create", "ocean") }, - "清空": function(event, can, msg, value, target) { - can.target.innerHTML = ""; - }, - "复制": function(event, can, msg, value, target) { - var list = can.onexport.Format(can, msg, "data"); - can.user.toast(can.page.CopyText(can, list[2]), "复制成功") - }, - "下载": function(event, can, msg, value, target) { - var list = can.onexport.Format(can, msg, msg._plugin_name||"data"); - can.page.Download(can, list[0]+list[1], list[2]); + "刷新": function(event, can, msg, key, target) { + can.onaction[key](event, can, key, can.output) }, }) -Volcanos("ondetail", {help: "组件详情", list: ["选择", "修改", "删除", "复制", "下载"], - "选择": "select", - "删除": "delete", - "修改": function(event, can, msg, value, index, key, td) { - var text = td.innerHTML; - can.page.Appends(can, td, [{type: "input", style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) { - if (event.key != "Enter") {return} - can.run(event, [index, "modify", key == "value" && msg.key? msg[key][index]: key, event.target.value,], function(msg) { - td.innerHTML = event.target.value; - can.user.toast("修改成功") - }, true) - }}}]) - }, - "复制": function(event, can, msg, value, index, key, target) { - can.user.toast(can.page.CopyText(can, target.innerHTML), "复制成功") - }, - "下载": function(event, can, msg, value, index, key, target) { - can.page.Download(can, key, target.innerHTML); +Volcanos("ondetail", {help: "组件详情", list: ["共享"], + "共享": function(event, can, line, key, target) { + can.user.toast(can.user.Share(can, {river: line.key}), "共享链接", 10000) }, }) -Volcanos("onexport", {help: "导出数据", list: [], - Format: function(can, msg, name) { - var ext = ".csv", txt = can.page.Select(can, can.target, "tr", function(tr) { - return can.page.Select(can, tr, "td,th", function(td) {return td.innerText}).join(",") - }).join("\n"); - - !txt && (ext = ".txt", txt = msg.result && msg.result.join("") || ""); - return [name, ext, txt] - }, -}) - - - +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Steam.js b/pane/Steam.js new file mode 100644 index 00000000..3020cdfc --- /dev/null +++ b/pane/Steam.js @@ -0,0 +1,88 @@ +Volcanos("onimport", {help: "导入数据", list: [], + _init: function(can, output, action, option, field) {output.innerHTML = ""; + var device = can.page.Append(can, field, [{"view": ["device", "table"]}]).last + var ui = can.page.Append(can, field, [{view: ["create"], list: [ + {title: "应用名称", input: ["name"]}, {button: ["创建应用", function(event) { + if (!ui.name.value) {ui.name.focus(); can.user.toast("请输入群名"); return} + + var list = [] + can.page.Select(can, ui.list, "tr", function(item) { + list.push(item.dataset.pod) + list.push(item.dataset.group) + list.push(item.dataset.index) + list.push(item.dataset.name) + }) + + can.run(event, [can.Conf("river"), "spawn", ui.name.value].concat(list), function(msg) { + can.Hide(), can.Export(event, "update", "ocean"); + }) + }]}, {name: "list", view: ["list", "table"], list: [{text: ["3. 已选命令列表", "caption"]}]}, + ]}]) + can.device = device + can.ui = ui + }, + init: function(event, can, msg, key, output) {output.innerHTML = ""; can.Show(); + var table = can.page.Append(can, output, "table") + + can.page.Append(can, table, [{text: ["1. 选择用户节点 ->", "caption"]}]) + can.page.AppendTable(can, table, msg, ["user", "node"], function(event, value, key, index, tr, td) { + + can.page.Select(can, table, "tr.select", function(item) {can.page.ClassList.del(can, item, "select")}) + can.page.ClassList.add(can, tr, "select") + + var node = msg.node[index]; + can.run(event, [can.Conf("river"), msg.user[index], node], function(com) { + can.page.Append(can, can.device, [{text: ["2. 选择模块命令 ->", "caption"]}]) + can.page.AppendTable(can, can.device, com, ["key", "index", "name", "help"], function(event, value, key, index, tr, td) { + + var last = can.page.Append(can, can.ui.list, [{ + row: [com.key[index], com.index[index], com.name[index], com.help[index]], + dataset: {pod: node, group: com.key[index], index: com.index[index], name: com.name[index]}, + click: function(event) {last.parentNode.removeChild(last)}, + }]).first + + }, function(event, value, key, index, tr, td) { + can.user.carte(event, shy(can.ondetail, can.ondetail.list, function(event, key, meta) { + meta[key](event, can, msg, key, td) + })) + }) + }) + }), table.querySelector("td").click() + }, + steam: function(event, can, value, key, output) { + if (value == "create") { + can.run(event, [can.Conf("river")], function(msg) { + can.onimport.init(event, can, msg, key, output); + }); + } + }, + river: function(event, can, value, key, output) { + if (value == "update") {return} + can.Conf("river", value) + }, +}) +Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新"], + "关闭": function(event, can, meta, key, output) { + can.Hide() + }, + "刷新": function(event, can, meta, key, output) { + can.run(event, [], function(msg) { + can.onimport.init(event, can, msg, key, output) + }) + }, +}) +Volcanos("onchoice", {help: "组件菜单", list: ["关闭", "刷新"], + "关闭": function(event, can, msg, key, target) { + can.onaction[key](event, can, key, can.output) + }, + "刷新": function(event, can, msg, key, target) { + can.onaction[key](event, can, key, can.output) + }, +}) +Volcanos("ondetail", {help: "组件详情", list: ["共享"], + "共享": function(event, can, line, value, target) { + can.user.toast(can.user.Share(can, {storm: line.key}), "共享链接", 10000) + }, +}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/pane/Storm.js b/pane/Storm.js index d9effb94..3229dcaa 100644 --- a/pane/Storm.js +++ b/pane/Storm.js @@ -1,29 +1,39 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(can, msg, output) {output.innerHTML = ""; + init: function(event, can, msg, key, output) {output.innerHTML = ""; can.page.AppendItem(can, output, msg.Table(), can.user.Search(can, "storm"), function(event, line, item) { can.Export(event, line.key, "storm") }) }, river: function(event, can, value, key, output) { + if (value == "update") {return} + can.run(event, [value], function(msg) { - can.onimport.init(can, msg, output) + can.onimport.init(event, can, msg, key, output) }) }, }) -Volcanos("onaction", {help: "组件交互", list: [], +Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], + "创建": function(event, can, meta, key, output) { + can.Export(event, "create", "steam") + }, + "刷新": function(event, can, meta, key, output) { + can.run(event, [], function(msg) { + can.onimport.init(event, can, msg, key, output) + }) + }, }) Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空", "复制", "下载", "表格", "绘图", "媒体"], - "返回": function(event, can, msg, value, target) { + "返回": function(event, can, msg, key, target) { can.run(event, ["", "Last"]) }, - "清空": function(event, can, msg, value, target) { + "清空": function(event, can, msg, key, target) { can.target.innerHTML = ""; }, - "复制": function(event, can, msg, value, target) { + "复制": function(event, can, msg, key, target) { var list = can.onexport.Format(can, msg, "data"); can.user.toast(can.page.CopyText(can, list[2]), "复制成功") }, - "下载": function(event, can, msg, value, target) { + "下载": function(event, can, msg, key, target) { var list = can.onexport.Format(can, msg, msg._plugin_name||"data"); can.page.Download(can, list[0]+list[1], list[2]); }, @@ -48,16 +58,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["选择", "修改", "删除", can.page.Download(can, key, target.innerHTML); }, }) -Volcanos("onexport", {help: "导出数据", list: [], - Format: function(can, msg, name) { - var ext = ".csv", txt = can.page.Select(can, can.target, "tr", function(tr) { - return can.page.Select(can, tr, "td,th", function(td) {return td.innerText}).join(",") - }).join("\n"); - - !txt && (ext = ".txt", txt = msg.result && msg.result.join("") || ""); - return [name, ext, txt] - }, -}) +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Toast.js b/pane/Toast.js index ed5b5b94..cbcf3d31 100644 --- a/pane/Toast.js +++ b/pane/Toast.js @@ -12,7 +12,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, outpu var toast = can.page.Appends(can, output, list) var width = text.width||text.text.length*10+10 - can.Show(width>400?400:width, text.height||80) + width = width>400?400:width + width = width<100?100:width + can.Show(width, text.height||80) var begin = can.base.Time().split(" ")[1] var timer = can.Timer({value: 1000, length: text.duration > 0? text.duration/1000: text.duration}, function(t, i) { diff --git a/proto.js b/proto.js index 27badb44..6e3732de 100644 --- a/proto.js +++ b/proto.js @@ -158,13 +158,12 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 })}); can.target.oncontextmenu = function(event) { - can.user.carte(event, shy("", can.onchoice, can.onchoice.list, function(event, value, meta) {var cb = meta[value]; - typeof cb == "function"? cb(event, can, msg, value, event.target): - can.run(event, [typeof cb == "string"? cb: value, event.target], null, true) + can.user.carte(event, shy("", can.onchoice, can.onchoice.list, function(event, key, meta) {var cb = meta[key]; + typeof cb == "function"? cb(event, can, msg, key, event.target): + can.run(event, [typeof cb == "string"? cb: key, event.target], null, true) })) event.stopPropagation() event.preventDefault() - return true } }, 10); }