diff --git a/frame.js b/frame.js index 9e41696e..d164d9c6 100644 --- a/frame.js +++ b/frame.js @@ -1,5 +1,5 @@ var can = Volcanos("chat", { - Page: shy("构造网页", function(can, name, conf, cb, body) { + Page: shy("构造网页", function(can, name, conf, cb, body, topic) { var page = Volcanos(name, {_type: "local", _panes: {}, _views: {}, target: body, Plugin: can.Plugin, Inputs: can.Inputs, Output: can.Output, @@ -7,17 +7,38 @@ var can = Volcanos("chat", { typeof cb == "function" && cb(event, page, value, key, body); }, Report: function(event, value, key) { - page.Import && page.Import(event, value, key) + // 导入数据 + page.Import(event, value, key) + // 分发数据 can.core.Item(page._panes, function(index, item) { + if (key == "favor") {var msg = value; + var cmds = msg.detail, cmd = cmds[0]; + if (cmd == item._name || cmd == item.name()) {cmd = cmds[1], cmds = cmds.slice(1)} + + var cb = item.onchoice[cmd]; + if (typeof cb == "function") { + cb(event, item, value, cmd, item.target); + return msg.Echo(item._name, " onchoice ", cmd), msg._hand = true; + } + + var cb = item.onaction[cmd]; + if (typeof cb == "function") { + cb(event, item, value, cmd, item.target); + return msg.Echo(item._name, " onaction ", cmd), msg._hand = true; + } + } + // 下发数据 item.Import && item.Import(event, value, key) }) }, run: function(event, option, cmds, cb) {can.misc.Run(event, page, option, cmds, cb)}, - }, Config.libs.concat(["page/"+name]), function(page) { + }, Config.libs.concat(["page/"+name, "page/"+topic+".css"]), function(page) { + // 加载配置 page.onimport._init && page.onimport._init(page, page.Conf(conf), body) can.core.Next(conf.pane, function(item, cb) { + // 加载模块 page._panes[item.name] = page[item.name] = page._views[item.pos] = page[item.pos] = can.Pane(page, item.name, item, cb, can.page.Select(can, body, "fieldset."+item.name)[0] || can.page.AppendField(can, body, item.name+" "+(item.pos||""), item)) @@ -25,7 +46,7 @@ var can = Volcanos("chat", { }, conf) return page }), - Pane: shy("构造面板", function(can, name, meta, cb, field) { + Pane: shy("构造组件", function(can, name, meta, cb, field) { var river = "", storm = ""; var pane = Volcanos(name, {_type: "local", _plugins: [], _local: {}, target: field, @@ -34,18 +55,21 @@ var can = Volcanos("chat", { output: field.querySelector("div.output"), Plugin: can.Plugin, Inputs: can.Inputs, Output: can.Output, - Export: function(event, value, key) {can.Report(event, value, key)}, + Export: function(event, value, key) {var cb = pane.onexport[key]; + typeof cb == "function"? cb(event, pane, value, key, field): can.Report(event, value, key) + }, Import: function(event, value, key) {var cb = pane.onimport[key]; // 导入数据 - typeof cb == "function" && cb(event, pane, value, key, pane.output); + typeof cb == "function" && cb(event, pane, value, key, field); // 分发数据 - can.core.List(pane._plugins, function(item) {item.Import(event, value, key)}) - // 导入数据 + // can.core.List(pane._plugins, function(item) {item.Import(event, value, key)}) + // 显示数据 pane.page.Select(pane, pane.action, "input."+key, function(item) {item.value = value}) }, Action: function(key, value) { return can.page.Select(can, pane.action, "input[name="+key+"],select."+key+",select[name="+key+"]", function(item) { + // 读写控件 value != undefined && (item.value = value), value = item.value }), value }, @@ -68,7 +92,7 @@ var can = Volcanos("chat", { field.style.height = "" } - typeof cb == "function" && cb(event, pane, {width: width, height: height}, "size", pane.output) + typeof cb == "function" && cb(event, pane, {width: width, height: height}, "size", field) }, Show: function(event, width, height, offset) {field.style.display = "block"; if (width < 0) {field.style.left = -width / 2 + "px"; @@ -97,6 +121,7 @@ var can = Volcanos("chat", { run: function(event, cmds, cb) {var msg = pane.Event(event) can.page.Select(can, pane.action, "input", function(item, index) { + // 控件参数 item.name && item.value && msg.Option(item.name, item.value) }) can.run(event, pane.option.dataset, cmds, cb) @@ -123,6 +148,9 @@ var can = Volcanos("chat", { option: option, action: action, output: output, Inputs: can.Inputs, Output: can.Output, + Export: function(event, value, key) {var cb = plugin.onexport[key]; + typeof cb == "function"? cb(event, plugin, value, key, field): can.Export(event, value, key) + }, Import: function(event, value, key) {var cb = plugin.onimport[key]; // 导入数据 typeof cb == "function" && cb(event, plugin, value, key, plugin.output); @@ -145,19 +173,6 @@ var can = Volcanos("chat", { } }, - Share: function(event) { - can.user.input(event, can, ["name", "text"], function(event, cmd, meta, list) { - cmd == "提交" && plugin.Run(event, ["action", "share", meta.name, meta.text], function(msg) { - can.user.toast(can.user.Share(can, {path: "/share/"+msg.Result()+"/"}, true)) - }, true) - return true - }) - }, - Rename: function(event) {var meta = field.Meta; - meta.help = can.user.prompt("", function(help) { - meta.help = help - }, meta.help) - }, Remove: function(event) {var list = can.page.Select(can, option, "input.temp") list.length > 0 && list[list.length-1].parentNode.removeChild(list[list.length-1]) }, @@ -215,6 +230,7 @@ var can = Volcanos("chat", { }) }, Show: function(type, msg, cb) {plugin.msg = msg, msg._plugin_name = name; + msg.Option("title") && can.user.title(msg.Option("title")) return plugin._output = plugin._local[type] = plugin[type] = can.Output(plugin, feature, type, msg, cb, output, action, option, status) }, Clone: function(event, cb) {meta.nick = meta.name + can.ID() @@ -226,20 +242,21 @@ var can = Volcanos("chat", { Delete: function(event) {field.parentNode.removeChild(field)}, }, Config.libs.concat(["plugin/"+(meta.type||feature.active||"state")]), function(plugin) {plugin.Conf(meta); var list = JSON.parse(meta.inputs||"[]"); + // 加载配置 plugin.onimport._init? plugin.onimport._init(plugin, feature, plugin.output, plugin.action, plugin.option): + // 加载控件 can.core.Next(list.length>0? list: [{type: "text"}, {type: "button", value: "执行"}], plugin.Append, function() { typeof cb == "function" && cb(plugin) }) + // 加载控件 meta.msg && plugin.Show(feature.display || "table", meta.msg) }, meta) - field.Check = plugin.Check - return plugin + return field.Check = plugin.Check, plugin }), Inputs: shy("构造控件", function(can, item, type, name, value, cb, option) { var input = Volcanos(name, {_type: "input", _plugin: can, item: item, target: "", Run: can.Run, Runs: can.Runs, - Select: function(event) {can.Select(event, input.target, true)}, Import: function(event, value, key, index) {var cb = input.onimport[item.imports]; value = typeof cb == "function" && cb(event, input, value, key, input.target) || value input.target.value = value; @@ -247,25 +264,24 @@ var can = Volcanos("chat", { }, Append: function(event, value) {can.Append(null, function(input) {can.Select(event, input.target, true)})}, Clone: function(event, value) {can.Clone(event, function(input) {input.Select(event, null, true)})}, + Select: function(event) {can.Select(event, input.target, true)}, + run: function(event, cmd, cb, silent) {var msg = can.Event(event); msg.Option("_action", item.name); (input[item.cb] || can[item.cb] || can.Check)(event, event.target, cb); }, - - }, Config.libs.concat(["plugin/"+type]), function(input) { + }, Config.libs.concat(["plugin/"+type, "plugin/input/"+(item.figure||"")]), function(input) { var target = input.onimport.init(input, item, name, value, option); input.target = target, typeof cb == "function" && cb(input); }) return input }), Output: shy("构造组件", function(can, feature, type, msg, cb, target, action, option, status) { - if (type == "inner" && (!msg.result || msg.result.length == 0)) {type = "table"} - var output = Volcanos(type, {_type: "output", feature: feature, msg: msg, target: target, action: action, Run: can.Run, Runs: can.Runs, - Import: function(event, value, key) {var cb = output.onimport[key]; + Import: function(event, value, key) {var cb = output.onimport && output.onimport[key]; typeof cb == "function" && cb(event, output, value, key, target); }, Option: function(key, value) { @@ -301,14 +317,11 @@ var can = Volcanos("chat", { return output }), }, Config.libs.concat(Config.list), function(can) { - can[Config.main] = can.Page(can, Config.main, Config, function(chat) { - chat.Import(event||{}, can.user.Search(can, "layout")||Config.layout.def, "layout") - can.user.title(can.user.Search(can, "you")||Config.title) - chat.Login? can.user.login(function(user) { - chat.River.Import(event||{}, "update", "river") - chat.Header.Import(event||{}, user.name, "username") - }): (chat.Action.Import(event||{}, location.pathname.split("/")[2], "river"), chat.Action.Import(event||{}, "none", "storm")) - }, document.body) + can.user.Search(can, "sessid") && can.user.Cookie(can, "sessid", can.user.Search(can, "sessid")) && can.user.Search(can, "sessid", "") - can.require(["page/"+(can.user.Search(can, "topic")||Config.topic)+".css"], function() {}) + can[Config.main] = can.Page(can, Config.main, Config, function(chat) { + chat.Import({}, can.user.Search(can, "layout")||Config.layout.def, "layout") + chat.Import({}, can.user.Search(can, "you")||can.user.Search(can, "title")||Config.title, "title") + chat.Import({}, "", "login") + }, document.body, can.user.Search(can, "topic")||Config.topic) }) diff --git a/index.html b/index.html index b8c37581..a3ad0527 100644 --- a/index.html +++ b/index.html @@ -2,6 +2,7 @@ + volcanos diff --git a/index.js b/index.js index ef56b08b..8d7208de 100644 --- a/index.js +++ b/index.js @@ -1,24 +1,28 @@ var Config = {iceberg: "/chat/", volcano: "/static/volcanos/", libs: ["lib/base", "lib/core", "lib/misc", "lib/page", "lib/user"], main: "chat", list: ["page/chat", - "pane/Toast", "pane/Tutor", "pane/Debug", - "pane/Carte", "pane/Favor", "pane/Login", + "pane/Toast", "pane/Carte", + "pane/Debug", "pane/Tutor", "pane/Favor", "pane/Login", "pane/Header", "pane/Ocean", "pane/River", "pane/Storm", "pane/Steam", "pane/Target", "pane/Source", "pane/Action", "pane/Footer", - "plugin/state", "plugin/input", "plugin/table", "plugin/inner", "plugin/media", + "plugin/state", "plugin/table", "plugin/input", + "plugin/input/date", "plugin/input/key", ], pane: [ {group: "index", name: "Toast", pos: "dialog", duration: 3000}, - {group: "index", name: "Tutor", pos: "dialog"}, - {group: "index", name: "Debug", pos: "dialog"}, {group: "index", name: "Carte", pos: "dialog"}, + {group: "index", name: "Debug", pos: "dialog"}, + {group: "index", name: "Tutor", pos: "dialog"}, {group: "index", name: "Favor", pos: "dialog"}, {group: "index", name: "Login", pos: "dialog"}, - {group: "index", name: "Header", pos: "head", state: ["time", "user", "link"], title: "github.com/shylinux/context"}, + {group: "index", name: "Header", pos: "head", + title: "github.com/shylinux/context", + state: ["time", "user", "link"], + }, {group: "index", name: "Ocean", pos: "dialog", def_name: "meet"}, {group: "index", name: "River", pos: "left"}, {group: "index", name: "Storm", pos: "right"}, @@ -37,5 +41,5 @@ var Config = {iceberg: "/chat/", volcano: "/static/volcanos/", "最长": {head: 30, foot: 30, left: 0, right: 0, bottom: -2, center: 0, top: 0}, "全屏": {head: 0, foot: 0, left: 0, right: 0, bottom: -1, center: 0, top: 0}, }, border: 4, - }, + }, scroll: {line: 100}, } diff --git a/lib/core.js b/lib/core.js index e1f18870..6181a3e9 100644 --- a/lib/core.js +++ b/lib/core.js @@ -37,14 +37,14 @@ Volcanos("core", {help: "核心模块", } return list }), - Items: function(obj, cb) {var list = [] + Items: shy("迭代器", function(obj, cb) {var list = []; for (var key in obj) { list = list.concat(this.List(obj[key], function(value, index, array) { return typeof cb == "function" && cb(value, index, key, obj) })) } return list - }, + }), Next: shy("迭代器", function(obj, cb, cbs) {obj = typeof obj == "string"? [obj]: (obj || []) function next(list, cb) { list && list.length > 0? typeof cb == "function" && cb(list[0], function() { @@ -53,4 +53,8 @@ Volcanos("core", {help: "核心模块", } next(obj, cb) }), + + Split: shy("分词器", function(str, sep) { + return str.trim().split(sep||" ") + }), }) diff --git a/lib/page.js b/lib/page.js index 82aebed0..34704c05 100644 --- a/lib/page.js +++ b/lib/page.js @@ -1,7 +1,7 @@ Volcanos("page", {help: "网页模块", ClassList: { has: function(can, obj, key) {var list = obj.className? obj.className.split(" "): []; - for (var i = 1; i < arguments.length; i++) { + for (var i = 2; i < arguments.length; i++) { if (list.indexOf(arguments[i]) == -1) {return false} } return true; @@ -264,7 +264,12 @@ Volcanos("page", {help: "网页模块", AppendAction: shy("添加控件", function(can, action, list, cb) { return can.page.Append(can, action, can.core.List(list, function(line) { - return typeof line == "string"? {button: [line, cb]}: line.length > 0? {select: [line, cb]}: line + return typeof line == "string"? {button: [line, cb]}: line.length > 0? {select: [line, cb]}: + line.input && typeof line.input != "string" ? {input: [line.input[0], function(event) { + typeof line.input[1] == "function" && line.input[1](event, can) + }, function(event) { + typeof line.input[2] == "function" && line.input[2](event, can) + }]}: line })) }), AppendStatus: shy("添加控件", function(can, status, list, cb) { @@ -394,5 +399,73 @@ Volcanos("page", {help: "网页模块", event.preventDefault() return true }, + + Prepos: function(event, item) { + var pos = 1; + var p = item.getBoundingClientRect(); + var y = (event.clientY - p.y) / p.height + if (y < 0.2) { + pos += 0; + } else if (y > 0.8) { + pos += 6; + } else { + pos += 3; + } + var x = (event.clientX - p.x) / p.width + if (x < 0.2) { + pos += 0; + } else if (x > 0.8) { + pos += 2; + } else { + pos += 1; + } + + var cursor = [ + "nw-resize", "n-resize", "ne-resize", + "w-resize", "move", "e-resize", + "sw-resize", "s-resize", "se-resize", + ] + item.style.cursor = cursor[pos-1] + return pos + }, + Resize: function(event, item, begin, pos) { + switch (pos) { + case 5: + item.style.left = begin.left + event.clientX - begin.x + "px" + item.style.top = begin.top + event.clientY - begin.y + "px" + return + } + + switch (pos) { + case 1: + case 2: + case 3: + item.style.top = begin.top + event.clientY - begin.y + "px" + item.style.height = begin.height - event.clientY + begin.y + "px" + break + } + switch (pos) { + case 1: + case 4: + case 7: + item.style.left = begin.left + event.clientX - begin.x + "px" + item.style.width = begin.width - event.clientX + begin.x + "px" + break + } + switch (pos) { + case 3: + case 6: + case 9: + item.style.width = begin.width + event.clientX - begin.x + "px" + break + } + switch (pos) { + case 7: + case 8: + case 9: + item.style.height = begin.height + event.clientY - begin.y + "px" + break + } + }, }) diff --git a/lib/user.js b/lib/user.js index 7aa56ee9..22310db3 100644 --- a/lib/user.js +++ b/lib/user.js @@ -28,9 +28,7 @@ Volcanos("user", {help: "用户模块", can.page.Remove(can, view.first) } }]}, {button: ["关闭", function(event, value) { - if (typeof cb == "function" && cb(event, value, {}, [])) { - can.page.Remove(can, view.first) - } + can.page.Remove(can, view.first) }]}]}, ]}]) can.page.Select(can, view.first, "input", function(item, index) { @@ -38,10 +36,10 @@ Volcanos("user", {help: "用户模块", }) return view }, + toast: function(text) {}, carte: function(event, cb) {}, login: function(cb) {}, - share: function(cb) {}, Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; var path = location.pathname; obj.path && (path = obj.path, delete(obj.path)) @@ -63,9 +61,11 @@ Volcanos("user", {help: "用户模块", } else if (key == undefined) { return args } else if (value == undefined) { - return args[key] || can.user.Cookie(can, key) + // return args[key] || can.user.Cookie(can, key) + return args[key] } else { args[key] = value + args[key] == "" && delete(args[key]) } return location.search = can.core.Item(args, function(key, value) { diff --git a/page/chat.js b/page/chat.js index 931658b6..983d788a 100644 --- a/page/chat.js +++ b/page/chat.js @@ -5,34 +5,49 @@ Volcanos("onimport", {help: "导入数据", list: [], } }, layout: function(event, can, value, key, body) {var conf = can.Conf() - can.onlayout["刷新"](event, can, conf, conf.layout.size[value], body) + can.onlayout["刷新"](event, can, conf, value? conf.layout.size[value]: null, body) + }, + title: function(event, can, value, key, body) {var conf = can.Conf() + can.user.title(value||conf.title) + }, + login: function(event, can, value, key, body) {var conf = can.Conf() + var list = location.pathname.split("/"); + can.Login? can.user.login(function(user) { + can.River.Import(event, "update", "river") + can.Header.Import(event, user.name, "username") + }): ( + can.Action.Import(event, list[2], "river"), + can.Action.Import(event, "action", "storm") + ) } }) Volcanos("onaction", {help: "组件交互", list: [], - onkeydown: function(event, can) { + onkeydown: function(event, can) {var conf = can.Conf() if (event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { return } if (event.target.getAttribute("contenteditable")) { return } + switch (event.key) { - case "k": - can.Report(event, {x: 0, y: -30}, "scroll") - break case "j": - can.Report(event, {x: 0, y: 30}, "scroll") + can.Report(event, {x: 0, y: conf.scroll.line}, "scroll") + break + case "k": + can.Report(event, {x: 0, y: -conf.scroll.line}, "scroll") break case "Escape": - can.Action.escape && can.Action.escape(event) + can.Report(event, event.key, "escape") + break + case "Enter": + can.Report(event, event.key, "enter") break case " ": - can.Favor && can.page.Select(can, can.Favor.Show(), "input.cmd", function(item) { - item.focus() - }) - - event.stopPropagation() - event.preventDefault() + can.Report(event, event.key, "space") + break + default: + can.Report(event, event.key, "keydown") } }, }) @@ -48,6 +63,9 @@ Volcanos("onlayout", {help: "组件布局", list: ["刷新"], can.foot.Size(event, width, layout.foot) height -= can.head.target.offsetHeight+can.foot.target.offsetHeight + layout.left != 0 && can.left.target.dataset.width && (layout.left = can.left.target.dataset.width) + layout.right != 0 && can.right.target.dataset.width && (layout.right = can.right.target.dataset.width) + layout.left == undefined && (layout.left = can.left.target.clientWidth) layout.right == undefined && (layout.right = can.right.target.clientWidth) can.left.Size(event, layout.left, height) @@ -66,13 +84,7 @@ Volcanos("onlayout", {help: "组件布局", list: ["刷新"], can.top.Size(event, width, height) }, }) -Volcanos("onchoice", {help: "组件菜单", list: ["刷新", "登出"], - "刷新": function(event, can, conf, key, body) { - }, - "登出": function(event, can, conf, value, target) { - can.target.innerHTML = ""; - }, -}) +Volcanos("onchoice", {help: "组件菜单", list: []}) Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Action.js b/pane/Action.js index f758c8ef..be654fe8 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -1,77 +1,202 @@ Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, conf, output, action, option, field) { - can.page.Select(can, action, "input", function(input) { - input.value = can.user.Search(can, input.name) || "" + _begin: function(can) {}, + _start: function(can) { + can.page.Select(can, can.action, "input,select", function(input) { + input.value = can.user.Search(can, input.name) || input.value || "" }) }, - init: function(event, can, msg, cmd, target) {can.output.innerHTML = ""; + + init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; can._local[msg.cmds[0]] = can._local[msg.cmds[0]] || {} can._local[msg.cmds[0]][msg.cmds[1]] = msg.Table(function(item, index) {if (!item.name) {return} + // 添加插件 var plugin = 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) }, can.page.AppendField(can, can.output, "item "+item.name, item)) return can._plugins.push(plugin), plugin }) }, - river: function(event, can, value, cmd, target) { - if (value == "update") {return} + river: function(event, can, value, cmd, field) {if (value == "update") {return} can.Conf("temp_river", value) }, - storm: function(event, can, value, cmd, target) { + storm: function(event, can, value, cmd, field) {if (value == "update") {return} + // 保存界面 can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some"); - - can.Conf("river", can.Conf("temp_river")) - can.Conf("storm", value) - if (!can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output)) { - can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { - can.onimport.init(event, can, msg, cmd, can.output) - }) + if (can.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) { + // 恢复界面 + return } - }, - - layout: function(event, can, value, cmd, target) {can.layout = value; - can.page.Select(can, can.action, "select.layout", function(item) { - item.value = value + // 刷新界面 + can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { + can.onimport.init(event, can, msg, cmd, can.output) }) }, - scroll: function(event, can, value, cmd, target) {can.layout = value; - can.output.parentElement.scrollBy(value.x, value.y) - }, - - you: function(event, can, value, cmd, target) { + you: function(event, can, value, cmd, field) { can.user.title(value) }, - favor: function(event, can, msg, cmd, target) {var key = msg.detail[0]; - if (msg._hand) {return} - var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, can.output); return msg.Echo(can._name, " onaction ", key), msg._hand = true} - var cb = can.onchoice[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, can.output); return msg.Echo(can._name, " onchoice ", key), msg._hand = true} - var sub = can[key]; if (sub && sub.Select) {sub.Select(event, null, true); return msg.Echo(can._name, " select ", sub._name), msg._hand = true} + layout: function(event, can, value, cmd, field) {value && can.Action(cmd, value)}, + scroll: function(event, can, value, cmd, field) {can.layout = value; + can.output.parentElement.scrollBy(value.x, value.y) + }, + favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} + var cmds = msg.detail, key = cmds[0]; + if (key == can.name()) {key = cmds[1], cmds = cmds.slice(1)} - can._plugin && can._plugin.Import(event, msg, cmd) + // 下发数据 + can.core.Item(can._local, function(river, list) { + can.core.Item(list, function(storm, list) { + can.core.List(list, function(sub) { + if (sub._name == key) { + sub.Select(event), msg._hand = true; + msg.Echo(can._name, " ", key) + } + }) + }) + }) }, }) -Volcanos("onaction", {help: "组件交互", list: [["layout"].concat(Config.layout.list), "刷新", "清屏", "并行","串行", - ["action", "正常", "编辑", "编排", "定位"], +Volcanos("onaction", {help: "组件交互", list: [ + ["layout"].concat(Config.layout.list), "清屏", "刷新", "并行","串行", + ["action", "正常", "竖排", "编排", "定位", "定形"], {input: "pod"}, {input: "you"}, {input: "hot"}, {input: "top"}, ], - onmousemove: function(event, can, msg, cmd, target) { - can.resize && can.resize(event) + layout: function(event, can, value, cmd, field) {can.Export(event, value, cmd)}, + + "清屏": function(event, can, msg, cmd, field) { + can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { + item.innerHTML = ""; + }) + }, + "刷新": function(event, can, msg, cmd, field) { + can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { + item.innerHTML = ""; + }) + can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { + can.onimport.init(event, can, msg, cmd, can.output) + }) + }, + "并行": function(event, can, msg, cmd, field) { + can.page.Select(can, field, "fieldset.item", function(field) { + can.page.Select(can, field, "input[type=button]", function(input, index) { + index == 0 && input.click() + }) + }) + }, + "串行": function(event, can, msg, cmd, field) { + can.core.Next(can.page.Select(can, field, "fieldset.item", function(field) { + return field + }), function(field, cb) { + can.page.Select(can, field, "input[type=button]", function(input, index) { + index == 0 && field.Check(event, input, cb) + }) + }) }, - layout: function(event, can, value, cmd, target) {can.Export(event, value, cmd)}, + "正常": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.setAttribute("draggable", false) + item.style.position = "" + item.style.cursor = "" + item.style.clear = "" + item.style.left = "" + item.style.top = "" + }) + }, + "竖排": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.clear = "both" + }) + }, + "编排": function(event, can, value, cmd, field) { + can.page.Select(can, can.target, "fieldset.item", function(item) { + item.setAttribute("draggable", true) + item.ondragstart = function(event) {can.drag = event.target} + item.ondragover = function(event) {event.preventDefault()} + item.ondrop = function(event) {event.preventDefault() + item.parentNode.insertBefore(can.drag, item) + } + }) + }, + "定位": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.left = item.offsetLeft + "px" + item.style.top = item.offsetTop + "px" + }) - "共享": function(event, can, msg, cmd, target) { + var max, current, begin; + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.position = "absolute" + + item.onmousedown = function(event) {if (can.Action("action") != "定位") {return} + if (current) { + // 更新位置 + current.style.left = begin.left + event.clientX - begin.x + "px" + current.style.top = begin.top + event.clientY - begin.y + "px" + current = null; + return + } + // 记录位置 + current = item; + current.style["z-index"] = max = max + 1 + begin = {x: event.clientX, y: event.clientY, left: item.offsetLeft, top: item.offsetTop} + }; + + can.output.onmousemove = item.onmousemove = function(event) {if (!current) {return} + // 移动位置 + current.style.left = begin.left + event.clientX - begin.x + "px" + current.style.top = begin.top + event.clientY - begin.y + "px" + } + }) + }, + "定形": function(event, can, value, cmd, field) { + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.top = item.offsetTop + "px" + item.style.left = item.offsetLeft + "px" + item.style.width = item.offsetWidth + "px" + item.style.height = item.offsetHeight + "px" + }) + + var max, pos, current, begin; + can.page.Select(can, can.output, "fieldset.item", function(item) { + item.style.position = "absolute" + + item.onmousedown = function(event) { + if (can.Action("action") != "定形") {return} + if (current) {current = null; return} + + // 记录位置 + current = item; + current.style["z-index"] = max = max + 1 + begin = { + x: event.clientX, y: event.clientY, + left: item.offsetLeft, top: item.offsetTop, + width: item.offsetWidth, height: item.offsetHeight, + } + }; + + item.onmousemove = function(event) { + if (can.Action("action") != "定形") {return} + var pos = can.page.Prepos(event, item) + if (!current) {return} + can.page.Resize(event, current, begin, pos) + } + }) + }, +}) +Volcanos("onchoice", {help: "组件菜单", list: ["共享", "保存", "刷新"], + "共享": function(event, can, msg, cmd, field) { can.user.input(event, can, ["name", "text"], function(event, cmd, meta, list) { - cmd == "提交" && can.run(event, [can.Conf("river"), can.Conf("storm"), "share", meta.name, meta.text], function(msg) { - can.user.toast(can.user.Share(can, {path: "/share/"+msg.Result()+"/"}, true)) - }, true) + var msg = can.Event(event); + msg.Option("name", meta.name) + msg.Option("text", meta.key) + cmd == "提交" && can.Export(event, can.name(), "share") return true }) }, - "保存": function(event, can, msg, cmd, target) { + "保存": function(event, can, msg, cmd, field) { var list = [] - can.page.Select(can, target, "fieldset", function(item) {var meta = item.Meta + can.page.Select(can, field, "fieldset", function(item) {var meta = item.Meta can.page.Select(can, item, "form.option", function(option) { meta.args = can.page.Select(can, option, ".args", function(item) {return item.value}) }) @@ -81,87 +206,7 @@ Volcanos("onaction", {help: "组件交互", list: [["layout"].concat(Config.layo can.user.toast("保存成功") }) }, - "刷新": function(event, can, msg, cmd, target) { - can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { - item.innerHTML = ""; - }) - can.run(event, [can.Conf("river"), can.Conf("storm")], function(msg) { - can.onimport.init(event, can, msg, cmd, can.output) - }) - }, - "清屏": function(event, can, msg, cmd, target) { - can.page.Select(can, can.output, "fieldset.item>div.output", function(item) { - item.innerHTML = ""; - }) - }, - "并行": function(event, can, msg, cmd, target) { - can.page.Select(can, target, "fieldset.item", function(field) { - can.page.Select(can, field, "input[type=button]", function(input, index) { - index == 0 && field.Check(event, input, function() {}) - }) - }) - }, - "串行": function(event, can, msg, cmd, target) { - can.core.Next(can.page.Select(can, target, "fieldset.item", function(field) { - return field - }), function(field, cb) { - can.page.Select(can, field, "input[type=button]", function(input, index) { - index == 0 && field.Check(event, input, cb) - }) - }) - }, - action: function(event, can, value, cmd, target) { - switch (value) { - case "正常": - can.page.Select(can, target, "fieldset.item", function(item) { - item.setAttribute("draggable", false) - item.style.position = "" - item.style.left = "" - item.style.top = "" - }) - break - case "编排": - can.page.Select(can, target, "fieldset.item", function(item) { - item.setAttribute("draggable", true) - item.ondragstart = function(event) {can.drag = event.target} - item.ondragover = function(event) {event.preventDefault()} - item.ondrop = function(event) {event.preventDefault() - item.parentNode.insertBefore(can.drag, item) - } - }) - break - case "定位": - var max = 0; - var current, begin; - can.page.Select(can, target, "fieldset.item", function(item) { - item.style.left = item.offsetLeft + "px" - item.style.top = item.offsetTop + "px" - }) - can.page.Select(can, target, "fieldset.item", function(item) { - item.style.position = "absolute" - item.onmousedown = function(event) { - if (can.Action("action") != "定位") {return} - - if (current) { - current.style.left = event.clientX - begin.x + begin.left + "px" - current.style.top = event.clientY - begin.y + begin.top + "px" - current = null; - return - } - current = event.target; - current.style["z-index"] = max = max + 1 - begin = {x: event.clientX, y: event.clientY, left: item.offsetLeft, top: item.offsetTop} - }; - target.onmousemove = item.onmousemove = function(event) {if (!current) {return} - current.style.left = event.clientX - begin.x + begin.left + "px" - current.style.top = event.clientY - begin.y + begin.top + "px" - } - }) - break - } - }, }) -Volcanos("onchoice", {help: "组件菜单", list: ["保存", "刷新", "共享"]}) Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Debug.js b/pane/Debug.js index d328f746..8a998ab8 100644 --- a/pane/Debug.js +++ b/pane/Debug.js @@ -1,10 +1,4 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, conf, output, action, option, field) { - }, - favor: function(event, can, value, cmd, output) { - console.log(can.base.Time(), value) - }, -}) +Volcanos("onimport", {help: "导入数据", list: []}) Volcanos("onaction", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件菜单", list: []}) Volcanos("ondetail", {help: "组件详情", list: []}) diff --git a/pane/Favor.js b/pane/Favor.js index 42298bb7..99c1a4fc 100644 --- a/pane/Favor.js +++ b/pane/Favor.js @@ -5,36 +5,33 @@ Volcanos("onimport", {help: "导入数据", list: [], can.target.style.width = "" function res(msg) { - if (msg._hand) {ui.cmd.value = ""; - output.innerHTML = msg.Result() + if (msg._hand) {ui.cmd.value = "", output.innerHTML = ""; + msg.result && msg.result.length > 0? can.page.Append(can, output, [{text: msg.Result()}]): + can.page.AppendTable(can, output, msg, msg.append); } return msg } - function run(event, cmds) {cmds = cmds.trim().split(" "); + function run(event, cmds) {cmds = can.core.Split(cmds); var cmd = cmds[0]; if (cmd == "") {return} - var msg = can.Event(event, {detail: cmds}); - can.msg = msg; + can.msg = can.Event(event, {detail: cmds}); var cb = can.onexport[cmd]; - typeof cb == "function"? cb(event, can, msg, cmds, output): can.Export(event, msg, "favor"); - - return msg._hand? res(msg): can.run(event, cmds, res, true); + typeof cb == "function"? cb(event, can, can.msg, cmds, output): can.Export(event, can.msg, "favor"); + return can.msg._hand? res(can.msg): can.run(event, cmds, res, true); } var ui = can.page.Append(can, option, [{input: ["cmd", function(event) { - can.page.oninput(event, can) - switch (event.key) { - case "Enter": run(event, event.target.value); break - case "Escape": can.Hide(); break + case "Enter": run(event, event.target.value); return + case "Escape": can.Hide(); return default: if (event.target.value.endsWith("j") && event.key == "k") { can.page.DelText(event.target, event.target.selectionStart-1, 2) event.target.value == ""? can.Hide(): run(event, event.target.value) - break - } return false + return + } } - event.stopPropagation() - event.preventDefault() + + can.page.oninput(event, can) return true }, function(event) { switch (event.key) { @@ -45,8 +42,14 @@ Volcanos("onimport", {help: "导入数据", list: [], return true }]}]) }, + + space: function(event, can, value, cmd, field) { + can.page.Select(can, can.Show(), "input.cmd", function(item) { + item.focus() + }) + }, }) -Volcanos("onaction", {help: "组件交互", list: [], +Volcanos("onaction", {help: "组件交互", list: ["关闭", "清空", "下载"], onmousedown: function(event, can) { if (event.ctrlKey) {can.moving = !can.moving, can.movarg = { left: can.target.offsetLeft, @@ -61,18 +64,21 @@ Volcanos("onaction", {help: "组件交互", list: [], } }, onmouseup: function(event, can) { - // can.moving = false; }, -}) -Volcanos("onchoice", {help: "组件菜单", list: ["下载"], - "下载": function(event, can, msg, cmd, target) {msg = msg || can.msg; - var list = msg.Export(can._name); + "关闭": function(event, can, value, cmd, field) { + can.Hide(); + }, + "清空": function(event, can, value, cmd, field) { + can.output.innerHTML = "" + }, + "下载": function(event, can, value, cmd, field) { + var list = can.msg.Export(can._name); can.page.Download(can, list[0]+list[1], list[2]); }, }) +Volcanos("onchoice", {help: "组件菜单", list: ["下载", "关闭"]}) Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("onexport", {help: "导出数据", list: [], - hi: function(event, can, msg, cmd, output) {msg.Echo("hello world")}, - time: function(event, can, msg, cmd, output) {msg.Echo(can.base.Time())}, + time: function(event, can, msg, cmd, field) {msg.Echo(can.base.Time())}, }) diff --git a/pane/Footer.js b/pane/Footer.js index 95ab60dd..3242d08f 100644 --- a/pane/Footer.js +++ b/pane/Footer.js @@ -1,19 +1,19 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, output, action, option, field) {output.innerHTML = ""; conf.title && can.page.Append(can, output, [{view: "title", list: [{text: conf.title, className: "title"}]}]) + can.ui = can.page.Append(can, output, [{view: "state", list: can.core.List(conf.state, function(item) { - return {text: conf[item]||"", className: item, click: function(event) {var cb = can.onexport[item]; - typeof cb == "function" && cb(event, can, item, item, output) - }}; + return {text: conf[item]||"", className: item, click: function(event) {can.Export(event, conf[item], item)}}; })}]) }, - email: function(event, can, value, cmd, output) { + + email: function(event, can, value, cmd, field) { can.ui[cmd].innerHTML = value }, - ntxt: function(event, can, value, cmd, output) {var state = can.Conf(cmd); + ntxt: function(event, can, value, cmd, field) {var state = can.Conf(cmd); can.ui[cmd].innerHTML = cmd+":"+ can.Conf(cmd, can.base.Int(value)+can.base.Int(state)) }, - ncmd: function(event, can, value, cmd, output) {var state = can.Conf(cmd); + ncmd: function(event, can, value, cmd, field) {var state = can.Conf(cmd); can.ui[cmd].innerHTML = cmd+":"+ can.Conf(cmd, can.base.Int(value)+can.base.Int(state)) }, }) diff --git a/pane/Header.js b/pane/Header.js index 4a18de24..ee3e418b 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -1,37 +1,34 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, output, action, option, field) {output.innerHTML = ""; conf.title && can.page.Append(can, output, [{view: "title", - list: [{text: conf.title, className: "title"}], click: function(event) {can.onexport.title(event, can)}}]) + list: [{text: conf.title, className: "title"}], click: function(event) {can.Export(event, conf.title, "title")}}]) can.ui = can.page.Append(can, output, [{view: "state", list: can.core.List(conf.state, function(item) { - return {text: conf[item]||"", className: item, click: function(event) {var cb = can.onexport[item]; - typeof cb == "function" && cb(event, can, item, item, output) - }}; + return {text: conf[item]||"", className: item, click: function(event) {can.Export(event, conf[item], item)}}; })}]) - can.timer = can.Timer({interval: 1000, length: -1}, function() { - can.ui.time.innerHTML = can.base.Time().split(" ")[1] + can.timer = can.Timer({interval: 1000, length: -1}, function(event) { + can.Import(event, can.base.Time().split(" ")[1], "time") }) }, - title: function(event, can, value, cmd, output) { + title: function(event, can, value, cmd, field) { can.ui[cmd].innerHTML = value }, - username: function(event, can, value, cmd, output) { + username: function(event, can, value, cmd, field) { + value.length > 10 && (value = value.slice(0, 8)) can.ui["user"].innerHTML = value }, - time: function(event, can, value, cmd, output) { + time: function(event, can, value, cmd, field) { can.ui[cmd].innerHTML = value }, - link: function(event, can, value, cmd, output) { - can.ui[cmd].innerHTML = value - }, - river: function(event, can, value, cmd, output) {if (value == "update") {return} + + river: function(event, can, value, cmd, field) {if (value == "update") {return} can.Conf("river", value) }, - storm: function(event, can, value, cmd, output) {if (value == "update") {return} + storm: function(event, can, value, cmd, field) {if (value == "update") {return} can.Conf("storm", value) }, - layout: function(event, can, value, cmd, output) {if (value == "update") {return} + layout: function(event, can, value, cmd, field) {if (value == "update") {return} can.Conf("layout", value) }, }) @@ -39,26 +36,19 @@ Volcanos("onaction", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件菜单", list: []}) Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("onexport", {help: "导出数据", list: [], - title: function(event, can, value, cmd, output) { - var args = { - river: can.Conf("river"), - storm: can.Conf("storm"), - layout: can.Conf("layout"), - } - can.page.Select(can, document.body, "fieldset.Action>div.action>input", function(input) { - args[input.name] = input.value + title: function(event, can, value, cmd, field) { + var args = {river: can.Conf("river"), storm: can.Conf("storm"), layout: can.Conf("layout")} + + can.page.Select(can, field, "div.action>input", function(input) { + input.name && input.value && (args[input.name] = input.value) }) can.user.Search(can, args) }, - link: function(event, can, value, cmd, output) { - can.ui[cmd].innerHTML = value - }, - user: function(event, can, value, cmd, output) { + user: function(event, can, value, cmd, field) { if (can.user.confirm("logout?")) { can.user.Cookie(can, "sessid", "") can.user.reload() } - can.ui["user"].innerHTML = value }, }) diff --git a/pane/Login.js b/pane/Login.js index 6293aa71..86e1c803 100644 --- a/pane/Login.js +++ b/pane/Login.js @@ -5,6 +5,19 @@ Volcanos("onimport", {help: "导入数据", list: [], can.onaction.login(event, can, cb, "login", output) } }, + share: function(event, can, value, cmd, target) {var msg = can.Event(event) + var list = []; + switch (value) { + case "storm": list.push("river", msg.Conf("river")); break + case "action": list.push("river", msg.Conf("river")), list.push("storm", msg.Conf("storm")); break + } + can.run(event, ["share", value, msg.Option("name"), msg.Option("text")].concat(list), function(msg) { + var p = "/share/" + msg.Result(); can.user.toast({title: msg.Option("name"), + text: [{text: can.user.Share(can, {path: p}, true)}, {img: p+"/qrcode"}], + width: 300, height: 400, duration: 300000, + }) + }) + }, }) Volcanos("onaction", {help: "组件交互", list: [], check: function(event, can, cb, cmd, target) { @@ -41,7 +54,7 @@ Volcanos("onaction", {help: "组件交互", list: [], break case "sessid": can.user.Cookie(can, "sessid", msg.detail[1]) - can.Hide(), typeof cb == "function" && cb({name: user}) + can.Hide(), typeof cb == "function" && cb({name: msg["user.name"]}) can.user.toast("") return true } @@ -52,8 +65,7 @@ Volcanos("onaction", {help: "组件交互", list: [], can.Show(event, -1, -1) }, socket: function(event, can, value, cmd, output) {can._username = value -// location.protocol.replace("http", "ws")+"//"+location.host+"/space/?"+ - return can._socket = can._socket || can.misc.WSS(can, function(event, msg) { + return can._socket = can._socket || can.misc.WSS(can, "wss://shylinux.com/space/", {node: "active", name: ""}, function(event, msg) { if (msg.Option("_handle")) {return can.user.toast(msg.result.join(""))} if (typeof cmd == "function" && cmd(event, msg)) {return msg.Reply(msg)} diff --git a/pane/Ocean.js b/pane/Ocean.js index e9d92724..0d4272dc 100644 --- a/pane/Ocean.js +++ b/pane/Ocean.js @@ -20,8 +20,8 @@ Volcanos("onimport", {help: "导入数据", list: [], ]}]) can.ui = ui }, - init: function(event, can, msg, key, output) {output.innerHTML = ""; - var table = can.page.Append(can, output, "table"); + init: function(event, can, msg, key, field) {can.output.innerHTML = ""; + var table = can.page.Append(can, can.output, "table"); can.page.Appends(can, table, [{text: ["1. 选择用户节点 ->", "caption"]}]) can.page.AppendTable(can, table, msg, ["username", "usernode"], function(event, value, key, index, tr, td) {tr.className = "hidden"; @@ -33,36 +33,23 @@ Volcanos("onimport", {help: "导入数据", list: [], }}]) }) }, - ocean: function(event, can, value, key, output) { + ocean: function(event, can, value, key, field) { if (value == "create") {can.Show(event); can.run(event, [], function(msg) { - can.onimport.init(event, can, msg, key, output); + can.onimport.init(event, can, msg, key, field); }); } }, }) Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新"], - "关闭": function(event, can, meta, key, output) { + "关闭": function(event, can, meta, key, field) { 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) + "刷新": function(event, can, meta, key, field) { + can.Import(event, "create", "ocean") }, }) +Volcanos("onchoice", {help: "组件菜单", list: ["关闭", "刷新"]}) +Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/River.js b/pane/River.js index b26ef47f..ed6ef258 100644 --- a/pane/River.js +++ b/pane/River.js @@ -1,23 +1,20 @@ Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, conf, output, action, option, field) { - }, - 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") + init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; + can.page.AppendItem(can, can.output, msg.Table(), can.user.Search(can, can.name()), function(event, line, item) { + can.Export(event, line.key, can.name()) }) }, - river: function(event, can, value, key, output) {if (value == "update") { + river: function(event, can, value, cmd, field) {if (value == "update") { can.run(event, [], function(msg) { - can.onimport.init(event, can, msg, key, output) + can.onimport.init(event, can, msg, cmd, field) }) }}, - favor: function(event, can, msg, cmd, output) {var key = msg.detail[0]; - if (msg._hand) {return} - var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onaction ", key), msg._hand = true} - var cb = can.onchoice[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onchoice ", key), msg._hand = true} + favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} + var cmds = msg.detail, key = cmds[0]; + if (key == can.name()) {key = cmds[1], cmds = cmds.slice(1)} - can.page.Select(can, output, "div.item>span", function(item) { - if (item.innerText == msg.detail[0]) { + can.page.Select(can, field, "div.item>span", function(item) { + if (item.innerText == key) { item.click(), msg._hand = true; msg.Echo(can._name, " ", key) } @@ -25,22 +22,58 @@ Volcanos("onimport", {help: "导入数据", list: [], }, }) Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], - "创建": function(event, can, meta, key, output) { + "创建": function(event, can, meta, cmd, field) { can.Export(event, "create", "ocean") }, - "刷新": function(event, can, meta, key, output) { - can.Import(event, "update", "river") - }, -}) -Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新"]}) -Volcanos("ondetail", {help: "组件详情", list: ["共享"], - "共享": function(event, can, line, key, target) { - can.Export(event, "river", "share") - }, -}) -Volcanos("onexport", {help: "导出数据", list: [], - share: function(event, can, line, key, target) { - can.user.toast(can.user.Share(can, {river: line.key}), "共享链接", 10000) + "刷新": function(event, can, meta, cmd, field) { + can.Import(event, "update", can.name()) }, }) +Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新", "宽度"], + "宽度": function(event, can, meta, cmd, field) { + var begin; + function end() { + field.onmousedown = null; + field.onmousemove = null; + field.style.cursor = ""; + begin = null; + } + + field.style.cursor = "e-resize" + field.onmousedown = function(event) {if (begin) {return end()} + begin = {x: event.clientX, width: field.offsetWidth} + } + field.onmousemove = function(event) {if (!begin) {return} + field.dataset.width = field.style.width = begin.width + event.clientX - begin.x + "px"; + can.Export(event, "", "layout"); + } + + can.user.prompt("输入宽度", function(width) { + field.dataset.width = field.style.width = width + "px" + can.Export(event, "", "layout") + end() + }, field.offsetWidth) + }, +}) +Volcanos("ondetail", {help: "组件详情", list: ["共享", "重命名", "删除"], + "共享": function(event, can, line, value, cmd, item) { + var msg = can.Event(event); + msg.Option("name", line.name) + msg.Option("text", line.key) + can.Export(event, can.name(), "share") + }, + "重命名": function(event, can, line, value, cmd, item) { + can.user.prompt("输入新名:", function(name) { + can.run(event, [value, "rename", name], function(msg) { + can.Import(event, "update", can.name()) + }) + }, line.name) + }, + "删除": function(event, can, line, value, cmd, item) { + can.run(event, [value, "remove"], function(msg) { + can.Import(event, "update", can.name()) + }) + }, +}) +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Source.js b/pane/Source.js index 3a0e063a..8a998ab8 100644 --- a/pane/Source.js +++ b/pane/Source.js @@ -1,7 +1,4 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, conf, output, action, option, field) { - }, -}) +Volcanos("onimport", {help: "导入数据", list: []}) Volcanos("onaction", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件菜单", list: []}) Volcanos("ondetail", {help: "组件详情", list: []}) diff --git a/pane/Steam.js b/pane/Steam.js index a36c104e..f5a4e9cc 100644 --- a/pane/Steam.js +++ b/pane/Steam.js @@ -49,7 +49,7 @@ Volcanos("onimport", {help: "导入数据", list: [], var node = msg.name[index]; can.run(event, [can.Conf("river"), msg.user[index], node], function(com) {var list = com.Table() can.page.Appends(can, can.device, [{text: ["2. 选择模块命令 ->", "caption"]}]) - var table = can.page.AppendTable(can, can.device, com, ["key", "index", "name", "help"], function(event, value, key, index, tr, td) { + can.com = list, can.command = can.page.AppendTable(can, can.device, com, ["key", "index", "name", "help"], function(event, value, key, index, tr, td) { var line = list[index]; line.pod = node; var last = can.page.Append(can, can.ui.list, [{ @@ -65,42 +65,49 @@ Volcanos("onimport", {help: "导入数据", list: [], }) }), table.querySelector("td").click() }, - steam: function(event, can, value, key, output) { + steam: function(event, can, value, key, field) { if (value == "create") { can.run(event, [can.Conf("river")], function(msg) { - can.onimport.init(event, can, msg, key, output); + can.onimport.init(event, can, msg, key, field); }); } }, - river: function(event, can, value, key, output) { - if (value == "update") {return} + river: function(event, can, value, key, field) {if (value == "update") {return} can.Conf("river", value) }, - storm: function(event, can, value, key, output) { - if (value == "update") {return} + storm: function(event, can, value, key, field) {if (value == "update") {return} can.Conf("storm", value) }, }) -Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新", {input: "pod"}], - "关闭": function(event, can, meta, key, output) { +Volcanos("onaction", {help: "组件交互", list: ["关闭", "刷新", {input: ["pod"]}, {input: ["cmd", function(event, can) { +}, function(event, can) { + if (event.key == "Enter") { + can.page.Select(can, can.command, "tr", function(tr, index) { + if (index == 0) {return} + if (!can.page.ClassList.has(can, tr, "hidden")) { + tr.firstChild.click() + event.target.value = "" + } + }) + return + } + can.page.Select(can, can.command, "tr", function(tr, index) { + if (index == 0) {return} + if (can.com[index-1].index.indexOf(event.target.value) > -1) { + can.page.ClassList.del(can, tr, "hidden") + } else { + can.page.ClassList.add(can, tr, "hidden") + } + }) +}]}], + "关闭": function(event, can, meta, key, field) { can.Hide() }, - "刷新": function(event, can, meta, key, output) { - can.run(event, [], function(msg) { - can.onimport.init(event, can, msg, key, output) - }) + "刷新": function(event, can, meta, key, field) { + can.Import(event, "create", "steam") }, }) Volcanos("onchoice", {help: "组件菜单", list: ["关闭", "刷新"]}) -Volcanos("ondetail", {help: "组件详情", list: ["创建", "删除", "共享"], - "创建": function(event, can, msg, value, key, index, td) { - can.run(event, [can.Conf("river"), "spawn", msg.key[index]], function(msg) { - can.Hide(), can.Export(event, "update", "storm"); - }) - }, - "共享": function(event, can, msg, value, key, index, td) { - can.user.toast(can.user.Share(can, {storm: line.key}), "共享链接", 10000) - }, -}) +Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/pane/Storm.js b/pane/Storm.js index 78da321b..cfe48d4f 100644 --- a/pane/Storm.js +++ b/pane/Storm.js @@ -1,88 +1,86 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(event, can, msg, cmd, 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") + init: function(event, can, msg, cmd, field) {can.output.innerHTML = ""; + can.page.AppendItem(can, can.output, msg.Table(), can.user.Search(can, can.name()), function(event, line, item) { + can.Export(event, line.key, can.name()) }) }, - layout: function(event, can, value, cmd, output) { - can.Conf("layout", value) - }, - river: function(event, can, value, cmd, output) { - if (value == "update") {return} + river: function(event, can, value, cmd, field) {if (value == "update") {return} can.run(event, [can.Conf("river", value)], function(msg) { - can.onimport.init(event, can, msg, cmd, output) + can.onimport.init(event, can, msg, cmd, field) }) }, - storm: function(event, can, value, cmd, output) { + storm: function(event, can, value, cmd, field) { if (value == "update") { can.run(event, [can.Conf("river")], function(msg) { - can.onimport.init(event, can, msg, cmd, output) + can.onimport.init(event, can, msg, cmd, field) }) } else { - can.Conf("storm", value) + can.Conf(can.name(), value) } }, - favor: function(event, can, msg, cmd, output) {var key = msg.detail[0]; - if (msg._hand) {return} - var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onaction ", key), msg._hand = true} - var cb = can.onchoice[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onchoice ", key), msg._hand = true} + favor: function(event, can, msg, cmd, field) {if (msg._hand) {return} + var cmds = msg.detail, key = cmds[0]; + if (key == "river") {key = cmds[1], cmds = cmds.slice(1)} - - can.page.Select(can, output, "div.item.k"+msg.detail[0], function(item) { - item.click(), msg._hand = true; - msg.Echo(can._name, " ", key) + can.page.Select(can, field, "div.item>span", function(item) { + if (item.innerText == key) { + item.click(), msg._hand = true; + msg.Echo(can._name, " ", key) + } }) }, }) -Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新", "共享"], - "创建": function(event, can, meta, cmd, output) { +Volcanos("onaction", {help: "组件交互", list: ["创建", "刷新"], + "创建": function(event, can, meta, cmd, field) { can.Export(event, "create", "steam") }, - "刷新": function(event, can, meta, cmd, output) { - can.run(event, [can.Conf("river")], function(msg) { - can.onimport.init(event, can, msg, cmd, output) - }) - }, - "共享": function(event, can, meta, cmd, output) { - can.ondetail[cmd](event, can, meta, "", cmd, output) + "刷新": function(event, can, meta, cmd, field) { + can.Import(event, "update", can.name()) }, }) -Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新"], - "创建": function(event, can, msg, cmd, output) { - can.Export(event, "create", "steam") - }, - "刷新": function(event, can, msg, cmd, output) { - can.run(event, [can.Conf("river")], function(msg) { - can.onimport.init(event, can, msg, cmd, output) - }) +Volcanos("onchoice", {help: "组件菜单", list: ["创建", "刷新", "宽度"], + "宽度": function(event, can, meta, cmd, field) { + var begin; + function end() { + field.onmousedown = null; + field.onmousemove = null; + field.style.cursor = ""; + begin = null; + } + + field.style.cursor = "w-resize" + field.onmousedown = function(event) {if (begin) {return end()} + begin = {x: event.clientX, width: field.offsetWidth} + } + field.onmousemove = function(event) {if (!begin) {return} + field.dataset.width = field.style.width = begin.width - event.clientX + begin.x + "px"; + can.Export(event, "", "layout"); + } + + can.user.prompt("输入宽度", function(width) { + field.dataset.width = field.style.width = width + "px" + can.Export(event, "", "layout") + end() + }, field.offsetWidth) }, }) -Volcanos("ondetail", {help: "组件详情", list: ["共享", "保存", "恢复", "重命名", "删除"], +Volcanos("ondetail", {help: "组件详情", list: ["共享", "重命名", "删除"], "共享": function(event, can, line, value, cmd, item) {can.share || (can.share = {}); - var p = can.user.Share(can, {layout: can.Conf("layout"), river: can.Conf("river"), storm: can.Conf("storm")}, true) - if (can.share[p]) { - can.user.toast({duration: 10000, height: 300, text: p, list: [{img: [can.user.Share(can, {path: "/share/"+can.share[p]}, true)]}]}); - } else { - can.run(event, [can.Conf("river"), can.Conf("storm"), "share", "qrcode", can.Conf("storm"), p], function(msg) { - can.share[p] = msg.Result(); - can.user.toast({duration: 10000, height: 300, text: p, list: [{img: [can.user.Share(can, {path: "/share/"+msg.Result()}, true)]}]}); - }) - } + var msg = can.Event(event); + msg.Option("name", line.name) + msg.Option("text", line.key) + can.Export(event, can.name(), "share") }, "重命名": function(event, can, line, value, cmd, item) { can.user.prompt("输入新名:", function(name) { can.run(event, [can.Conf("river"), value, "rename", name], function(msg) { - can.run(event, [can.Conf("river")], function(msg) { - can.onimport.init(event, can, msg, cmd, can.output) - }) + can.Import(event, "update", can.name()) }) - }) + }, line.name) }, "删除": function(event, can, line, value, cmd, item) { can.run(event, [can.Conf("river"), value, "remove"], function(msg) { - can.run(event, [can.Conf("river")], function(msg) { - can.onimport.init(event, can, msg, cmd, can.output) - }) + can.Import(event, "update", can.name()) }) }, }) diff --git a/pane/Target.js b/pane/Target.js index 3a0e063a..8a998ab8 100644 --- a/pane/Target.js +++ b/pane/Target.js @@ -1,7 +1,4 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, conf, output, action, option, field) { - }, -}) +Volcanos("onimport", {help: "导入数据", list: []}) Volcanos("onaction", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件菜单", list: []}) Volcanos("ondetail", {help: "组件详情", list: []}) diff --git a/pane/Toast.js b/pane/Toast.js index 661af1d8..ebb5fd96 100644 --- a/pane/Toast.js +++ b/pane/Toast.js @@ -5,12 +5,12 @@ Volcanos("onimport", {help: "导入数据", list: [], can.target.style.width = "" var timer; - can.user.toast = function(text, title, duration, list) {if (!text) {return can.Hide()} - text = typeof text == "object"? text: {list: list, text: text, title: title||""} + can.user.toast = function(text, title, duration, action) {if (!text) {return can.Hide()} + text = typeof text == "object"? text: {list: action, text: text, title: title||""} text.duration = text.duration || conf.duration || 3000 var list = [{text: [text.title||"", "div", "title"]}, - {text: [text.text||"", "div", "content"]}, + typeof text.text == "string"? {text: [text.text||"", "div", "content"]}: {view: "content", list: text.text}, {view: ["form"], list: text.list||[{type: "button", inner: "ok", click: function() { timer.stop = true }}]}, diff --git a/pane/Tutor.js b/pane/Tutor.js index 7ad41d92..15b1d58c 100644 --- a/pane/Tutor.js +++ b/pane/Tutor.js @@ -1,7 +1,4 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, conf, output, action, option, field) { - }, -}) +Volcanos("onimport", {help: "导入数据", list: []}) Volcanos("onaction", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件菜单", list: []}) Volcanos("ondetail", {help: "组件详情", list: []}) diff --git a/plugin/input.js b/plugin/input.js index 991fe8f2..fff55733 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,6 +1,4 @@ Volcanos("onimport", {help: "导入数据", list: [], - _begin: function(can) {}, - _start: function(can) {}, init: shy("添加控件", function(can, item, name, value, option) { var input = {type: "input", name: name, data: item}; item.type = item.type || item._type || item._input; @@ -27,14 +25,15 @@ Volcanos("onimport", {help: "导入数据", list: [], case "button": item.value = item.value || item.name; } + can.page.ClassList.add(can, item, item.view); can.core.List((item.clist||"").split(" "), function(value) { can.page.ClassList.add(can, item, value); }) var target = can.Dream(option, "input", input)[input.name]; + !target.placeholder && (target.placeholder = item.name || ""); - // (item.type == "text" || item.type == "textarea") && !target.placeholder && (target.placeholder = item.name || ""); item.type == "text" && !target.title && (target.title = item.placeholder || item.name || ""); item.type == "button" && item.action == "auto" && can.run && can.run({}); item.type == "textarea" && can.page.Append(can, option, [{type: "br"}]) @@ -45,153 +44,7 @@ Volcanos("onimport", {help: "导入数据", list: [], return target.value + (target.value == "" || target.value.endsWith("/")? "": "/") + value }, }) -Volcanos("onfigure", {help: "控件详情", list: [], - key: {click: function(event, can, value, cmd, target) { - function add(msg, list, update) { - can.page.Append(can, can.figure.output, [{view: "list", list: can.core.List(list, function(item) { - return {text: [item, "div", "label"], onclick: function(event) { - target.value = item; - update && can.history.unshift(item); - msg.Option("_refresh") && run() - }} - })}]) - } - function run() {can.figure.output.innerHTML = "" - can.Run(event, ["action", "input", can.item.name, target.value], function(msg) { - add(msg, can.history), can.core.List(msg.append, function(key) {add(msg, msg[key], true)}) - }, true) - } - - can.history = can.history || []; - can.onfigure._prepare(event, can, value, cmd ,target) && run() - }}, - date: {click: function(event, can, value, cmd, target) {if (can.date) {return} - target.style.width = "120px" - function set(now) { - target.value = can.base.Time(now); - if (can.item.action == "auto") { - can.run({}); - } - } - - can.stick = false - can.now = target.value? new Date(target.value): new Date(); - can.date = can.page.Append(can, document.body, [{view: ["date input", "fieldset"], style: { - position: "absolute", left: event.clientX+"px", top: event.clientY+10+"px", - }, onmouseleave: function(event) { - if (can.stick) {can.stick = false; return} - can.page.Remove(can, can.date); delete(can.date); - }}]).last - - var action = can.page.Append(can, can.date, [{view: ["action"]}]).last - var control = can.page.AppendAction(can, action, ["今天", "随机", - ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), {view: ["", "br"]}, - "上一月", ["year"].concat(can.core.List(can.now.getFullYear() - 20, can.now.getFullYear() + 20)), - ["month"].concat(can.core.List(1, 13)), "下一月", {view: ["", "br"]}, - ], function(event, value, cmd) {can.stick = true; - switch (cmd) { - case "year": can.now.setFullYear(parseInt(value)); show(can.now); return; - case "month": can.now.setMonth(parseInt(value)-1); show(can.now); return; - case "hour": can.now.setHours(parseInt(value)); show(can.now); set(can.now); return; - case "minute": can.now.setMinutes(parseInt(value)); show(can.now); set(can.now); return; - case "second": can.now.setSeconds(parseInt(value)); show(can.now); set(can.now); return; - } - - switch (value) { - case "今天": can.now = new Date(); show(can.now); set(can.now); break; - case "随机": can.now.setDate((Math.random() * 100 - 50) + can.now.getDate()); show(can.now); set(can.now); break; - case "关闭":can.page.Remove(can, can.date); delete(can.date); - case "前一年": can.now.setFullYear(can.now.getFullYear()-1); show(can.now); break; - case "后一年": can.now.setFullYear(can.now.getFullYear()+1); show(can.now); break; - case "上一月": can.now.setMonth(can.now.getMonth()-1); show(can.now); break; - case "下一月": can.now.setMonth(can.now.getMonth()+1); show(can.now); break; - } - }) - - var table = can.page.Append(can, can.date, [{type: "table"}]).table - function click(event) { - var day = new Date(parseInt(event.target.dataset.date)) - can.now = day; - set(can.now); - } - function show(now) { - control.month.value = now.getMonth()+1; - control.year.value = now.getFullYear(); - control.hour.value = now.getHours(); - control.minute.value = parseInt(now.getMinutes()/5)*5; - control.second.value = parseInt(now.getSeconds()/5)*5; - var meta = ["日", "一", "二", "三", "四", "五", "六"] - can.page.Appends(can, table, [{type: "tr", list: can.core.List(meta, function(day) {return {text: [day, "th"]}})}]) - - var one = new Date(now); one.setDate(1); - var end = new Date(now); end.setMonth(now.getMonth()+1); end.setDate(1); - var head = new Date(one); head.setDate(one.getDate()-one.getDay()); - var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay()); - - var tr; - function add(day, type) { - if (day.getDay() == 0) {tr = can.page.Append(can, table, [{type: "tr"}]).tr} - can.page.Append(can, tr, [{className: can.base.Time(day).split(" ")[0] == can.base.Time(now).split(" ")[0]? "now": type, - text: [day.getDate(), "td"], dataset: {date: day.getTime()}, click: click, - }]) - } - for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) {add(day, "last")} - for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) {add(day, "main")} - for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) {add(day, "next")} - } - - show(can.now); - set(can.now); - }}, - province: {click: function(event, can, value, cmd, target) { - if (can.figure) {return} - can.figure = can.page.Append(can, document.body, [{view: ["date input", "fieldset"], style: { - position: "absolute", left: "20px", top: event.clientY+10+"px", - }, onmouseleave: function(event) { - can.page.Remove(can, can.figure); delete(can.figure); - }}]).last - - can.page.Append(can, can.figure, [{include: ["/plugin/github.com/shylinux/echarts/echarts.js", function(event) { - can.page.Append(can, can.figure, [{include: ["/plugin/github.com/shylinux/echarts/china.js", function(event) { - var china_chart = echarts.init(can.page.Append(can, can.figure, [{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; - }); - }]}]); - }]}]); - }, - }, - upload: {click: function(event, can, value, cmd, target) { - if (!can.onfigure._prepare(event, can, value, cmd, target)) {return} - can.figure.stick = true - var action = can.page.AppendAction(can, can.figure.action, [{type: "input", data: {name: "upload", type: "file"}}, "上传", "关闭"], function(event, value, cmd) { - switch (value) { - case "关闭": can.onfigure._release(event, can, value, cmd, target); return - } - - var msg = can.Event(event); - msg.upload = action.upload.files[0] - can.run(event, ["action", "上传"], true, function(msg) { - can.user.toast("上传成功") - }) - }) - }}, - _prepare: function(event, can, value, cmd, target) {if (can.figure) {return} - can.figure = can.page.Append(can, document.body, [{view: ["input "+cmd, "fieldset"], style: { - position: "absolute", left: "20px", top: event.clientY+10+"px", - }, list: [{text: [cmd, "legend"]}, {view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) { - !can.figure.stick && can.onfigure._release(event, can, value, cmd, target) - }}]) - return can.figure - }, - _release: function(event, can, value, cmd, target) { - can.page.Remove(can, can.figure.first); delete(can.figure); - }, -}) +Volcanos("onfigure", {help: "控件交互", list: []}) Volcanos("onaction", {help: "控件交互", list: [], onclick: function(event, can) {can.Select(event); var figure = can.onfigure[can.item.cb] || can.onfigure[can.item.figure] diff --git a/plugin/input/date.js b/plugin/input/date.js new file mode 100644 index 00000000..08bd15b9 --- /dev/null +++ b/plugin/input/date.js @@ -0,0 +1,91 @@ +Volcanos("onfigure", {help: "控件详情", list: [], + date: {click: function(event, can, value, cmd, target) {if (can.date) {return} + target.style.width = "120px" + function set(now) { + target.value = can.base.Time(now); + if (can.item.action == "auto") { + can.run({}); + } + } + + can.stick = false + can.now = target.value? new Date(target.value): new Date(); + can.date = can.page.Append(can, document.body, [{view: ["date input", "fieldset"], style: { + position: "absolute", left: event.clientX+"px", top: event.clientY+10+"px", + }, onmouseleave: function(event) { + if (can.stick) {can.stick = false; return} + can.page.Remove(can, can.date); delete(can.date); + }}]).last + + var action = can.page.Append(can, can.date, [{view: ["action"]}]).last + var control = can.page.AppendAction(can, action, ["今天", "随机", + ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), {view: ["", "br"]}, + "上一月", ["year"].concat(can.core.List(can.now.getFullYear() - 20, can.now.getFullYear() + 20)), + ["month"].concat(can.core.List(1, 13)), "下一月", {view: ["", "br"]}, + ], function(event, value, cmd) {can.stick = true; + switch (cmd) { + case "year": can.now.setFullYear(parseInt(value)); show(can.now); return; + case "month": can.now.setMonth(parseInt(value)-1); show(can.now); return; + case "hour": can.now.setHours(parseInt(value)); show(can.now); set(can.now); return; + case "minute": can.now.setMinutes(parseInt(value)); show(can.now); set(can.now); return; + case "second": can.now.setSeconds(parseInt(value)); show(can.now); set(can.now); return; + } + + switch (value) { + case "今天": can.now = new Date(); show(can.now); set(can.now); break; + case "随机": can.now.setDate((Math.random() * 100 - 50) + can.now.getDate()); show(can.now); set(can.now); break; + case "关闭":can.page.Remove(can, can.date); delete(can.date); + case "前一年": can.now.setFullYear(can.now.getFullYear()-1); show(can.now); break; + case "后一年": can.now.setFullYear(can.now.getFullYear()+1); show(can.now); break; + case "上一月": can.now.setMonth(can.now.getMonth()-1); show(can.now); break; + case "下一月": can.now.setMonth(can.now.getMonth()+1); show(can.now); break; + } + }) + + var table = can.page.Append(can, can.date, [{type: "table"}]).table + function click(event) { + var day = new Date(parseInt(event.target.dataset.date)) + can.now = day; + set(can.now); + } + function show(now) { + control.month.value = now.getMonth()+1; + control.year.value = now.getFullYear(); + control.hour.value = now.getHours(); + control.minute.value = parseInt(now.getMinutes()/5)*5; + control.second.value = parseInt(now.getSeconds()/5)*5; + var meta = ["日", "一", "二", "三", "四", "五", "六"] + can.page.Appends(can, table, [{type: "tr", list: can.core.List(meta, function(day) {return {text: [day, "th"]}})}]) + + var one = new Date(now); one.setDate(1); + var end = new Date(now); end.setMonth(now.getMonth()+1); end.setDate(1); + var head = new Date(one); head.setDate(one.getDate()-one.getDay()); + var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay()); + + var tr; + function add(day, type) { + if (day.getDay() == 0) {tr = can.page.Append(can, table, [{type: "tr"}]).tr} + can.page.Append(can, tr, [{className: can.base.Time(day).split(" ")[0] == can.base.Time(now).split(" ")[0]? "now": type, + text: [day.getDate(), "td"], dataset: {date: day.getTime()}, click: click, + }]) + } + for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) {add(day, "last")} + for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) {add(day, "main")} + for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) {add(day, "next")} + } + + show(can.now); + set(can.now); + }}, + _prepare: function(event, can, value, cmd, target) {if (can.figure) {return} + can.figure = can.page.Append(can, document.body, [{view: ["input "+cmd, "fieldset"], style: { + position: "absolute", left: "20px", top: event.clientY+10+"px", + }, list: [{text: [cmd, "legend"]}, {view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) { + !can.figure.stick && can.onfigure._release(event, can, value, cmd, target) + }}]) + return can.figure + }, + _release: function(event, can, value, cmd, target) { + can.page.Remove(can, can.figure.first); delete(can.figure); + }, +}) diff --git a/plugin/input/key.js b/plugin/input/key.js new file mode 100644 index 00000000..835a0b28 --- /dev/null +++ b/plugin/input/key.js @@ -0,0 +1,32 @@ +Volcanos("onfigure", {help: "控件详情", list: [], + key: {click: function(event, can, value, cmd, target) { + function add(msg, list, update) { + can.page.Append(can, can.figure.output, [{view: "list", list: can.core.List(list, function(item) { + return {text: [item, "div", "label"], onclick: function(event) { + target.value = item; + update && can.history.unshift(item); + msg.Option("_refresh") && run() + }} + })}]) + } + function run() {can.figure.output.innerHTML = "" + can.Run(event, ["action", "input", can.item.name, target.value], function(msg) { + add(msg, can.history), can.core.List(msg.append, function(key) {add(msg, msg[key], true)}) + }, true) + } + + can.history = can.history || []; + can.onfigure._prepare(event, can, value, cmd ,target) && run() + }}, + _prepare: function(event, can, value, cmd, target) {if (can.figure) {return} + can.figure = can.page.Append(can, document.body, [{view: ["input "+cmd, "fieldset"], style: { + position: "absolute", left: "20px", top: event.clientY+10+"px", + }, list: [{text: [cmd, "legend"]}, {view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) { + !can.figure.stick && can.onfigure._release(event, can, value, cmd, target) + }}]) + return can.figure + }, + _release: function(event, can, value, cmd, target) { + can.page.Remove(can, can.figure.first); delete(can.figure); + }, +}) diff --git a/plugin/input/province.js b/plugin/input/province.js new file mode 100644 index 00000000..3bae60cd --- /dev/null +++ b/plugin/input/province.js @@ -0,0 +1,34 @@ +Volcanos("onfigure", {help: "控件详情", list: [], + province: {click: function(event, can, value, cmd, target) { + if (can.figure) {return} + can.figure = can.page.Append(can, document.body, [{view: ["date input", "fieldset"], style: { + position: "absolute", left: "20px", top: event.clientY+10+"px", + }, onmouseleave: function(event) { + can.page.Remove(can, can.figure); delete(can.figure); + }}]).last + + can.page.Append(can, can.figure, [{include: ["/plugin/github.com/shylinux/echarts/echarts.js", function(event) { + can.page.Append(can, can.figure, [{include: ["/plugin/github.com/shylinux/echarts/china.js", function(event) { + var china_chart = echarts.init(can.page.Append(can, can.figure, [{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; + }); + }]}]); + }]}]); + }}, + _prepare: function(event, can, value, cmd, target) {if (can.figure) {return} + can.figure = can.page.Append(can, document.body, [{view: ["input "+cmd, "fieldset"], style: { + position: "absolute", left: "20px", top: event.clientY+10+"px", + }, list: [{text: [cmd, "legend"]}, {view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) { + !can.figure.stick && can.onfigure._release(event, can, value, cmd, target) + }}]) + return can.figure + }, + _release: function(event, can, value, cmd, target) { + can.page.Remove(can, can.figure.first); delete(can.figure); + }, +}) diff --git a/plugin/input/upload.js b/plugin/input/upload.js new file mode 100644 index 00000000..a1eed6c3 --- /dev/null +++ b/plugin/input/upload.js @@ -0,0 +1,28 @@ +Volcanos("onfigure", {help: "控件详情", list: [], + upload: {click: function(event, can, value, cmd, target) { + if (!can.onfigure._prepare(event, can, value, cmd, target)) {return} + can.figure.stick = true + var action = can.page.AppendAction(can, can.figure.action, [{type: "input", data: {name: "upload", type: "file"}}, "上传", "关闭"], function(event, value, cmd) { + switch (value) { + case "关闭": can.onfigure._release(event, can, value, cmd, target); return + } + + var msg = can.Event(event); + msg.upload = action.upload.files[0] + can.run(event, ["action", "上传"], true, function(msg) { + can.user.toast("上传成功") + }) + }) + }}, + _prepare: function(event, can, value, cmd, target) {if (can.figure) {return} + can.figure = can.page.Append(can, document.body, [{view: ["input "+cmd, "fieldset"], style: { + position: "absolute", left: "20px", top: event.clientY+10+"px", + }, list: [{text: [cmd, "legend"]}, {view: ["action"]}, {view: ["output"]}], onmouseleave: function(event) { + !can.figure.stick && can.onfigure._release(event, can, value, cmd, target) + }}]) + return can.figure + }, + _release: function(event, can, value, cmd, target) { + can.page.Remove(can, can.figure.first); delete(can.figure); + }, +}) diff --git a/plugin/state.js b/plugin/state.js index ec3cfb00..f909207a 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -1,18 +1,26 @@ -Volcanos("onimport", {help: "导入数据", list: [], - favor: function(event, can, msg, cmd, output) {var key = msg.detail[0]; - var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onaction ", key), msg._hand = true} - var cb = can.onchoice[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onchoice ", key), msg._hand = true} - - var sub = can[key]; if (sub && sub.target) {sub.target.focus; return msg.Echo(can._name, " ", sub._name, " ", key), msg._hand = true} - can._output && can._output.Import(event, msg, cmd) - }, -}) +Volcanos("onimport", {help: "导入数据", list: []}) Volcanos("onaction", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件菜单", list: ["执行", "返回", "共享", "重命名", "选项", "加参", "减参", "克隆", "删除"], "执行": function(event, can, msg, cmd, field) {can.Runs(event)}, "返回": function(event, can, msg, cmd, field) {can.Last(event)}, - "共享": function(event, can, msg, cmd, field) {can.Share(event)}, - "重命名": function(event, can, msg, cmd, field) {can.Rename(event)}, + "共享": function(event, can, msg, cmd, field) { + can.user.input(event, can, ["name", "text"], function(event, cmd, meta, list) { + var msg = can.Event(event); + msg.Option("name", meta.name) + msg.Option("text", meta.text) + can.Conf("args", JSON.stringify(can.Option())) + can.core.List(["node", "group", "index", "args"], function(key) { + msg.Option(key, can.Conf(key)) + }) + can.Export(event, "action", "share") + return true + }) + }, + "重命名": function(event, can, msg, cmd, field) {var meta = field.Meta; + meta.help = can.user.prompt("", function(help) { + meta.help = help + }, meta.help) + }, "选项": function(event, can, msg, cmd, field) { can.user.input(event, can, ["name", "value"], function(event, cmd, meta, list) { var data = {type: "text", value: meta.value||""} @@ -28,14 +36,6 @@ Volcanos("onchoice", {help: "组件菜单", list: ["执行", "返回", "共享", "克隆": function(event, can, msg, cmd, field) {can.Clone(event)}, "删除": function(event, can, msg, cmd, field) {can.Delete(event)}, }) -Volcanos("ondetail", {help: "组件详情", list: ["copy", "复制", "下载"]}) -Volcanos("onexport", {help: "导出数据", list: ["复制", "下载"], - you_status: function(event, can, msg, value, key, index) { - var cmd = [can.option.pod.value, msg.you[index]] - value == "start" && cmd.push("stop") - var timer = can.user.toast(cmd.join(" ")+"...", msg.you[index], 5000) - can.Run(event, cmd, function(msg) { - }) - } -}) +Volcanos("ondetail", {help: "组件详情", list: []}) +Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/table.js b/plugin/table.js index b4c7f13c..13e37229 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -18,11 +18,11 @@ Volcanos("onimport", {help: "导入数据", list: [], case "TD": can.onimport.which(event, table, msg.append, function(index, key) { can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd]; - var id = msg.Ids(index); var sub = can.Event(event); msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())}) + typeof cb == "function"? cb(event, can, msg, index, key, cmd, target): - can.run(event, ["action", typeof cb == "string"? cb: cmd, key, target.innerHTML, id], function(msg) { + can.run(event, ["action", typeof cb == "string"? cb: cmd, key, target.innerHTML.trim(), msg.Ids(index)], function(msg) { can.user.toast(msg.Result()) // can.onimport.init(can, msg, cb, output, option) }, true) @@ -47,14 +47,8 @@ Volcanos("onimport", {help: "导入数据", list: [], }) }) }, - - favor: function(event, can, msg, cmd, output) {var key = msg.detail[0]; - var cb = can.onaction[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onaction ", key), msg._hand = true} - var cb = can.onchoice[key]; if (typeof cb == "function") {cb(event, can, msg, cmd, output); return msg.Echo(can._name, " onchoice ", key), msg._hand = true} - }, -}) -Volcanos("onaction", {help: "组件交互", list: [], }) +Volcanos("onaction", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件菜单", list: ["返回", "清空", "复制", "下载"], "返回": function(event, can, msg, cmd, target) { can.run(event, ["", "Last"]) @@ -79,7 +73,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["选择", "编辑", "删除", var input = can.page.Appends(can, td, [{type: "input", value: text, style: {width: td.clientWidth+"px"}, data: {onkeydown: function(event) { if (event.key != "Enter") {return} if (key == "value" && msg.key) {key = msg.key[index]} - can.run(event, ["action", "modify", key, event.target.value, text, msg.Ids(index)], function(msg) { + can.run(event, ["action", "modify", key, event.target.value, text, can.Option("id")||msg.Ids(index)], function(msg) { td.innerHTML = event.target.value; can.user.toast("修改成功") }, true) diff --git a/plugin/team/miss.js b/plugin/team/miss.js deleted file mode 100644 index 43dd53da..00000000 --- a/plugin/team/miss.js +++ /dev/null @@ -1,34 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], - init: function(can, msg, cb, output, option) {output.innerHTML = ""; - if (!msg.append || msg.append.length == 0) { - var code = can.page.Append(can, output, [{view: ["code", "div", msg.Result()]}]).code; - return typeof cb == "function" && cb(msg), code; - } - - var table = can.page.AppendTable(can, output, msg, msg.append); - table.oncontextmenu = function(event) {var target = event.target; var data = target.dataset; - switch (event.target.tagName) { - case "SPAN": - can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) { - var id = data.id; - can.run(event, [id, cmd], function(msg) { - can.onimport.init(can, msg, cb, output, option) - can.user.toast(cmd+"成功"); - }, true) - })) - event.stopPropagation() - event.preventDefault() - break - case "TH": - case "TR": - case "TABLE": - } - } - return typeof cb == "function" && cb(msg), table; - }, -}) -Volcanos("onaction", {help: "组件交互", list: []}) -Volcanos("onchoice", {help: "组件菜单", list: []}) -Volcanos("ondetail", {help: "组件详情", list: []}) -Volcanos("onexport", {help: "导出数据", list: []}) - diff --git a/plugin/team/plan.js b/plugin/team/plan.js index fe42ab7f..20690674 100644 --- a/plugin/team/plan.js +++ b/plugin/team/plan.js @@ -2,6 +2,7 @@ Volcanos("onimport", {help: "导入数据", list: [], init: function(can, msg, cb, output, action, option) {output.innerHTML = ""; var table = can.page.AppendTable(can, output, msg, msg.append); table.onclick = function(event) {switch (event.target.tagName) { + case "SPAN": case "TD": var input = can.user.input(event, can, ["zone", "type", "name", "text"], function(event, value, data) { switch (value) { @@ -46,6 +47,7 @@ Volcanos("onimport", {help: "导入数据", list: [], } can.page.Select(can, table, "div.task", function(item) { + // 拖动排期 item.setAttribute("draggable", true) item.ondragstart = function(event) {can.drag = event.target} item.ondragover = function(event) {event.preventDefault()} @@ -75,6 +77,11 @@ Volcanos("onimport", {help: "导入数据", list: [], begin_time.setMonth(parseInt(tr.list[0].innerText)-1); break case "month": + can.page.Select(can, item, "span", function(item) {var data = item.dataset + begin_time.setYear(parseInt(data.year)) + begin_time.setMonth(parseInt(data.month)-1) + begin_time.setDate(parseInt(data.day)) + }) break case "week": begin_time.setDate(begin_time.getDate() - (begin_time.getDay() - index + 1)) diff --git a/plugin/china.js b/plugin/wiki/china.js similarity index 100% rename from plugin/china.js rename to plugin/wiki/china.js diff --git a/plugin/template.js b/plugin/wiki/image.js similarity index 61% rename from plugin/template.js rename to plugin/wiki/image.js index 64581aec..ec0f88e8 100644 --- a/plugin/template.js +++ b/plugin/wiki/image.js @@ -1,5 +1,6 @@ Volcanos("onimport", {help: "导入数据", list: [], - init: function(can, msg, cb, output, action, option) {output.innerHTML = ""; + init: function(can, msg, cb, output, action, option) { + can.page.Appends(can, output, [{img: [window.URL.createObjectURL(new Blob(msg.result, {type: "image/png"}))]}]) }, }) Volcanos("onaction", {help: "组件交互", list: []}) @@ -8,3 +9,4 @@ Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/plugin/inner.js b/plugin/wiki/inner.js similarity index 100% rename from plugin/inner.js rename to plugin/wiki/inner.js diff --git a/plugin/media.js b/plugin/wiki/media.js similarity index 100% rename from plugin/media.js rename to plugin/wiki/media.js diff --git a/proto.js b/proto.js index f92643b4..fe465cf0 100644 --- a/proto.js +++ b/proto.js @@ -24,6 +24,7 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 if (meta.cache[name]) {var cache = meta.cache[name]; for (var i = 0; i < cache.length; i++) {var item = cache[i]; if (item._name == can._name) {continue} + // 加载索引 can[item._name] = item; } return can @@ -32,6 +33,7 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 meta.cache[name] = [] for (var i = meta.index; i < list.length; i++) {var item = list[i]; if (item._name == can._name || item._type == "local"|| item._type == "input" || item._type == "output") {continue} + // 加载缓存 can[item._name] = item; meta.cache[name].push(item); } @@ -69,10 +71,11 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 } // 加载脚本 - can.Dream(document.body, libs[0].indexOf(".") == -1? libs[0]+".js": libs[0], function() { + can.Dream(document.body, !libs[0].endsWith("/") && libs[0].indexOf(".") == -1? libs[0]+".js": libs[0], function() { can._load(libs[0]), can.require(libs.slice(1), cb); }) }, + name: function() {return can._name.toLowerCase()}, ID: shy("生成器", function() {return id++}), Log: shy("日志器", function() {console.log(arguments)}), @@ -101,16 +104,20 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 // [1,2,3,4] // {value, length} var timer = {stop: false}; - function loop(i) {if (timer.stop || i >= interval.length && interval.length >= 0) {return typeof cbs == "function" && cbs(interval)} - return typeof cb == "function" && cb(interval.value||interval[i], i, interval)? - typeof cbs == "function" && cbs(interval): setTimeout(function() {loop(i+1)}, interval.value||interval[i+1]); + function loop(event, i) {if (timer.stop || i >= interval.length && interval.length >= 0) {return typeof cbs == "function" && cbs(event, interval)} + return typeof cb == "function" && cb(event, interval.value||interval[i], i, interval)? + typeof cbs == "function" && cbs(event, interval): + setTimeout(function() {loop(event, i+1)}, interval.value||interval[i+1]); } - setTimeout(function() {loop(0)}, interval.value||interval[0]); + setTimeout(function(event) {loop(event, 0)}, interval.value||interval[0]); return timer; }), Event: shy("触发器", function(event, msg, proto) {event = event || {}; - msg = event.msg = msg || event.msg || {}, msg.__proto__ = proto || { - _create_time: can.base.Time(), _source: can, + if (!msg && event.msg) {return event.msg} + + event.msg = msg = msg || {}, msg.__proto__ = proto || { + __proto__: can, _create_time: can.base.Time(), + option: [], Log: shy("输出日志", function() {console.log(arguments)}), Ids: function(index, key) {var id = index; msg && msg.id && (id = msg.id[index]) || msg && msg.name && (id = msg.name[index]); @@ -124,11 +131,6 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 }).length > 0 || msg.option.push(key) msg[key] = can.core.List(arguments).slice(1) }, - Echo: shy("输出响应", function(res) {msg.result = msg.result || [] - msg._hand = true - for (var i = 0; i < arguments.length; i++) {msg.result.push(arguments[i])} - return msg; - }), Push: function(key, value) {msg.append = msg.append || [] if (typeof key == "object") { value? can.core.List(value, function(item) { @@ -148,6 +150,11 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 msg[key] = msg[key] || [] msg[key].push(""+value) }, + Echo: shy("输出响应", function(res) {msg.result = msg.result || [] + msg._hand = true + for (var i = 0; i < arguments.length; i++) {msg.result.push(arguments[i])} + return msg; + }), Copy: function(res) { res.result && (msg.result = res.result) res.append && (msg.append = res.append) && res.append.forEach(function(item) { @@ -182,7 +189,7 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 }; return msg.event = event, msg }), - Dream: shy("构造器", function(target, type, line, key) { + Dream: shy("构造器", function(target, type, line) { if (type.endsWith(".css")) { var style = document.createElement("link"); style.rel = "stylesheet", style.type = "text/css"; @@ -198,6 +205,11 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 target.appendChild(script); return script } + if (type.endsWith("/")) { + typeof line == "function" && line() + return + } + var text = line, list = [], item = false, style = "" switch (type) { case "option": @@ -212,6 +224,7 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 }), Cache: shy("缓存器", function(name, output, data) { if (data) { + // 写缓存 var temp = document.createDocumentFragment() while (output.childNodes.length>0) { var item = output.childNodes[0] @@ -224,6 +237,8 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 var list = cache[name]; if (!list) {return} + + // 读缓存 while (list.node.childNodes.length>0) { var item = list.node.childNodes[0] item.parentNode.removeChild(item) @@ -240,7 +255,6 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 can.onimport && can.onimport._begin && can.onimport._begin(can) typeof cb == "function" && cb(can); if (can.target) { - // 初始化主模块 function run(event, msg, key, cb) { if (typeof cb == "function") { // 本地命令 @@ -250,13 +264,14 @@ function Volcanos(name, can, libs, cb, msg) { // 封装模块 can.run(event, ["action", key], function(msg) {can.Import(event, msg, key)}, true) } } - // 注册event + + // 注册事件 can.core.Item(can.onaction, function(key, cb) {key.indexOf("on") == 0 && (can.target[key] = function(event) {cb(event, can)})}); - // 注册action + // 注册控件 can.action && (can.action.innerHTML = ""), can.onaction && can.page.AppendAction(can, can.action, can.onaction.list, function(event, value, key) { key? run(event, value, key, can.onaction[key]||can.onaction[value]): run(event, msg, value, can.onaction[value]); }) - // 注册choice + // 注册菜单 can.target.oncontextmenu = function(event) {can.user.carte(event, shy("", can.onchoice, can.onchoice.list, function(event, key, meta) { run(event, msg, key, can.onchoice[key] || can.onaction[key]); }), can), event.stopPropagation(), event.preventDefault()} diff --git a/style.css b/style.css index f407a4aa..e5b2fc78 100644 --- a/style.css +++ b/style.css @@ -241,6 +241,9 @@ fieldset table caption { fieldset table tbody { overflow:auto; } +fieldset table tr.hidden { + display:none; +} fieldset table th.order { background-color:red; cursor:pointer;