diff --git a/frame.js b/frame.js index 54284ab0..393f76ac 100644 --- a/frame.js +++ b/frame.js @@ -1,5 +1,5 @@ var _can_name = "/frame.js" -Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, list, cb, target) { +Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, list, cb, target) { can.core.Next(list, function(item, next) { item.type = "panel" can.onappend._init(can, item, item.list, function(panel) { panel.onaction && panel.onappend._action(panel, item.action||panel.onaction.list) @@ -8,10 +8,6 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds || [] return (can.onengine[cmds[0]]||can.onengine[meta.main.engine]||can.onengine.remote)(event, can, msg, panel, cmds, cb) }, can[item.name] = panel, next() - - panel.page.Modify(panel, panel._output, {onmouseover: function(event) { - Volcanos.meta.data.menu && panel.page.Remove(panel, Volcanos.meta.data.menu.first) - }}) }, target) }, function() { var panel = can[meta.main.name], msg = can.request() @@ -23,7 +19,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) { fun && (sub = mod, mod = fun, fun = mod[value], key = value) }); if (!sub || !mod || !fun) { - can.base.Warn("not found", cmds[1]) + can.misc.Warn("not found", cmds[1]) can.base.isFunc(cb) && cb(msg.Echo("warn: ", "not found: ", cmds[1])) return } @@ -37,7 +33,18 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, remote: function(event, can, msg, panel, cmds, cb) { delete(msg._handle), delete(msg._toast) if (panel.onengine.engine(event, can, msg, panel, cmds, cb)) { return } - can.misc.Runs(event, can, {names: panel._name, daemon: can._daemon+"."+msg._daemon}, cmds, cb) + + var key = panel._name+"."+cmds.join(",") + if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear("append") + var res = Volcanos.meta.pack[key]; res? msg.Copy(res): can.user.toast(can, "缺失数据") + return typeof cb == "function" && cb(msg) + } + + can.misc.Run(event, can, {names: (can.Conf("iceberg")||"/chat/")+panel._name, daemon: can._daemon+"."+msg._daemon}, cmds, function(msg) { + Volcanos.meta.pack[key] = msg + can.base.isFunc(cb) && cb(msg) + }) + panel.search(event, ["Footer.onimport.ncmd"]) }, engine: function(event, can, msg, panel, cmds, cb) { return false }, listen: shy("事件回调", {}, [], function(can, name, cb) { @@ -170,7 +177,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, }}, }, }) -Volcanos("ondaemon", {help: "解析引擎", list: [], _init: function(can) { +Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can) { if (can.user.isLocalFile) { return } can.misc.WSS(can, {type: "chrome", name: can.user.Search(can, "daemon")||""}, function(event, msg, cmd, arg) { if (!msg) { return } if (can.base.isFunc(can.ondaemon[cmd])) { @@ -188,8 +195,8 @@ Volcanos("ondaemon", {help: "解析引擎", list: [], _init: function(can) { }, _list: [{}], toast: function(can, msg, arg) { arg[0] = can - can._toast && can._toast.Close() - can._toast = can.core.CallFunc(can.user.toast, arg) + Volcanos.meta.float.toast && can.page.Remove(can, Volcanos.meta.float.toast._target) + Volcanos.meta.float.toast = can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg}) }, grow: function(can, msg, arg) { var sub = can.ondaemon._list[msg.Option("_target")] @@ -199,7 +206,7 @@ Volcanos("ondaemon", {help: "解析引擎", list: [], _init: function(can) { out.onimport._grow(out, arg.join("")) }, pwd: function(can, msg, arg) { - can.base.Log(msg) + can.misc.Log(msg) can._daemon = arg[0] }, }) @@ -324,11 +331,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.core.CallFunc(meta[which], [event, can, which]) can.core.CallFunc(meta[item[0]], [event, can, item[0], which]) - }}: item.input? /*文本*/ {type: "input", name: item.input[0], onkeydown: function(event) { - can.core.CallFunc(item.input[1], [event, can]) - - }}: typeof item == "object" && /*其它*/ item + }}: /*其它*/ item , "", action)}) + return meta }, _output: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); can.page.Select(can, can._output, "div.control .args", function(item) { @@ -472,6 +477,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, break case "button": item.value = item.value||item.name||"查看"; break case "upfile": item.type = "file"; break + case "upload": item.type = "file", input.name = "upload"; break } return can.page.Append(can, target, [{view: ["item "+item.type], list: [input]}])[item.name] @@ -520,31 +526,23 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, figure: function(can, meta, key, target) { - if (!key || key.indexOf("@") != 0) { return } + if (!key || key[0] != "@") { return } var list = can.core.Split(key, "@=", "@=") var pkey = list[0], pval = list[1]||"" - target.type != "button" && target.value && target.value.indexOf("@") == 0 && (target.value = pval||"") - pkey && can.require(["/plugin/input/"+pkey+".js"], function(can) { - can.onfigure && can.core.Item(can.onfigure[pkey], function(key, cb) { if (key.indexOf("on") == 0) { - target[key] = function(event) { can._figure && can.page.Remove(can, can._figure._target) - can.onappend._init(can, {type: "input", name: pkey, pos: "float"}, [], function(sub) { - sub.Conf(meta), sub.run = function(event, cmds, cb) { - var msg = sub.request(event, can.Option()); - (meta.run||can.run)(event, cmds, cb, true) - }, can._figure = sub + target.type != "button" && (target.value = pval||""), can.require(["/plugin/input/"+pkey+".js"], function(can) { + can.core.Item(can.onfigure[pkey], function(key, cb) { if (key.indexOf("on") == 0) { target[key] = function(event) { + can.onappend._init(can, {type: "input", name: pkey, pos: "float"}, [], function(sub) { + sub.run = function(event, cmds, cb) { + var msg = sub.request(event, can.Option()); + (meta.run||can.run)(event, cmds, cb, true) + }, sub.Conf(meta) - meta.style && sub.page.Modify(sub, sub._target, {style: meta.style}) - - var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight - var left = event.clientX, top = event.clientY - if (left+sub._target.offsetWidth>window.innerWidth) { left = window.innerWidth - sub._target.offsetWidth } - can.page.Modify(can, sub._target, {style: {left: left, top: top}}) - - cb(event, sub, meta, target) - }, document.body) - } - } }) + Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target), Volcanos.meta.float.input = sub + meta.style && sub.page.Modify(sub, sub._target, {style: meta.style}) + cb(event, sub, meta, target) + }, document.body) + } } }) }) }, _plugin: function(can, value, meta, cb, target) { @@ -612,20 +610,15 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) { topic: function(can, topic) { topic && (can._topic = topic) can.user.topic(can, can._topic || can.user.Search(can, "topic") || ((can.user.Search(can, "pod")||can.base.isNight())? "black": "white")) }, - figure: function(event, can, target) { var p = target||can._target - var layout = {left: event.clientX, top: event.clientY+10} - can.page.Modify(can, p, {style: layout}) - can.onmotion.move(can, p, layout) + figure: function(event, can, target) { target = target||can._target + if (!event.target) { return } + var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight + if (left+target.offsetWidth>window.innerWidth) { left = window.innerWidth - target.offsetWidth } + if (top+target.offsetHeight>window.innerHeight) { top = window.innerHeight - target.offsetHeight } - var left = p.offsetLeft; if (p.offsetLeft+p.offsetWidth > window.innerWidth) { - left = window.innerWidth - p.offsetWidth - } if (left < 120) { left = 120 } - - var top = p.offsetTop; if (p.offsetTop+p.offsetHeight > window.innerHeight) { - top = window.innerHeight - p.offsetHeight - } if (top < 32) { top = 32 } - - can.page.Modify(can, p, {style: {left: can.user.isMobile? 30: left, top: top+30}}) + var layout = {left: left, top: top} + can.page.Modify(can, target, {style: layout}) + can.onmotion.move(can, target, layout) }, resize: function(can, name, cb) { var list = []; can.onengine.listen(can, name, function(width, height) { @@ -667,155 +660,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) { ]}]) }, }) -Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, target) { - var focus = []; can.onengine.listen(can, "keymap.focus", function(cb) { - cb? focus.push(cb): focus.pop() - }) - can.onkeypop._build(can) - target.onkeydown = function(event) { - if (focus.length > 0) { return focus[focus.length-1](event) } - if (event.target != target) { return } - can.page.Select(can, target, "fieldset.Action>div.output", function(item) { - target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item) - }) - } - }, - _build: function(can) { - can.core.Item(can.onkeypop._mode, function(item, value) { var engine = {} - can.core.Item(value, function(key, cb) { var map = engine - for (var i = key.length-1; i > -1; i--) { - map = map[key[i]] = i == 0? cb: (map[key[i]]||{}) - } - }), can.onkeypop._engine[item] = engine - }) - }, - _parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key) - // can.Status("按键", list.join("")) - for (var pre = 0; pre < list.length; pre++) { - if ("0" <= list[pre] && list[pre] <= "9") { continue } break - }; var count = parseInt(list.slice(0, pre).join(""))||1 - - function repeat(cb, count) { list = [] - for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } - event.stopPropagation(), event.preventDefault() - // can.Status("按键", list.join("")) - } - - var map = can.onkeypop._mode[mode] - var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { - repeat(cb, count); return list - } - var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { - repeat(cb, count); return list - } - - var map = can.onkeypop._engine[mode]; for (var i = list.length-1; i > pre-1; i--) { - var cb = map[list[i]]; switch (typeof cb) { - case "function": repeat(cb, count); return list - case "object": map = cb; continue - case "string": - default: return list - } - } - return list - }, - _mode: { - normal: { - j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) }, - k: function(event, can, target) { target.scrollBy(0, -30) }, - - b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) }, - w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) }, - - s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) }, - t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) }, - - " ": function(event, can, target) { - can.page.Select(can, document.body, "fieldset.panel.Header div.search input", function(target) { - target.focus() - }) - }, - enter: function(event, can, target) { can.base.Log("enter") }, - escape: function(event, can, target) { - can.search(event, ["Search.onaction.hide"]) - can.base.Log("enter") - }, - }, - insert: { - escape: function(event, can, target) { - target.blur() - }, - jk: function(event, can, target) { - can.page.DelText(target, target.selectionStart-1, target.selectionStart) - target.blur() - }, - enter: function(event, can, target) { - var his = target._history || [] - his.push(target.value) - - can.base.Log("input", target, his) - target.setSelectionRange(0, -1) - target._current = his.length - target._history = his - }, - }, - insert_ctrl: { - p: function(event, can, target) { - var his = target._history||[] - var pos = target._current||0 - - pos = --pos % (his.length+1) - if (pos < 0) { pos = his.length} - target.value = his[pos]||"" - can.base.Log(pos, his) - - target._current = pos - }, - n: function(event, can, target) { - var his = target._history||[] - var pos = target._current||0 - - pos = ++pos % (his.length+1) - target.value = his[pos]||"" - can.base.Log(pos, his) - - target._current = pos - }, - - u: function(event, can, target) { - can.page.DelText(target, 0, target.selectionEnd) - }, - k: function(event, can, target) { - can.page.DelText(target, target.selectionStart) - }, - h: function(event, can, target) { - can.page.DelText(target, target.selectionStart-1, target.selectionStart) - }, - d: function(event, can, target) { - can.page.DelText(target, 0, target.selectionStart) - }, - w: function(event, can, target) { - var start = target.selectionStart-2 - var end = target.selectionEnd-1 - for (var i = start; i >= 0; i--) { - if (target.value[end] == " " && target.value[i] != " ") { - break - } - if (target.value[end] != " " && target.value[i] == " ") { - break - } - } - can.page.DelText(target, i+1, end-i) - }, - }, - }, _engine: {}, - - input: function(event, can) { var target = event.target - target._keys = can.onkeypop._parse(event, can, event.ctrlKey? "insert_ctrl": "insert", target._keys||[], target) - if (target._keys.length == 0) { event.stopPropagation(), event.preventDefault() } - }, -}) -Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, target) { +Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, target) { if ((can.user.Search(can, "topic")||"").indexOf("print") > -1) { return } return @@ -854,6 +699,10 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe }) }, + focus: function(can, target) { + target.setSelectionRange(0, -1) + target.focus() + }, clear: function(can, target) { can.page.Modify(can, target||can._output, "") }, @@ -882,7 +731,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe can.page.Modify(can, target||can._target, {style: {display: "none"}}) }, toggle: function(can, target) { - return can.page.Toggle(can, target||can._target) + return can.onmotion.Toggle(can, target||can._target) }, select: function(can, target, name, which) { can.page.Select(can, target, name, function(item, index) { @@ -971,7 +820,6 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe can.page.Modify(can, target, {style: {width: begin+=space}}) }) }, - autosize: function(can, target, max, min) { can.page.Modify(can, target, { onfocus: function(event) { @@ -984,6 +832,325 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe can.onmotion.resize(can, target, min, 5) }, }) - } + }, + + EnableDrop: function(can, parent, search, target) { + return can.page.Modify(can, target, { draggable: true, + ondragstart: function(event) { var target = event.target; can.drop = function(event, tab) { + parent.insertBefore(target, tab) + can.page.Select(can, parent, search, function(item) { + can.page.ClassList.del(can, item, "over") + }) + } }, + ondragover: function(event) { event.preventDefault() + can.page.Select(can, parent, search, function(item) { + can.page.ClassList.del(can, item, "over") + }), can.page.ClassList.add(can, event.target, "over") + }, + ondrop: function(event) { event.preventDefault() + can.drop(event, event.target) + }, + }) + }, + Resizes: function(event, item, begin, p0, p1, pos) { + switch (pos) { + case 5: + item.Value("x", begin.x + p1.x - p0.x) + item.Value("y", begin.y + p1.y - p0.y) + return + } + + switch (pos) { + case 1: + case 2: + case 3: + item.Value("y", begin.y + p1.y - p0.y) + item.Value("height", begin.height - p1.y + p0.y) + break + } + switch (pos) { + case 1: + case 4: + case 7: + item.Value("x", begin.x + p1.x - p0.x) + item.Value("width", begin.width - p1.x + p0.x) + break + } + switch (pos) { + case 3: + case 6: + case 9: + item.Value("width", begin.width + p1.x - p0.x) + break + } + switch (pos) { + case 7: + case 8: + case 9: + item.Value("height", begin.height + p1.y - p0.y) + break + } + }, + 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 + } + }, + Anchor: function(event, target, pos, point) { + switch (pos) { + case 1: + case 2: + case 3: + point.y = target.Val("y") + break + case 4: + case 5: + case 6: + point.y = target.Val("y") + target.Val("height") / 2 + break + case 7: + case 8: + case 9: + point.y = target.Val("y") + target.Val("height") + break + } + + switch (pos) { + case 1: + case 4: + case 7: + point.x = target.Val("x") + break + case 2: + case 5: + case 8: + point.x = target.Val("x") + target.Val("width") / 2 + break + case 3: + case 6: + case 9: + point.x = target.Val("x") + target.Val("width") + break + } + return point + }, + Prepos: function(event, item, p, q) { + var max = 20 + p = p || item.getBoundingClientRect() + q = q || {x: event.clientX, y: event.clientY} + + var pos = 5 + var y = (q.y - p.y) / p.height + if (y < 0.2 && q.y - p.y < max) { + pos -= 3 + } else if (y > 0.8 && q.y - p.y - p.height > -max) { + pos += 3 + } + var x = (q.x - p.x) / p.width + if (x < 0.2 && q.x - p.x < max) { + pos -= 1 + } else if (x > 0.8 && q.x - p.x - p.width > -max) { + 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 + }, + Toggle: function(can, target, show, hide) { var status = target.style.display == "none" + can.page.Modify(can, target, {style: {display: status? "": "none"}}) + status? typeof show == "function" && show(): typeof hide == "function" && hide() + return status + }, +}) +Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, target) { + var focus = []; can.onengine.listen(can, "keymap.focus", function(cb) { + cb? focus.push(cb): focus.pop() + }) + can.onkeypop._build(can) + target.onkeydown = function(event) { + if (focus.length > 0) { return focus[focus.length-1](event) } + if (event.target != target) { return } + can.page.Select(can, target, "fieldset.Action>div.output", function(item) { + target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item) + }) + } + }, + _build: function(can) { + can.core.Item(can.onkeypop._mode, function(item, value) { var engine = {} + can.core.Item(value, function(key, cb) { var map = engine + for (var i = key.length-1; i > -1; i--) { + map = map[key[i]] = i == 0? cb: (map[key[i]]||{}) + } + }), can.onkeypop._engine[item] = engine + }) + }, + _parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key) + // can.Status("按键", list.join("")) + for (var pre = 0; pre < list.length; pre++) { + if ("0" <= list[pre] && list[pre] <= "9") { continue } break + }; var count = parseInt(list.slice(0, pre).join(""))||1 + + function repeat(cb, count) { list = [] + for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } + event.stopPropagation(), event.preventDefault() + // can.Status("按键", list.join("")) + } + + var map = can.onkeypop._mode[mode] + var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { + repeat(cb, count); return list + } + var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { + repeat(cb, count); return list + } + + var map = can.onkeypop._engine[mode]; for (var i = list.length-1; i > pre-1; i--) { + var cb = map[list[i]]; switch (typeof cb) { + case "function": repeat(cb, count); return list + case "object": map = cb; continue + case "string": + default: return list + } + } + return list + }, + _mode: { + normal: { + j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) }, + k: function(event, can, target) { target.scrollBy(0, -30) }, + + b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) }, + w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) }, + + s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) }, + t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) }, + + " ": function(event, can, target) { + can.page.Select(can, document.body, "fieldset.panel.Header div.search input", function(target) { + target.focus() + }) + }, + enter: function(event, can, target) { can.misc.Log("enter") }, + escape: function(event, can, target) { + can.search(event, ["Search.onaction.hide"]) + can.misc.Log("enter") + }, + }, + insert: { + escape: function(event, can, target) { + target.blur() + }, + jk: function(event, can, target) { + can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart) + target.blur() + }, + enter: function(event, can, target) { + var his = target._history || [] + his.push(target.value) + + can.misc.Log("input", target, his) + target.setSelectionRange(0, -1) + target._current = his.length + target._history = his + }, + }, + insert_ctrl: { + p: function(event, can, target) { + var his = target._history||[] + var pos = target._current||0 + + pos = --pos % (his.length+1) + if (pos < 0) { pos = his.length} + target.value = his[pos]||"" + can.misc.Log(pos, his) + + target._current = pos + }, + n: function(event, can, target) { + var his = target._history||[] + var pos = target._current||0 + + pos = ++pos % (his.length+1) + target.value = his[pos]||"" + can.misc.Log(pos, his) + + target._current = pos + }, + + u: function(event, can, target) { + can.onkeypop.DelText(target, 0, target.selectionEnd) + }, + k: function(event, can, target) { + can.onkeypop.DelText(target, target.selectionStart) + }, + h: function(event, can, target) { + can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart) + }, + d: function(event, can, target) { + can.onkeypop.DelText(target, 0, target.selectionStart) + }, + w: function(event, can, target) { + var start = target.selectionStart-2 + var end = target.selectionEnd-1 + for (var i = start; i >= 0; i--) { + if (target.value[end] == " " && target.value[i] != " ") { + break + } + if (target.value[end] != " " && target.value[i] == " ") { + break + } + } + can.onkeypop.DelText(target, i+1, end-i) + }, + }, + }, _engine: {}, + + DelText: function(target, start, count) { + target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length) + target.setSelectionRange(start, start) + }, + input: function(event, can) { var target = event.target + target._keys = can.onkeypop._parse(event, can, event.ctrlKey? "insert_ctrl": "insert", target._keys||[], target) + if (target._keys.length == 0) { event.stopPropagation(), event.preventDefault() } + }, }) diff --git a/lib/base.js b/lib/base.js index f04e0c84..2e2761eb 100644 --- a/lib/base.js +++ b/lib/base.js @@ -1,6 +1,7 @@ Volcanos("base", {help: "数据类型", - isFunc: function(cb) { return typeof cb == "function" }, - Int: function(value, def) { return parseInt(value)||def||0 }, + Int: function(value, def) { + return parseInt(value)||def||0 + }, Obj: function(value, def) { try { return (typeof value == "string" && value != ""? JSON.parse(value): value) || def || {} @@ -9,8 +10,7 @@ Volcanos("base", {help: "数据类型", } }, Copy: function(to, from, fields) { - var list = [] - for (var i = 2; i < arguments.length; i++) { + var list = []; for (var i = 2; i < arguments.length; i++) { list.push(arguments[i]) } @@ -18,24 +18,26 @@ Volcanos("base", {help: "数据类型", to[list[i]] = from[list[i]] } }, - Eq: function(obj, other) { var self = arguments.callee - if (typeof obj != typeof other) { return false } + Eq: function(to, from) { var self = arguments.callee + if (typeof to != typeof from) { return false } - if (typeof obj == "object") { - if (obj.length != other.length) { return false } - for (var i = 0; i < obj.length; i++) { - if (!self(obj[i], other[i])) { return false } + if (typeof to == "object") { + if (to.length != from.length) { return false } + for (var i = 0; i < to.length; i++) { + if (!self(to[i], from[i])) { return false } } - for (var k in obj) { - if (!self(obj[k], other[k])) { return false } + for (var k in to) { + if (!self(to[k], from[k])) { return false } } return true } - return obj === other + return to === from }, - Ext: function(file) { return (file.split("/").pop().split(".").pop()).toLowerCase() }, + Ext: function(file) { + return (file.split("/").pop().split(".").pop()).toLowerCase() + }, Path: function() { var res = "" for (var i = 0; i < arguments.length; i++) { res += (arguments[i][0]=="/" || res=="" || res[res.length-1]=="/"? "": "/") + arguments[i].trim() @@ -56,21 +58,20 @@ Volcanos("base", {help: "数据类型", }) for (var i = 1; i < arguments.length; i++) { switch (typeof arguments[i]) { + case "string": + args[arguments[i]] = arguments[i+1], i++ + break case "object": if (arguments[i].length > 0) { for (var j = 0; j < arguments[i].length; j += 2) { args[arguments[i][j]] = arguments[i][j] } - break - } - for (var k in arguments[i]) { - args[k] = arguments[i][k] + } else { + for (var k in arguments[i]) { + args[k] = arguments[i][k] + } } break - case "string": - args[arguments[i]] = arguments[i+1] - i++ - break } } var list = []; for (var k in args) { @@ -79,6 +80,45 @@ Volcanos("base", {help: "数据类型", return url.split("?")[0]+(list.length>0? "?"+list.join("&"): "") }, + Size: function(size) {size = parseInt(size) + if (size > 1000000000) { + return parseInt(size / 1000000000) + "." + parseInt(size / 10000000 % 100) + "G" + } + if (size > 1000000) { + return parseInt(size / 1000000) + "." + parseInt(size / 10000 % 100) + "M" + } + if (size > 1000) { + return parseInt(size / 1000) + "." + parseInt(size / 10 % 100) + "K" + } + return size + "B" + }, + Number: function(d, n) { var result = [] + while (d > 0) { result.push(d % 10); d = parseInt(d / 10); n-- } + while (n > 0) { result.push("0"); n-- } + return result.reverse(), result.join("") + }, + Format: function(obj) { + return JSON.stringify(obj) + }, + Simple: function() { var res = [] + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; switch (typeof arguments[i]) { + case "number": res.push(arg); break + case "string": res.push(arg); break + case "object": + if (arg.length > 0) { + res = res.concat(arg) + } else { + for (var k in arg) { res.push(k, arg[k]) } + } + } + } + return res + }, + AddUniq: function(list, value) { list = list || [] + return list.indexOf(value) > -1 && list.push(value), list + }, + Date: function(time) { var now = new Date() if (typeof time == "string" && time != "") { var ls = time.split(" ") var vs = ls[0].split("-") @@ -95,7 +135,7 @@ Volcanos("base", {help: "数据类型", } return now }, - Time: shy("时间格式化", function(time, fmt) { var now = this.Date(time) + Time: function(time, fmt) { var now = this.Date(time) var list = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"] fmt = fmt || "%y-%m-%d %H:%M:%S" fmt = fmt.replace("%y", now.getFullYear()) @@ -106,7 +146,10 @@ Volcanos("base", {help: "数据类型", fmt = fmt.replace("%M", this.Number(now.getMinutes(), 2)) fmt = fmt.replace("%S", this.Number(now.getSeconds(), 2)) return fmt - }), + }, + TimeAdd: function(t, d) { + return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000) + }, Duration: function(n) { var res = "", h = 0 h = parseInt(n/3600000/24), h > 0 && (res += h+"d"), n = n % (3600000*24) h = parseInt(n/3600000), h > 0 && (res += h+"h"), n = n % 3600000 @@ -114,40 +157,22 @@ Volcanos("base", {help: "数据类型", h = parseInt(n/1000), h > 0 && (res += h), n = n % 1000 return res + (n > 0? "."+parseInt(n/10): "") + "s" }, - Format: shy("数据格式化", function(obj) { return JSON.stringify(obj) }), - Simple: function() { var res = [] - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; switch (typeof arguments[i]) { - case "number": res.push(arg); break - case "string": res.push(arg); break - case "object": - if (arg.length > 0) { - res = res.concat(arg) - } else { - for (var k in arg) { res.push(k, arg[k]) } - } - } - } - return res - }, - Number: shy("数字格式化", function(d, n) { var result = [] - while (d > 0) { result.push(d % 10); d = parseInt(d / 10); n-- } - while (n > 0) { result.push("0"); n-- } - return result.reverse(), result.join("") - }), - Size: function(size) {size = parseInt(size) - if (size > 1000000000) { - return parseInt(size / 1000000000) + "." + parseInt(size / 10000000 % 100) + "G" - } - if (size > 1000000) { - return parseInt(size / 1000000) + "." + parseInt(size / 10000 % 100) + "M" - } - if (size > 1000) { - return parseInt(size / 1000) + "." + parseInt(size / 10 % 100) + "K" - } - return size + "B" - }, + parseSize: function(size) { size = size.toLowerCase() + if (size.endsWith("tb") || size.endsWith("t")) { + return parseInt(size) * 1024 * 1024 * 1024 * 1024 + } + if (size.endsWith("gb") || size.endsWith("g")) { + return parseInt(size) * 1024 * 1024 * 1024 + } + if (size.endsWith("mb") || size.endsWith("m")) { + return parseInt(size) * 1024 * 1024 + } + if (size.endsWith("kb") || size.endsWith("k")) { + return parseInt(size) * 1024 + } + return parseInt(size) + }, parseJSON: function(str) { var res if (typeof str == "object") { return str } if (str.indexOf("http") == 0) { var ls = str.split("?") @@ -166,54 +191,11 @@ Volcanos("base", {help: "数据类型", } return res }, - parseSize: function(size) { size = size.toLowerCase() - if (size.endsWith("tb") || size.endsWith("t")) { - return parseInt(size) * 1024 * 1024 * 1024 * 1024 - } - if (size.endsWith("gb") || size.endsWith("g")) { - return parseInt(size) * 1024 * 1024 * 1024 - } - if (size.endsWith("mb") || size.endsWith("m")) { - return parseInt(size) * 1024 * 1024 - } - if (size.endsWith("kb") || size.endsWith("k")) { - return parseInt(size) * 1024 - } - return parseInt(size) - }, isNight: function() { var now = new Date() return now.getHours() < 7 || now.getHours() > 17 }, - TimeAdd: shy("时间格式化", function(t, d) { - return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000) - }), - - Debug: function() { - var args = [this.Time(null, "%H:%M:%S"), this.FileLine(2, 3), "debug"] - for (var i in arguments) { args.push(arguments[i]) } - args.push(this.fileLine(2, 3)) - console.log.apply(console, args) - }, - Warn: function() { - var args = [this.Time(null, "%H:%M:%S"), this.FileLine(2, 3), "warn"] - for (var i in arguments) { args.push(arguments[i]) } - args.push("\n", this._fileLine().split("\n").slice(2).join("\n")) - console.log.apply(console, args) - }, - Log: function() { - var args = [this.Time(null, "%H:%M:%S"), this.FileLine(2, 3)] - for (var i in arguments) { args.push(arguments[i]) } - console.log.apply(console, args) - }, - FileLine: function(depth, length) { - return this.fileLine(depth+1).split("/").slice(3).slice(-length).join("/").split(")")[0] - }, - fileLine: function(depth) { - return (this._fileLine().split("\n")[1+depth]||"").trim() - }, - _fileLine: function() { var obj = {} - Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee) - return obj.stack || "" + isFunc: function(cb) { + return typeof cb == "function" }, }) diff --git a/lib/core.js b/lib/core.js index 366216f2..180dda4c 100644 --- a/lib/core.js +++ b/lib/core.js @@ -1,150 +1,14 @@ Volcanos("core", {help: "数据结构", - Split: shy("分词器", function(str) { if (!str || !str.length) { return [] } - var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) { - typeof arguments[i] == "object"? opt = arguments[i]: arg.push(arguments[i]) - } - - function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res } - // 空白符 - var seps = _list(arg[0]||"\t ,\n") - // 分隔符 - var sups = _list(arg[1]||"{[(.:)]}") - // 引用符 - var subs = _list(arg[2]||"'\"`") - - // 开始分词 - var res = [], list = str - var left = "", space = true, begin = 0 - for (var i = 0; i < list.length; i++) { - if (seps[list[i]]) { - // 空白符 - if (left == "") { - if (!space) { - res.push(list.slice(begin, i)) - } - opt.detail && res.push({text: list.slice(i, i+1), type: "space", left: left}) - space = true, begin = i+1 - } - } else if (subs[list[i]]) { - // 引用符 - if (left == "") { - left = list[i], space = false, begin = i+1 - } else if (left == list[i]) { - res.push({text: list.slice(begin, i), type: "string", left: left, right: left}) - left = "", space = true, begin = i+1 - } - } else if (sups[list[i]]) { - // 分隔符 - if (left == "") { - if (!space) { - res.push(list.slice(begin, i)) - } - res.push(list.slice(i, i+1)) - space = true, begin = i+1 - } - } else if (list[0] == '\\') { - // 转义符 - for (var i = i; i < list.length-1; i++) { - list[i] = list[i+1] - } - list = list.slice(0, list.length-1) - space = false - } else { - space = false - } - } - - // 末尾字符 - if (left != "") { - res.push({text: list.slice(begin), type: "string", left: left, right: ""}) - } else if (begin < list.length) { - res.push(list.slice(begin)) - } - return res - }), - Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) { - interval = typeof interval == "object"? interval || []: [interval] - var timer = {stop: false}; function loop(timer, i) { - if (timer.stop || i >= interval.length && interval.length >= 0) { - return typeof cbs == "function" && cbs(timer, interval) - } - return typeof cb == "function" && cb(timer, interval.interval||interval[i], i, interval)? - typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.interval||interval[i+1]) - } - if (interval.interval == 0) { cb(); return timer } - setTimeout(function() { loop(timer, 0) }, interval.interval||interval[0]) - return timer - }), - Delay: shy("延时器", function(list, interval, cb, cbs) { - list.push(cb); this.Timer(interval, function() { - var cb = list.pop(); list.length = 0 - typeof cb == "function" && cb() - }, cbs) - }), - - 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 - }), - Item: shy("迭代器", function(obj, cb) { var list = [] - for (var k in obj) { - var res = typeof cb == "function"? cb(k, obj[k]): k - res && list.push(res) - } - return list - }), - List: shy("迭代器", function(obj, cb, interval, cbs) { - if (typeof obj == "number") { - var begin = 0, end = obj, step = 1 - if (typeof interval == "number") { - step = interval - } - if (typeof cb == "number") { - begin = obj, end = cb - } - - var list = [] - for (var i = begin; i < end; i += step) { - list.push(i) - } - return list - } - - obj = typeof obj == "string"? [obj]: (obj || []) - if (interval > 0) { - function loop(i) { if (i >= obj.length) { return typeof cbs == "function" && cbs(obj) } - typeof cb == "function" && cb(obj[i], i, obj), setTimeout(function() { loop(i+1) }, interval) - } - obj.length > 0 && setTimeout(function() { loop(0) }, interval/4) - return obj - } - - var list = [], res - for (var i = 0; i < obj.length; i++) { - typeof cb == "function"? (res = cb(obj[i], i, obj)) != undefined && list.push(res): list.push(obj[i]) - } - return list - }), - Next: shy("迭代器", function(obj, cb, cbs) { obj = typeof obj == "string"? [obj]: (obj || []) - function next(list, cb, index) { - list && list.length > 0? typeof cb == "function" && cb(list[0], function() { - list.length > 0 && next(list.slice(1), cb, index+1) - }, index, obj): typeof cbs == "function" && cbs() - } - next(obj, cb, 0) - }), - - Keys: shy("生成器", function() { var list = [] + Keys: shy("连接器", function() { var list = [] for (var i = 0; i < arguments.length; i++) { var v = arguments[i] switch (typeof v) { - case "number": list.push(v+""); break - case "string": list.push(v); break - case "object": list.push(arguments.callee.apply(this, v)); break - case "function": list.push(v()); break + case "object": + for (var j = 0; j < v.length; j++) { + // list.push(arguments.callee.apply({}, v[j])) + list.push(v[j]) + } + break + case "function": v = v() default: v && list.push(v+"") } } @@ -153,6 +17,7 @@ Volcanos("core", {help: "数据结构", Value: shy("存储器", function(data, key, value) { if (data == undefined) { return } if (key == undefined) { return data } + if (typeof key == "object") { for (var k in key) { arguments.callee.call(this, data, k, key[k]) }; return data } @@ -165,17 +30,65 @@ Volcanos("core", {help: "数据结构", p = p[ls[0]], ls = ls.slice(1) }; return p }), - CallFunc: shy("调用器", function(func, args, mod) { args = args||{} - var can = args["can"]||args[0], msg = args["msg"]||args[1] - var cmds = args["cmds"]||[] + Split: shy("分词器", function(str) { if (!str || !str.length) { return [] } + var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) { + typeof arguments[i] == "object"? opt = arguments[i]: arg.push(arguments[i]) + } + // 字符定义 + function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res } + var soos = _list("\\") // 转义符 + var seps = _list(arg[0]||"\t ,;\n") // 空白符 + var subs = _list(arg[1]||"{[(.:)]}") // 分隔符 + var sups = _list(arg[2]||"'\"`") // 引用符 + + var res = [], begin = 0; function push(obj) { + obj != "" && res.push(typeof obj == "string" || opt.detail? obj: obj.text), begin = -1 + } + + // 开始分词 + for (var s = "", i = 0; i < str.length; i++) { + if (soos[str[i]]) { // 转义符 + begin == -1 && (begin = i++) + + } else if (seps[str[i]]) { // 空白符 + if (s) { continue } + begin > -1 && push(str.slice(begin, i)) + opt.detail && push({type: "space", text: str.slice(i, i+1)}) + + } else if (subs[str[i]]) { // 分隔符 + if (s) { continue } + begin > -1 && push(str.slice(begin, i)) + push(str.slice(i, i+1)) + + } else if (sups[str[i]]) { // 引用符 + if (s == "") { + s = str[i], begin = i+1 + } else if (s == str[i]) { + push({type: "string", text: str.slice(begin, i), left: s, right: str[i]}) + s = "", begin = -1 + } + + } else { // 普通符 + begin == -1 && (begin = i) + } + } + + // 剩余字符 + begin > 0 && (s? push({type: "string", text: str.slice(begin), left: s, right: ""}) + : push(str.slice(begin))) + + return res + }), + CallFunc: shy("调用器", function(func, args, mod) { args = args || {} func = typeof func == "function"? func: typeof func == "string"? this.Value(mod||can, func): - typeof func == "object" && func.slice? this.Value(func[0], this.Keys(func.slice(1))): null + typeof func == "object" && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): null if (typeof func != "function") { return } - var cb = args["cb"] - var ls = func.toString().split(")")[0].split("(")[1].split(",") - var list = [], echo = false; this.List(ls, function(item, index) { item = item.trim() + var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[] + + var list = [], echo = false, cb = args["cb"] + this.List(func.toString().split(")")[0].split("(")[1].split(","), function(item, index) { item = item.trim() list.push(args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || cmds[index] || args[index] || null) if (item == "cb") { echo = true } }) @@ -184,5 +97,78 @@ Volcanos("core", {help: "数据结构", if (!echo && typeof cb == "function") { res && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } return res }), + + List: shy("迭代器", function(list, cb, interval, cbs) { list = list || [] + if (typeof list == "string") { // 默认序列 + list = [list] + + } else if (typeof list == "number") { // 等差序列 + var begin = 0, end = list, step = typeof interval == "number"? interval: 1 + if (typeof cb == "number") { begin = list, end = cb, cb = null } + + list = []; for (var i = begin; i < end; i += step) { + list.push(i) + } + } + + if (interval > 0) { // 时间序列 + function loop(i) { if (i >= list.length) { return typeof cbs == "function" && cbs(list) } + cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval) + } + typeof cb == "function" && list.length > 0 && setTimeout(function() { loop(0) }, interval/4) + + } else { // 选择序列 + var slice = [], res + for (var i = 0; i < list.length; i++) { + typeof cb == "function" && (res = cb(list[i], i, list)) != undefined? slice.push(res): slice.push(list[i]) + } + list = slice + } + + return list + }), + Next: shy("迭代器", function(list, cb, cbs) { + function next(i) { + i < list.length? cb(list[i], function(skip) { + next(i+1+(skip||0)) + }, i, list): typeof cbs == "function" && cbs(list) + } + + list = typeof list == "object"? list: [list] + list && list.length > 0 && typeof cb == "function"? next(0): typeof cbs == "function" && cbs(list) + }), + Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) { + var timer = {stop: false}; function loop(i) { + timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)? + typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1]) + } + + interval = typeof interval == "object"? interval: [interval] + if (interval.interval == 0) { cb(); return timer } + + typeof cb == "function" && setTimeout(function() { loop(0) }, interval.interval||interval[0]) + return timer + }), + Delay: shy("延时器", function(list, interval, cb, cbs) { + list.push(cb); this.Timer(interval, function() { + var cb = list.pop(); list.length = 0 + typeof cb == "function" && cb() + }, cbs) + }), + Items: shy("迭代器", function(obj, cb) { var list = [] + for (var k in obj) { + list = list.concat(this.List(obj[k], function(v, i) { + return typeof cb == "function" && cb(v, i, k, obj) + })) + } + return list + }), + Item: shy("迭代器", function(obj, cb) { var list = [] + for (var k in obj) { + var res = typeof cb == "function"? cb(k, obj[k]): k + res != undefined && list.push(res) + } + return list + }), }) diff --git a/lib/misc.js b/lib/misc.js index 5cad022a..736a360a 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -4,36 +4,38 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg if (key == undefined) { return msg && msg.option || [] } if (typeof key == "object") { can.core.Item(key, msg.Option) } if (val == undefined) { return msg && msg[key] && msg[key][0] || "" } - msg.option = msg.option || [], can.core.List(msg.option, function(k) { if (k == key) { return k } }).length > 0 || msg.option.push(key) - return msg[key] = can.core.List(arguments).slice(1), val + return msg.option = can.base.AddUniq(msg.option, key), msg[key] = can.core.List(arguments).slice(1), val }, Append: function(key, val) { if (key == undefined) { return msg && msg.append || [] } if (typeof key == "object") { can.core.Item(key, msg.Append) } if (val == undefined) { return msg && msg[key] && msg[key][0] || "" } - msg.append = msg.append || [], can.core.List(msg.append, function(k) { if (k == key) { return k } }).length > 0 || msg.append.push(key) - return msg[key] = can.core.List(arguments).slice(1), val + return msg.append = can.base.AddUniq(msg.append, key), msg[key] = can.core.List(arguments).slice(1), val }, Result: function() { return msg.result && msg.result.join("") || "" }, - Table: function(cb) { if (!msg.append || msg.append.length == 0 || !msg[msg.append[0]]) { return } + Length: function() { + var max = "", len = 0; can.core.List(msg.append, function(key, index) { + if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length } + }) + return len + }, + Table: function(cb) { if (!msg.append || msg.append.length == 0) { return } var max = "", len = 0; can.core.List(msg.append, function(key, index) { if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length } }) return can.core.List(msg[max], function(value, index, array) { var one = {}, res can.core.List(msg.append, function(key) { one[key] = (msg[key]&&msg[key][index]||"") }) - return typeof cb == "function" && (res = cb(one, index, array)) && res != undefined && res || one + return can.base.isFunc(cb) && (res = cb(one, index, array)) && res != undefined && res || one }) }, - Clear: function(key) { - switch (key) { - case "append": - case "option": - can.core.List(msg[key], function(item) { delete(msg[item]) }) - default: msg[key] = [] - } - }, + Clear: function(key) { switch (key) { + case "append": + case "option": + can.core.List(msg[key], function(item) { delete(msg[item]) }) + default: msg[key] = [] + } }, Copy: function(res) { if (!res) { return msg } res.result && (msg.result = (msg.result||[]).concat(res.result)) res.append && (msg.append = res.append) && res.append.forEach(function(item) { @@ -44,7 +46,7 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg }) return msg }, - Push: function(key, value, detail) { msg.append = msg.append || [] + Push: function(key, value, detail) { if (typeof key == "object") { value = value || can.core.Item(key), can.core.List(value, function(item) { detail? msg.Push("key", item).Push("value", key[item]||""): @@ -53,11 +55,7 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg return msg } - for (var i = 0; i < msg.append.length; i++) { - if (msg.append[i] == key) { break } - }; i >= msg.append.length && msg.append.push(key) - - msg[key] = msg[key] || [] + msg.append = can.base.AddUniq(msg.append, key), msg[key] = msg[key] || [] msg[key].push(typeof value == "string" || typeof value == "function"? value: JSON.stringify(value)) return msg }, @@ -65,17 +63,12 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) } return msg._hand = true, msg }, - Length: function() { - return msg.append && msg.append[0] && msg[msg.append[0]] && msg[msg.append[0]].length || 0 - }, - } - - for (var k in proto) { msg[k] = proto[k] } + }; msg.__proto__ = proto return msg }, - POST: shy("请求后端", {order: 0}, function(can, msg, url, form, cb) { + POST: function(can, msg, url, form, cb) { var xhr = new XMLHttpRequest(); msg._xhr = xhr - xhr.open("POST", url), xhr.onreadystatechange = function() { + xhr.open(msg._method||"POST", url), xhr.onreadystatechange = function() { if (xhr.readyState != 4) { return } try { // 解析响应 @@ -83,17 +76,16 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg } catch (e) { var res = {"result": [xhr.responseText]} } - xhr.status == 200 && typeof cb == "function" && cb(msg.Copy(res)) + xhr.status == 200 && can.base.isFunc(cb) && cb(msg.Copy(res)) } - if (msg.upload) { // 上传文件 - var data = new FormData() - can.core.Items(form, function(value, index, key) { + if (msg._upload) { // 上传文件 + var data = new FormData(); can.core.Items(form, function(value, index, key) { data.append(key, value) - }), data.append("upload", msg.upload) + }), data.append("upload", msg._upload) xhr.upload.onprogress = function(event) { - typeof msg._progress == "function" && msg._progress(event, parseInt(event.loaded*100/event.total), event.total, event.loaded) + can.base.isFunc(msg._progress) && msg._progress(event, parseInt(event.loaded*100/event.total), event.total, event.loaded) } } else { // 请求数据 var data = can.core.Items(form, function(value, index, key) { @@ -105,48 +97,32 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg // 发送请求 xhr.setRequestHeader("Accept", "application/json") - try { xhr.send(data) } catch(e) { can.base.Log(e) } - }), - Runs: shy("请求后端", {order: 0}, function(event, can, dataset, cmds, cb) { - var key = dataset.names+"."+cmds.join(",") - if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear("append") - var res = Volcanos.meta.pack[key]; res? msg.Copy(res): can.user.toast(can, "缺失数据") - return typeof cb == "function" && cb(msg) - } - can.misc.Run(event, can, dataset, cmds, function(msg) { - Volcanos.meta.pack[key] = msg - typeof cb == "function" && cb(msg) - }) - }), - Run: shy("请求后端", {order: 0}, function(event, can, dataset, cmds, cb) { - var msg = can.request(event = event || {}) - var form = {cmds: cmds||msg.cmd} - msg.option && msg.option.forEach(function(item) { + try { xhr.send(data) } catch(e) { can.misc.Log(e) } + }, + Run: function(event, can, dataset, cmds, cb) { + var msg = can.request(event||{}) + var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) { msg[item] && (form[item] = msg[item]) }) - can.misc.POST(can, msg, can.base.MergeURL( - (can.Conf("iceberg")||"/chat/")+dataset.names.toLowerCase(), - "_", (msg._can.sup||msg._can)._name, - "_daemon", dataset.daemon, - ), form, function(msg) { - typeof cb == "function" && cb(msg) - }) - }), - WSS: shy("请求后端", {order: 0}, function(can, args, cb, onopen, onclose, onerror) { + can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(), + "_", (msg._can.sup||msg._can)._name, "_daemon", dataset.daemon, + ), form, cb) + }, + WSS: function(can, args, cb, onopen, onclose, onerror) { var url = location.protocol.replace("http", "ws")+"//"+location.host+"/space/" if (url.indexOf("chrome") == 0) { url = "ws://localhost:9020/space/" } var socket = new WebSocket(can.base.MergeURL(url, args)) - socket.onclose = function() { can.base.Log("wss", "close", args) - typeof onclose == "function"? onclose(socket): can.core.Timer(1000, function() { + socket.onclose = function() { can.misc.Log("wss", "close", args) + can.base.isFunc(onclose)? onclose(socket): can.core.Timer(1000, function() { can.misc.WSS(can, args, cb, onopen, onerror, onclose) }) - }, socket.onerror = function() { can.base.Log("wss", "error", args) - typeof onerror == "function"? onerror(socket): socket.close() + }, socket.onerror = function() { can.misc.Log("wss", "error", args) + can.base.isFunc(onerror)? onerror(socket): socket.close() - }, socket.onopen = function() { can.base.Log("wss", "open", args) - typeof onopen == "function" && onopen(socket) + }, socket.onopen = function() { can.misc.Log("wss", "open", args) + can.base.isFunc(onopen) && onopen(socket) } socket.onmessage = function(event) { @@ -164,18 +140,49 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg delete(msg._event) msg.Option("_handle", true) msg.Option("_target", msg.Option("_source")) - can.base.Log("wss", "result", msg.result, msg) + can.misc.Log("wss", "result", msg.result, msg) socket.send(JSON.stringify(msg)) }, msg.detail = data.detail, msg.Copy(data) - try { // 执行命令 - can.base.Log("wss", "detail", msg.detail, msg) - typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1)) + // 执行命令 + try { can.misc.Log("wss", "detail", msg.detail, msg) + can.isFunc(cb) && cb(event, msg, msg.detail[0], msg.detail.slice(1)) } catch (e) { // 执行失败 - can.base.Log(e) - msg.Reply(e) + can.misc.Log(e), msg.Reply(e) } } - }), + }, + + Log: function() { + var args = [this._time(), this.FileLine(2, 3)] + for (var i in arguments) { args.push(arguments[i]) } + console.log.apply(console, args) + }, + Warn: function() { + var args = [this._time(), this.FileLine(2, 3), "warn"] + for (var i in arguments) { args.push(arguments[i]) } + args.push("\n", this._fileLine().split("\n").slice(2).join("\n")) + console.log.apply(console, args) + }, + Debug: function() { + var args = [this._time(), this.FileLine(2, 3), "debug"] + for (var i in arguments) { args.push(arguments[i]) } + args.push(this.fileLine(2, 3)) + console.log.apply(console, args) + navigator.userAgent.indexOf("Mobile") > -1 && alert(JSON.stringify(args.join(" "))) + }, + FileLine: function(depth, length) { + return this.fileLine(depth+1).split("/").slice(3).slice(-length).join("/").split(")")[0] + }, + fileLine: function(depth) { + return (this._fileLine().split("\n")[1+depth]||"").trim() + }, + _fileLine: function() { var obj = {} + Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee) + return obj.stack || "" + }, + _time: function() { var now = new Date() + return now.getHours()+":"+now.getMinutes()+":"+now.getSeconds() + }, }) diff --git a/lib/page.js b/lib/page.js index 92babfed..c2921f3a 100644 --- a/lib/page.js +++ b/lib/page.js @@ -1,51 +1,40 @@ -Volcanos("page", {help: "网页模块", - ClassList: { - has: function(can, obj, key) {var list = obj.className? obj.className.split(" "): [] - for (var i = 2; i < arguments.length; i++) { - if (list.indexOf(arguments[i]) == -1) {return false} - } - return true +Volcanos("page", {help: "网页模块", ClassList: { + has: function(can, obj, key) { var list = obj.className? obj.className.split(" "): [] + return list.indexOf(key) > -1 }, - add: function(can, obj, key) {var list = obj.className? obj.className.split(" "): [] - return obj.className = list.concat(can.core.List(key, function(value, index) { - return list.indexOf(value) == -1? value: undefined - })).join(" ").trim() + add: function(can, obj, key) { var list = obj.className? obj.className.split(" "): [] + return obj.className = can.base.AddUniq(list, key).join(" ").trim() }, - del: function(can, obj, key) {var list = can.core.List(arguments, function(value, index) {return index > 0? value: undefined}) - return obj.className = can.core.List(obj.className.split(" "), function(value) { - return list.indexOf(value) == -1? value: undefined + del: function(can, obj, key) { var list = obj.className? obj.className.split(" "): [] + return obj.className = can.core.List(list, function(value) { + return value == key? undefined: value }).join(" ").trim() }, set: function(can, obj, key, condition) { - condition? can.page.ClassList.add(can, obj, key): can.page.ClassList.del(can, obj, key) + condition? this.add(can, obj, key): this.del(can, obj, key) }, neg: function(can, obj, key) { this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key) }, }, - - Select: shy("选择节点", function(can, obj, key, cb, interval, cbs) {if (key == ".") {return []} - var item = obj && obj.querySelectorAll(key) - return can.core.List(item, cb, interval, cbs) + Select: shy("选择节点", function(can, target, key, cb, interval, cbs) { if (key == ".") { return [] } + return can.core.List(target && target.querySelectorAll(key), cb, interval, cbs) }), Modify: shy("修改节点", function(can, target, value) { target = target || {} target = typeof target == "string"? document.querySelector(target): target - typeof value == "string"? (target.innerHTML = value): can.core.Item(value, function(key, value) { - typeof value != "object"? (target[key] = value): can.core.Item(value, function(sub, value) { + typeof value == "string"? (target.innerHTML = value): can.core.Item(value, function(key, val) { + typeof val != "object"? (target[key] = val): can.core.Item(val, function(k, v) { var size = { "width": true, "max-width": true, "min-width": true, "height": true, "max-height": true, "min-height": true, "left": true, "right": true, "top": true, "bottom": true, "margin-top": true, "margin-left": true, + }; if (size[k] && parseInt(v) < 0) { return target[key] && (target[key][k] = "") } + + if (size[k] && v && (typeof v == "number" || v.indexOf && v.indexOf("px") == -1)) { + v += "px" } - if (parseInt(value) < 0 && sub == "height") { - target[key] && (target[key][sub] = "") - return - } - if (size[sub] && value && (typeof value == "number" || value.indexOf && value.indexOf("px") == -1)) { - value += "px" - } - target[key] && (target[key][sub] = value) + target[key] && (target[key][k] = v) }) }) return target @@ -53,6 +42,9 @@ Volcanos("page", {help: "网页模块", Create: shy("创建节点", function(can, key, value) { return can.page.Modify(can, document.createElement(key), value) }), + Remove: shy("删除节点", function(can, target) { + target && target.parentNode && target.parentNode.removeChild(target) + }), Append: shy("添加节点", function(can, target, key, value) { if (typeof key == "string") { var res = can.page.Create(can, key, value); return target.appendChild(res), res } @@ -68,61 +60,50 @@ Volcanos("page", {help: "网页模块", // 数据调整 can.core.Item(item, function(key, value) { switch (key) { - case "type": - case "name": - case "data": - case "list": - break - case "click": - data.onclick = item.click - break - case "inner": - data.innerHTML = item.inner - break - default: - data[key] = item[key] + case "type": break + case "name": break + case "data": break + case "list": break + case "inner": data.innerHTML = item.inner; break + case "click": data.onclick = item.click; break + default: data[key] = item[key] } }) 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 = can.user.trans(can, list[2]) || data.innerHTML || "" + 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 && list[2] && can.page.ClassList.add(can, data, list[2]) + list[2] && can.page.ClassList.add(can, data, list[2]) } else if (item.button) { var list = can.core.List(item.button) type = "button", name = name || list[0] data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) { typeof list[1] == "function" && list[1](event, name) - event.stopPropagation() - event.preventDefault() + event.stopPropagation(), event.preventDefault() return true } } 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, name) - } + type = "select", data.name = name = name || list[0][0] + data.title = can.user.trans(can, data.title || name) + data.className = data.className || list[0][0] || "" + item.list = list[0].slice(1).map(function(value) { return {type: "option", value: value, inner: can.user.trans(can, value)} }) - data.className = data.className || list[0][0] || "" - data.title = can.user.trans(can, data.title || name) - data.name = name + data.onchange = function(event) { + typeof list[1] == "function" && list[1](event, event.target.value, name) + } } else if (item.input) { var list = can.core.List(item.input) - type = "input", name = name || list[0] || "" - data.name = data.name || name + type = "input", name = name || list[0] || "", data.name = data.name || name data.className = data.className || data.name - data.placeholder = data.placeholder || data.name - data.placeholder = data.placeholder.split(".").pop() - data.title = data.title || data.placeholder data.autocomplete = "off" data.onfocus = data.onfocus || function(event) { @@ -135,96 +116,80 @@ Volcanos("page", {help: "网页模块", typeof list[2] == "function" && list[2](event) } } else if (item.username) { var list = can.core.List(item.username) - type = "input", name = name || list[0] || "username" - data.name = data.name || name + type = "input", name = name || list[0] || "username", data.name = data.name || name data.className = list[1] || data.className || data.name - data.placeholder = data.placeholder || data.name - data.title = data.title || data.placeholder data.autocomplete = data.autocomplete || "username" } else if (item.password) { var list = can.core.List(item.password) - type = "input", name = name || list[0] || "password" - data.type = "password" - data.name = data.name || name - data.className = list[1], data.className || data.name - data.placeholder = data.placeholder || data.name - data.title = data.title || data.placeholder + type = "input", name = name || list[0] || "password", data.name = data.name || name + data.className = list[1] || data.className || data.name data.autocomplete = data.autocomplete || "current-password" + data.type = "password" } else if (item.img) { var list = can.core.List(item.img) - type = "img" - data.src = list[0] + type = "img", data.src = list[0] } else if (item.row) { type = "tr" - item.list = item.row.map(function(text) {return {text: [text, item.sub||"td"]}}) + item.list = item.row.map(function(text) { return {text: [text, item.sub||"td"]} }) } else if (item.th) { type = "tr" - item.list = item.th.map(function(text) {return {text: [text, "th"]}}) + item.list = item.th.map(function(text) { return {text: [text, "th"]} }) } else if (item.td) { type = "tr" - item.list = item.td.map(function(text) {return {text: [text, "td"]}}) - - } else if (item.include) {var list = can.core.List(item.include) - type = "script" - data.src = list[0] - data.onload = list[1] + item.list = item.td.map(function(text) { return {text: [text, "td"]} }) } - item.type == "input" && data.type == "button" && (data.value = can.user.trans(can, data.value)) - item.type == "input" && data.type == "text" && (data.autocomplete = data.autocomplete||"off") - data.placeholder && (data.placeholder = can.user.trans(can, data.placeholder)) - data.title && (data.title = can.user.trans(can, data.title)) + if (type == "input") { + data.type == "button" && (data.value = can.user.trans(can, data.value)) + data.type == "text" && (data.autocomplete = data.autocomplete||"off") + (data.placeholder = can.user.trans(can, (data.placeholder||data.name).split(".").pop())) + data.title = can.user.trans(can, data.title||data.placeholder) + } // 创建节点 - name = name || data.className || type || "" !data.name && item.name && (data.name = item.name) var node = can.page.Create(can, type, data) - value.last = node, value.first = value.first || node, value[name||""] = value[data.className||""] = value[type] = node + // 创建索引 + name = name || data.className || type || "" + value[name||""] = value[data.className||""] = value[type] = node + value.first = value.first || node, value.last = node + value._target = value._target || node + + // 递归节点 item.list && can.page.Append(can, node, item.list, value) - typeof item._init == "function" && item._init(node) target && target.append && target.appendChild(node) - target.appendChild(node) + typeof item._init == "function" && item._init(node) }) return value }), Appends: shy("添加节点", function(can, target, key, value) { return target.innerHTML = "", can.page.Append(can, target, key, value) }), - Remove: shy("删除节点", function(can, target) { - target && target.parentNode && target.parentNode.removeChild(target) - }), - AppendAction: shy("添加控件", function(can, action, list, cb) { - return can.page.Append(can, action, can.core.List(list, function(line) { - return ["br", "hr"].indexOf(line.type) > -1? line: {view: "item", list: [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]} - })) - }), AppendTable: shy("添加表格", function(can, msg, target, list, cb) { if (!msg.append || msg.append.length == 0) {return} var table = can.page.Append(can, target, "table") - var tr = can.page.Append(can, table, "tr", {dataset: {index: -1}}) - can.core.List(list, function(key, index) { if (key.indexOf("_") == 0) { return } - key = can.Conf("feature.table.trans."+key) || {}[key] || key - - can.page.Append(can, tr, "th", key.trim()).onclick = function(event) { - var dataset = event.target.dataset - dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1 - can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1") - } - }) - + can.page.Append(can, table, [{type: "tr", {dataset: {index: -1}}, list: + can.core.List(list, function(key) { + return key[0] == "_"? undefined: {text: [key.trim(), "th"]} + }) + }]) can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) { return {type: "tr", dataset: {index: index}, list: can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return } return cb(can.page.Display(line[key]).trim(), key, index, line, array) })} })) - return table + return can.page.OrderTable(can, table) }), + OrderTable: function(can, table) { + can.page.Select(can, table, "th", function(th, index) { + th.onclick = function(event) { var dataset = event.target.dataset + dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1 + can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1") + } + }) + return table + }, RangeTable: function(can, table, index, sort_asc) { var list = can.page.Select(can, table, "tr", function(tr) { return tr.style.display == "none" || can.page.ClassList.has(can, tr, "hide")? null: tr @@ -276,22 +241,14 @@ Volcanos("page", {help: "网页模块", tbody.appendChild(list[i]) } }, - OrderTable: function(can, table) { - can.page.Select(can, table, "th", function(th, index) { - table.onclick = function(event) { - var dataset = event.target.dataset - dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1 - can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1") - } - }) - }, Display: function(text) { if (typeof text != "string") { return "" } if (text.indexOf("http://") == 0 || text.indexOf("https://") == 0 || text.indexOf("ftp://") == 0) { - var ls = text.split(" ") - return ""+ls[0]+""+ls.slice(1).join(" ") - } + var ls = text.split(" "); + text = ""+ls[0]+""+ls.slice(1).join(" ") + }; text = text.replace(/\\n/g, "
") + if (!text.indexOf("\033\[")) { return text } text = text.replace(/\033\[31m/g, "") text = text.replace(/\033\[32m/g, "") text = text.replace(/\033\[33m/g, "") @@ -302,213 +259,34 @@ Volcanos("page", {help: "网页模块", text = text.replace(/\033\[1m/g, "") text = text.replace(/\033\[0m/g, "") text = text.replace(/\033\[m/g, "") - text = text.replace(/\\n/g, "
") return text }, Format: function(type, src) { switch (type) { - case "a": - return ""+(arguments[2]||arguments[1])+"" - case "img": - return arguments[2]? "": "" + case "a": return ""+(arguments[2]||arguments[1])+"" + case "img": return arguments[2]? "": "" } }, - DelText: function(target, start, count) { - target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length) - target.setSelectionRange(start, start) - }, - Cache: function(name, output, data) { var cache = output._cache || {}; output._cache = cache if (data) { if (output.children.length == 0) { return } - // 写缓存 var temp = document.createDocumentFragment() - while (output.childNodes.length>0) { + while (output.childNodes.length > 0) { // 写缓存 var item = output.childNodes[0] - item.parentNode.removeChild(item) + item.parentNode.removeChild(item), temp.appendChild(item) } - - cache[name] = {node: temp, data: data} - return name + return cache[name] = {node: temp, data: data}, name } output.innerHTML = "" - var list = cache[name]; if (!list) {return} - // 读缓存 - while (list.node.childNodes.length>0) { + var list = cache[name]; if (!list) { return } + while (list.node.childNodes.length > 0) { // 读缓存 var item = list.node.childNodes[0] item.parentNode.removeChild(item) output.appendChild(item) } - delete(cache[name]) - return list.data - }, - Toggle: function(can, target, show, hide) { var status = target.style.display == "none" - can.page.Modify(can, target, {style: {display: status? "": "none"}}) - status? typeof show == "function" && show(): typeof hide == "function" && hide() - return status - }, - Anchor: function(event, target, pos, point) { - switch (pos) { - case 1: - case 2: - case 3: - point.y = target.Val("y") - break - case 4: - case 5: - case 6: - point.y = target.Val("y") + target.Val("height") / 2 - break - case 7: - case 8: - case 9: - point.y = target.Val("y") + target.Val("height") - break - } - - switch (pos) { - case 1: - case 4: - case 7: - point.x = target.Val("x") - break - case 2: - case 5: - case 8: - point.x = target.Val("x") + target.Val("width") / 2 - break - case 3: - case 6: - case 9: - point.x = target.Val("x") + target.Val("width") - break - } - return point - }, - Prepos: function(event, item, p, q) { - var max = 20 - p = p || item.getBoundingClientRect() - q = q || {x: event.clientX, y: event.clientY} - - var pos = 5 - var y = (q.y - p.y) / p.height - if (y < 0.2 && q.y - p.y < max) { - pos -= 3 - } else if (y > 0.8 && q.y - p.y - p.height > -max) { - pos += 3 - } - var x = (q.x - p.x) / p.width - if (x < 0.2 && q.x - p.x < max) { - pos -= 1 - } else if (x > 0.8 && q.x - p.x - p.width > -max) { - 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 - } - }, - Resizes: function(event, item, begin, p0, p1, pos) { - switch (pos) { - case 5: - item.Value("x", begin.x + p1.x - p0.x) - item.Value("y", begin.y + p1.y - p0.y) - return - } - - switch (pos) { - case 1: - case 2: - case 3: - item.Value("y", begin.y + p1.y - p0.y) - item.Value("height", begin.height - p1.y + p0.y) - break - } - switch (pos) { - case 1: - case 4: - case 7: - item.Value("x", begin.x + p1.x - p0.x) - item.Value("width", begin.width - p1.x + p0.x) - break - } - switch (pos) { - case 3: - case 6: - case 9: - item.Value("width", begin.width + p1.x - p0.x) - break - } - switch (pos) { - case 7: - case 8: - case 9: - item.Value("height", begin.height + p1.y - p0.y) - break - } - }, - EnableDrop: function(can, parent, search, target) { - return can.page.Modify(can, target, { draggable: true, - ondragstart: function(event) { var target = event.target; can.drop = function(event, tab) { - parent.insertBefore(target, tab) - can.page.Select(can, parent, search, function(item) { - can.page.ClassList.del(can, item, "over") - }) - } }, - ondragover: function(event) { event.preventDefault() - can.page.Select(can, parent, search, function(item) { - can.page.ClassList.del(can, item, "over") - }), can.page.ClassList.add(can, event.target, "over") - }, - ondrop: function(event) { event.preventDefault() - can.drop(event, event.target) - }, - }) + return delete(cache[name]), list.data }, }) diff --git a/lib/user.js b/lib/user.js index b8c14e8f..3561b711 100644 --- a/lib/user.js +++ b/lib/user.js @@ -1,6 +1,6 @@ Volcanos("user", {help: "用户模块", agent: { scanQRCode: function(cb, can) { - can.user.input(event, can, [{_input: "textarea"}], function(ev, button, data, list, args) { + can.user.input(event, can, [{type: "textarea"}], function(ev, button, data, list, args) { cb(list[0]) }) }, @@ -15,7 +15,7 @@ Volcanos("user", {help: "用户模块", agent: { typeof cb == "function" && cb([]) }, }, - isLandscape: window.innerWidth>window.innerHeight, + isLandscape: window.innerWidth > window.innerHeight, isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, isMobile: navigator.userAgent.indexOf("Mobile") > -1, isIPhone: navigator.userAgent.indexOf("iPhone") > -1, @@ -28,10 +28,103 @@ Volcanos("user", {help: "用户模块", agent: { confirm: function(text) { return confirm(JSON.stringify(text)) }, prompt: function(text, cb, def, silent) { (text = silent? def: prompt(text, def||"")) != undefined && typeof cb == "function" && cb(text); return text }, reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() }, - title: function(text) { return text && (document.title = text), document.title }, jumps: function(url) { location.href = url }, open: function(url) { window.open(url) }, + title: function(text) { return text && (document.title = text), document.title }, + topic: function(can, name) { + can.page.Modify(can, document.body, {className: name}) + can.user.isMobile && can.page.ClassList.add(can, document.body, "mobile") + can.user.isMobile && can.page.ClassList.set(can, document.body, "landscape", can.user.isLandscape) + }, + trans: function(can, text) { if (typeof text == "function") { text = text.name || "" } + return can._trans&&can._trans[text] || can.Conf("trans."+text) || can.Conf("feature.trans."+text) || { + "submit": "提交", "cancel": "取消", + "open": "打开", "close": "关闭", + "begin": "启动", "end": "结束", + }[text] || text + }, + toast: function(can, content, title, duration, progress) { + var meta = typeof content == "object"? content: {content: content, title: title||can._help, duration: duration, progress: progress} + var width = meta.width||400, height = meta.height||100; if (width < 0) { width = window.innerWidth + width } + + var ui = can.page.Append(can, document.body, [{view: "toast", style: { + left: (window.innerWidth-width)/2, width: width, bottom: 100, + }, list: [ + {text: [meta.title||"", "div", "title"], title: "点击复制", onclick: function(event) { + can.user.copy(event, can, meta.title) + }}, + {view: "duration", title: "点击关闭", onclick: function() { action.close() }}, + typeof meta.content == "object"? meta.content: {text: [meta.content||"执行成功", "div", "content"]}, + + {view: "action"}, meta.progress != undefined && {view: "progress", style: {width: width}, list: [ + {view: "current", style: {width: (meta.progress||0)/100*width}}, + ]}, + ] }]) + + var action = can.onappend._action(can, meta.action||["close"], ui.action, { + close: function(event) { can.page.Remove(can, action._target), action.timer.stop = true }, + timer: can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) { + if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." } + }, function() { action.close() }), _target: ui._target, ui: ui, + }); can.onmotion.story(can, ui._target) + + can.search(can.request({}, { + title: meta.title, content: meta.content, + time: can.base.Time(), fileline: can.misc.FileLine(2, 2), + })._event, ["Footer.onimport.toast"]) + return action + }, + share: function(can, msg, cmd) { + can.run(msg._event, cmd||["action", "share"], function(msg) { + can.user.toast(can, {height: 300, width: 500, + title: msg.Append("name"), duration: -1, + content: msg.Append("text"), button: ["close"], + }) + }) + }, + login: function(can, cb) { + var ui = can.user.input({}, can, [ + {username: "username"}, {password: "password"}, + ], function(event, button, data, list) { return { + "登录": function() { + can.run({}, ["action", "login", data["username"], data["password"]], function(msg) { + if (msg.Option("user.name")) { + can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb() + } else { + can.user.toast(can, "用户名或密码错误") + } + }) + return true + }, + "扫码": function() { + can.misc.WSS(can, {type: "chrome"}, function(event, msg, cmd, arg) { if (!msg) { return } + if (cmd == "pwd") { + return can.user.toast(can, arg[2], arg[1], -1), msg.Reply() + } + + if (cmd == "sessid") { + return can.user.Cookie(can, "sessid", arg[0]), msg.Reply(), can.user.reload(true) + } + + can.search(event, msg["detail"]||[], function(msg) { msg.Reply() }) + }) + }, + }[button]() }, ["登录", "扫码"]) + + can.page.Modify(can, ui._target, {className: "input login", style: {left: (window.innerWidth-ui._target.offsetWidth)/2, top: window.innerHeight/6}}) + }, + logout: function(can, force) { if (force||can.user.confirm("logout?")) { + can.run({}, ["action", "logout"], function(msg) { can.user.Cookie(can, "sessid", "") + can.user.Search(can, "share")? can.user.Search(can, "share", ""): can.user.reload(true) + }) + } }, + camera: function(can, msg, cb) { + navigator.getUserMedia({video: true}, cb, function(error) { + can.misc.Log(error) + }) + }, + copy: function(event, can, text) { if (navigator.clipboard) { var ok = false navigator.clipboard.writeText(text).then(() => { ok = true }) @@ -43,179 +136,64 @@ Volcanos("user", {help: "用户模块", agent: { can.page.Remove(can, input), can.user.toast(can, text, "复制成功") event.stopPropagation(), event.preventDefault() }, - - camera: function(can, msg, cb) { - navigator.getUserMedia({video: true}, cb, function(error) { - can.base.Log(error) - }) - }, - trans: function(can, text) { - if (typeof text == "function") { text = text.name || "" } - return can._trans && can._trans[text] || can.Conf("trans."+text) || can.Conf("feature.trans."+text) || { - "submit": "提交", "cancel": "取消", - "begin": "启动", "end": "结束", - "close": "关闭", - }[text] || text - }, - topic: function(can, name) { - can.page.Modify(can, document.body, {className: name}) - var width = window.innerWidth, height = window.innerHeight - can.user.isMobile && can.page.ClassList.add(can, document.body, "mobile") - can.user.isMobile && can.page.ClassList.set(can, document.body, "landscape", width > height) - }, - toast: function(can, content, title, duration, progress) { - var meta = typeof content == "object"? content: {content: content, title: title||can._help, duration: duration, progress: progress} - var width = meta.width||400, height = meta.height||100; if (width < 0) { width = window.innerWidth + width } - - var ui = can.page.Append(can, document.body, [{view: "toast", style: { - width: width, bottom: 100, left: (window.innerWidth-width)/2, - }, list: [ - {text: [meta.title||"", "div", "title"]}, - typeof meta.content == "object"? meta.content: {text: [meta.content||"执行成功", "div", "content"]}, - {view: "button"}, - {view: "duration"}, meta.progress != undefined && {view: "progress", style: {width: width}, list: [ - {view: "current", style: {width: (meta.progress||0)/100*width}}, - ]}, - ] }]); can.onmotion.story(can, ui.first) - - ui.Close = function() { can.page.Remove(can, ui.first), timer.stop = true } - var timer = can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) { - if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." } - }, ui.Close) - - can.onappend._action(can, meta.button||[], ui.button, { - close: function(event) { ui.Close() }, - }) - - can.search && can.search(can.request({}, { - title: meta.title, content: meta.content, - time: can.base.Time(), fileline: can.base.FileLine(2, 2), - })._event, ["Footer.onimport.toast"], null, true) - return ui - }, - share: function(can, msg, cmd) { - can.run(msg._event, cmd||["action", "share"], function(msg) { - var ui = can.user.toast(can, { - title: msg.Append("name"), content: msg.Append("text"), - button: ["close"], duration: 100000, - height: 300, - }) - }) - }, - login: function(can, cb) { - var ui = can.user.input({clientX: 100, clientY: 100}, can, [ - {username: "username", name: "用户"}, - {password: "password", name: "密码"}, - {button: ["登录", "扫码", "注册"]}, - ], function(event, button, data, list) { - switch (button) { - case "登录": can.user.Cookie(can, "sessid", "") - can.run({}, ["login", ui["用户"].value, ui["密码"].value], function(msg) { - if (can.user.Cookie(can, "sessid")||msg.Option("user.name")||msg.Result()) { - can.page.Remove(can, ui.first); return typeof cb == "function" && cb() - } - can.user.alert("用户或密码错误") - }) - break - case "扫码": - can.misc.WSS(can, {type: "chrome"}, function(event, msg, cmd, arg) { if (!msg) { return } - if (cmd == "pwd") { - can.user.toast(can, arg[2], arg[1], 1000000) - msg.Reply() - return - } - if (cmd == "sessid") { - can.user.Cookie(can, "sessid", arg[0]) - can.user.reload(true) - return - } - can.search(event, msg["detail"]||[], function(msg) { - msg.Reply() - }) - }) - - return true - break - case "注册": - - break - } - }) - - can.page.Modify(can, ui.first, {style: {left: (window.innerWidth-ui.first.offsetWidth)/2}}) - }, carte: function(event, can, meta, list, cb) { meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return } cb = cb||function(ev, item, meta) { var cb = meta[item]; can.base.isFunc(cb) && cb(event, can, item) } var ui = can.page.Append(can, document.body, [{view: "carte", style: {left: 0, top: 0}, onmouseleave: function(event) { - can.page.Remove(can, ui.first) + can.page.Remove(can, ui._target) }, list: can.core.List(list, function(item) { return {view: "item", list: [{text: can.user.trans(can, item), click: function(event) { - can.user.isMobile && can.page.Remove(can, ui.first) + can.user.isMobile && can.page.Remove(can, ui._target) can.base.isFunc(cb) && cb(event, item, meta) } }] } - }) }] ) + }) }] ); can.onlayout.figure(event, can, ui._target) - var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight - if (left+ui.first.offsetWidth>window.innerWidth) { left = window.innerWidth - ui.first.offsetWidth } - can.page.Modify(can, ui.first, {style: {left: left, top: top}}) - - Volcanos.meta.data.menu && can.page.Remove(can, Volcanos.meta.data.menu.first) - return event.stopPropagation(), event.preventDefault(), Volcanos.meta.data.menu = ui + Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) + return event.stopPropagation(), event.preventDefault(), Volcanos.meta.float.carte = ui, {_target: ui._target} }, - input: function(event, can, form, cb) { // form [ string, array, object, {_input: }, {button: []} ] + input: function(event, can, form, cb, button) { // form [ string, array, object, {_input: "select", values: []} var msg = can.request(event, can.Option()) - var x = event.clientX||can.user.isMobile? 20: 200, y = event.clientY+10||48 - - var button; var ui = can.page.Append(can, document.body, [{view: ["input inputs", "fieldset"], style: {left: x, top: y}, list: [ + var ui = can.page.Append(can, document.body, [{view: ["input"], style: {left: 0, top: 0}, list: [ {view: ["option", "table"], list: can.core.List(form, function(item) { - if (item.button) { button = item.button; return } + item._input == "select" && (item = {select: [[item.name].concat(item.values)], data: item, name: item.name}) + item = typeof item == "string"? {input: item, name: item}: item.length > 0? {select: [item], name: item[0]}: item + item.type = item.type||"input", item.type == "input" && (item.data=item.data||{}, item.data.type = item.data.type||"text") - function _init(target) { + item._init = item._init||function(target) { item.run = function(event, cmds, cb) { var msg = can.request(event, function() { var value = {_handle: "true"} can.page.Select(can, ui.table, "textarea,input,select", function(item) { item.name && item.value && (value[item.name] = item.value) }); return value - }) - can.run(event, cmds, cb, true) + }); can.run(event, cmds, cb, true) } can.onappend.figure(can, item, item.value, target) target.value = target.value || msg.Option(item.name) } - item = typeof item == "string"? {_input: "text", name: item}: - item.length > 0? {_input: "select", name: item[0], values: item.slice(1)}: item - item._input = item.type||item._input||"text" - - return {type: "tr", list: [{type: "td", list: [{text: item.name||""}]}, {type: "td", list: [ - item._input == "textarea"? /* textarea */ {type: "textarea", data: item, _init: _init}: - item._input == "select"? /* select */ {select: [[item.name].concat(item.values)], data: item}: - item._input? /* input */ {type: "input", data: (item.type = item._input, item), _init: _init}: - /* other */ item, - ]} ]} + return {type: "tr", list: [{type: "td", list: [{text: item.name||""}]}, {type: "td", list: [item]} ]} })}, {view: "action"}, - ]}]) + ]}]); can.onlayout.figure(event, can, ui._target) - function cbs(event, button) { var data = {}, args = [], list = [] - list = can.page.Select(can, ui.table, "textarea,input,select", function(item) { - return args.push(item.name, item.value), data[item.name] = item.value - }) - typeof cb == "function" && !cb(event, button, data, list, args) && can.page.Remove(can, ui.first) - } - can.onappend._action(can, button||["submit", "cancel"], ui.action, { - cancel: function(event) { can.page.Remove(can, ui.first) }, - _engine: function(event, can, key) { cbs(event, key) }, - submit: function(event) { cbs(event, "submit") }, + var action = can.onappend._action(can, button||["submit", "cancel"], ui.action, { + cancel: function(event) { can.page.Remove(can, ui._target) }, + _engine: function(event, can, button) { action.submit(event, can, button) }, + submit: function(event, can, button) { var data = {}, args = [], list = [] + list = can.page.Select(can, ui.table, "textarea,input,select", function(item) { + return args.push(item.name, item.value), data[item.name] = item.value + }) + can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel() + }, _target: ui._target, }) - can.onlayout.figure(event, can, ui.first), can.page.Select(can, ui.table, "textarea,input", function(item, index) { - index == 0 && can.core.Timer(100, function() { item.focus(), item.setSelectionRange(0, -1) }) + can.page.Select(can, ui._target, "input", function(item, index) { + index == 0 && can.onmotion.focus(can, item) }) - return ui + + return action }, select: function(event, can, type, fields, cb, cbs) { var msg = can.request(event, {fields: fields||"type,name,text"}) @@ -226,69 +204,49 @@ Volcanos("user", {help: "用户模块", agent: { }) }, upload: function(event, can) { var begin = new Date() - var x = event.clientX, y = event.clientY; y += 10; if (x > 400) { x -= 200 } - if (can.user.isMobile) { x = 100, y = 100 } - var ui = can.page.Append(can, document.body, [{view: "upload", style: {left: x, top: y}, list: [ - {view: "action"}, {view: "output"}, - ]}]) + var ui = can.page.Append(can, document.body, [{view: "upload", style: {left: 0, top: 0}, list: [ + {view: "action"}, {view: "output", list: [{view: "progress"}]}, + {view: "status", list: [{view: "show"}, {view: "cost"}, {view: "size"}]}, + ]}]); can.onlayout.figure(event, can, ui._target) - function show(event, value, total, loaded) { - var now = new Date(); can.page.Appends(can, ui.output, [ - {view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{ - view: ["progress"], style: {height: "10px", width: value + "%", background: "red"}, - }]}, - {text: [value+"%", "div"], style: {"float": "right"}}, - {text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}}, - {text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}}, - ]) - } + var action = can.onappend._action(can, [ + {type: "upload", onchange: function(event) { + action.show(event, 0, event.target.files[0].size, 0) + }}, "close", + ], ui.action, { + close: function(event) { can.page.Remove(can, ui._target) }, + begin: function(event) { begin = new Date() + var upload = can.page.Select(can, ui.action, "input[type=file]") + if (upload[0].files.length == 0) { return upload[0].focus() } - var action = can.page.AppendAction(can, ui.action, [ - {type: "input", data: {name: "upload", type: "file", onchange: function(event) { - var file = action.upload.files[0] - show(event, 0, file.size, 0) - }}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) { - if (value == "关闭") { return can.page.Remove(can, ui.first) } - if (action.upload.files.length == 0) {return action.upload.focus()} + var msg = can.request(event, can.Option(), {_handle: "true"}) + msg._upload = upload[0].files[0], msg._progress = action.show - var msg = can.request(event, can.Option(), {_upload: "file", _handle: "true"}) - - // 上传文件 - begin = new Date() - msg._progress = show - msg.upload = action.upload.files[0] can.run(event, ["action", "upload"], function(msg) { can.user.toast(can, "上传成功"), can.run() }, true) - }) - action.upload.click() - return ui + }, + show: function (event, value, total, loaded) { now = new Date() + value == 0 && action.begin(event) + + ui.show.innerHTML = value+"%" + ui.cost.innerHTML = can.base.Duration(now - begin) + ui.size.innerHTML = can.base.Size(loaded)+"/"+can.base.Size(total) + can.page.Modify(can, ui.progress, {style: {width: value*(ui.output.offsetWidth-2)/100}}) + }, + }); can.page.Select(can, ui.action, "input[type=file]")[0].click() + + return action }, download: function(can, path, name) { var a = can.page.Append(can, document.body, [{type: "a", href: path, download: name||path.split("/").pop()}]).first a.click(), can.page.Remove(can, a) }, - logout: function(can) { - if (can.user.confirm("logout?")) { - can.run({}, ["action", "logout"], function(msg) { - can.user.Cookie(can, "sessid", "") + downloads: function(can, text, name) { can.user.download(can, URL.createObjectURL(new Blob([text])), name) }, - if (can.user.Search(can, "share")) { - can.user.Search(can, "share", "") - } else { - can.user.reload(true) - } - }) - } - }, - - MergeURL: shy("地址链接", function(can, objs, clear) { var obj = objs || {}; var path = location.pathname; - obj._path && (path = obj._path, delete(obj._path)) - !clear && can.core.Item(can.user.Search(), function(key, value) {obj[key] || (obj[key] = value)}); - return can.core.List([location.origin+path, can.core.Item(obj, function(key, value) { - if (!value) { return } - return can.core.List(value, function(value) {return key+"="+encodeURIComponent(value)}).join("&") - }).join("&")], function(item) { return item? item: undefined }).join("?") + MergeURL: shy("地址链接", function(can, objs, clear) { + var path = location.pathname; objs._path && (path = objs._path, delete(objs._path)) + return can.base.MergeURL(location.origin+path+(clear?"":location.search), objs) }), Search: shy("请求参数", function(can, key, value) { var args = {} location.search && location.search.slice(1).split("&").forEach(function(item) { var x = item.split("=") diff --git a/page/index.css b/page/index.css index 59ddc4e9..614b55ff 100644 --- a/page/index.css +++ b/page/index.css @@ -1,4 +1,5 @@ a { + color:yellow; } body.mobile.landscape fieldset.Header.head { @@ -62,6 +63,9 @@ body.mobile select { body.mobile div.carte { font-size:24px; } +body.mobile div.input.login input { + font-size:24px +} body { margin:0; padding:0; @@ -105,24 +109,26 @@ input[type=text] { input[type=text]:hover { background-color:white; } +input[type=button] { + background-color:black; color:cyan; + letter-spacing:4px; + padding-left:10px; + cursor:pointer; +} +input[type=button]:hover { + background-color:gray; color:cyan; +} td>input[type=button][name=remove] { background-color:red; } td>input[type=button][name=create] { background-color:blue; } -input[type=button] { - background-color:black; color:cyan; - letter-spacing:4px; - padding-left:10px; -} -input[type=button]:hover { - background-color:gray; color:cyan; -} select { box-shadow: 4px 4px 10px 1px #626bd0; background-color:black; color:cyan; padding:0 10px; + cursor:pointer; } option { font-family:monospace; @@ -147,7 +153,7 @@ table.content { /* width:-webkit-fill-available; */ border:0; white-space:pre; font-size:14px; font-family:monospace; - cursor:pointer; overflow: auto; + overflow: auto; } table.content tr { background-color:#04272f45; @@ -185,6 +191,13 @@ table.content td:hover { h1 { margin:0; + clear:both; +} +h2 { + clear:both; +} +h2 { + clear:both; } h1:hover { background:green; @@ -198,6 +211,9 @@ h3:hover { background:green; cursor:pointer; } +div.item { + cursor:pointer; +} div.code { background-color:#343a3445; color:white; font-size:14px; font-family:monospace; @@ -216,33 +232,37 @@ div.hidden { div.toast { background:#0e3369b3; color:yellow; - position:fixed; - overflow:auto; - padding:5px; - z-index:100; + position:fixed; z-index:100; + padding:5px; overflow:auto; } div.toast a { color:yellow; } div.toast div.title { - font-size:14px; - color:#cae850; + color:#cae850; font-size:14px; + cursor:copy; + float:left; +} +div.toast div.duration { + color:gray; font-size:14px; + float:right; + cursor:pointer; } div.toast div.content { text-align:center; white-space:pre; + clear:both; } -div.toast div.duration { - font-size:14px; - color:gray; +div.toast div.action div.item { + float:left; } div.toast div.progress { - border:solid 2px green; - height:10px; + height:10px; border:solid 2px green; + margin-left:-2px; + clear:both; } div.toast div.progress div.current { - background:red; - height:10px; + height:10px; background:red; } div.carte { @@ -255,11 +275,24 @@ div.carte { } div.carte div.item { padding:3px 12px; - cursor:pointer; } div.carte div.item:hover { background:red; } +div.input { + position:fixed; + background-color:#0d4142a6; + z-index:50; +} +div.input div.item { + float:left; +} +div.input.login { + padding:10px; +} +div.input.login input { + font-size:18px +} div.upload { background:black; color:yellow; @@ -270,6 +303,26 @@ div.upload { div.upload div.item { float:left; } +div.upload div.output { + border:solid 1px red; + clear:both; +} +div.upload div.progress { + width:0; height:10px; + background:red; +} +div.upload div.status div.cost { + float:left; +} +div.upload div.status div.show { + float:right; +} +div.upload div.status div.size { + text-align:center; +} +div.upload input[type=file] { + width: 240px; +} div.story[data-type=spark] { background-color:#2169a9a6; color:white; @@ -388,6 +441,9 @@ fieldset>div.output div.project div.list { margin-left:10px; } +body>fieldset.input table { + color:white; +} body>fieldset.input td { word-break:keep-all; } diff --git a/panel/Action.css b/panel/Action.css index 99e00bab..97a7b20a 100644 --- a/panel/Action.css +++ b/panel/Action.css @@ -19,7 +19,6 @@ fieldset.Action>div.action div.item { fieldset.Action>div.action div.item:hover { border-bottom:solid 2px red; background-color:#2e515f; - cursor:pointer; } fieldset.Action>div.action div.item.select { border-bottom:solid 2px red; diff --git a/panel/Action.js b/panel/Action.js index f2f4815a..8b441124 100644 --- a/panel/Action.js +++ b/panel/Action.js @@ -15,12 +15,17 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) }, function() { can.onaction._layout(can, can.Conf(can._LAYOUT)||can.user.Search(can, can._LAYOUT)) }) + + can.page.Modify(can, can._output, {onmouseover: function(event) { + Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) + // Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target) + }}) }, _plugin: function(can, river, storm, sub, item) { sub.run = function(event, cmds, cb) { var msg = sub.request(event) var toast = msg.Option("_toast") && can.user.toast(can, msg.Option("_toast"), "", 1000000) return can.run(event, (can.onengine[cmds[0]]? []: [river, storm, item.id||item.index||item.key+"."+item.name]).concat(cmds), function(msg) { - toast && toast.Close(), can.base.isFunc(cb) && cb(msg) + toast && toast.close(), can.base.isFunc(cb) && cb(msg) }) }, can._plugins = (can._plugins||[]).concat([sub]) @@ -66,7 +71,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], if (!storm || cmds.length != 2) { return false } if (storm.index) { cmds = [can._ACTION, "command"].concat(storm.index) - can.misc.Runs(event, can, {names: can._name}, cmds, cb) + can.run(event, cmds, cb) } else { can.core.List(storm.action, function(value) { msg.Push("name", value.name||"") diff --git a/panel/Header.js b/panel/Header.js index 2338a65e..61865ba1 100644 --- a/panel/Header.js +++ b/panel/Header.js @@ -32,6 +32,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport._menu(can, msg, target) can.base.isFunc(cb) && cb(msg) + + can.page.Modify(can, can._output, {onmouseover: function(event) { + Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) + Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target) + }}) }, _title: function(can, msg, target) { can.user.title(can.user.Search(can, can._TITLE)||can.user.Search(can, "pod")) @@ -122,7 +127,12 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _time: function(can, target) { can.core.Timer({interval: 1000}, function() { can.onimport.time(can, target) }) - can.onappend.figure(can, {style: {left: "", right: "0", top: can._target.offsetHeight, "min-width": 310}}, "@date", target) + can.onappend.figure(can, {style: {"min-width": 306}}, "@date", target) + target.onmouseenter = function(event) { target.click() + can.core.Timer(10, function() { + can.onlayout.figure(event, can, Volcanos.meta.float.input._target) + }) + } }, time: function(can, target) { can.onlayout.topic(can) target.innerHTML = can.base.Time(null, "%w %H:%M:%S") @@ -201,7 +211,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }) can.user.jumps(can.user.MergeURL(can, args, true)) }, - carte: function(event, can, list, cb) { can.user.carte(event, can, can.onaction, list) }, + carte: function(event, can, list, cb) { can.user.carte(event, can, can.onaction, list, cb) }, river: function(event, can) { can.onaction.River(can) }, black: function(event, can, button) { can.onlayout.topic(can, button) @@ -239,7 +249,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, var toast = can.user.toast(can, "打包中...", "webpack", 1000000) can.run(event, ["webpack"], function(msg) { - toast.Close(), can.user.toast(can, "打包成功", "webpack") + toast.close(), can.user.toast(can, "打包成功", "webpack") can.user.download(can, "/share/local/"+msg.Result(), name+".html") }) }) @@ -255,7 +265,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, can.user.share(can, can.request(event), [can._ACTION, can._SHARE].concat(arg)) }, usernick: function(event, can) { - can.user.input(event, can, [{_input: "text", name: "usernick", value: can.Conf(can._USERNAME)}], function(ev, button, data, list, args) { + can.user.input(event, can, [{name: "usernick", value: can.Conf(can._USERNAME)}], function(ev, button, data, list, args) { can.run(event, ["usernick", list[0]], function(msg) { can.page.Select(can, can._output, "div.username", function(item) { can.page.Modify(can, item, can.Conf(can._USERNAME, list[0])) diff --git a/panel/River.css b/panel/River.css index dc618e97..ac65b994 100644 --- a/panel/River.css +++ b/panel/River.css @@ -4,7 +4,6 @@ fieldset.River { fieldset.River>div.output div.item { border-left:solid 3px #00ffae; padding:3px 16px; - cursor:pointer; } fieldset.River>div.output div.item:hover { background-color:#2e515f; diff --git a/panel/River.js b/panel/River.js index aa4af95c..051db9db 100644 --- a/panel/River.js +++ b/panel/River.js @@ -9,7 +9,14 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, var select; msg.Table(function(value, index, array) { var item = can.onimport._river(can, value) if (index == 0 || [value.hash, value.name].indexOf(can._main_river) > -1) { select = item } - }), select && select.click() + }) + + select && select.click() + + can.page.Modify(can, can._output, {onmouseover: function(event) { + Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) + Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target) + }}) }, _main: function(can, msg) { can._main_river = "project", can._main_storm = "studio" @@ -41,18 +48,37 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onaction.storm(event, can, meta.hash) }, function(event) { // 右键菜单 - can.onaction.carte(event, can, can.ondetail.list, function(ev, button, module) { + can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) { module[button](event, can, button, meta.hash) }) }) !can.user.isMobile && can.page.Modify(can, item, {onmouseenter: function(event) { - can.onaction.carte(event, can, can.ondetail.list, function(ev, button, module) { + can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) { module[button](event, can, item, meta.hash) }) }}) return item }, + _storm: function(can, meta, river) { + return {text: [meta.name, "div", "item"], onclick: function(event) { + // 左键点击 + can.onaction.action(event, can, river, meta.hash) + can.user.title(can._main_title || meta.name) + }, onmouseenter: function(event) { + can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) { + module[button](event, can, button, river, meta.hash) + }) + }, oncontextmenu: function(event) { + can.onaction.action(event, can, river, meta.hash) + can.user.title(can._main_title || meta.name) + + // 右键点击 + can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) { + module[button](event, can, button, river, meta.hash) + }) + }} + }, height: function(can, height) { can.page.Modify(can, can._target, {style: { @@ -86,29 +112,16 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, can.onengine.listen(can, "action.touch", function() { can.user.isMobile && can.onmotion.hidden(can) - Volcanos.meta.data.menu && can.page.Remove(can, Volcanos.meta.data.menu.first) + Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target) }) }, storm: function(event, can, river) { - var list = can.sublist[river]; if (list) { return can.page.Toggle(can, list) } + var list = can.sublist[river]; if (list) { return can.onmotion.Toggle(can, list) } can.run({}, [river, "tool"], function(msg) { - var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(storm, index) { - river == can._main_river && storm.hash == can._main_storm && (select = index) - - return {text: [storm.name, "div", "item"], onclick: function(event) { - // 左键点击 - can.onaction.action(event, can, river, storm.hash) - can.user.title(can._main_title || storm.name) - }, oncontextmenu: function(event) { - can.onaction.action(event, can, river, storm.hash) - can.user.title(can._main_title || storm.name) - - // 右键点击 - can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(ev, button, module) { - module[button](event, can, button, river, storm.hash) - }) - }} + var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(meta, index) { + river == can._main_river && meta.hash == can._main_storm && (select = index) + return can.onimport._storm(can, meta, river) }) }]).first, list.children.length > 0 && list.children[select].click() event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) @@ -127,8 +140,8 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, create: function(event, can) { can.user.input(event, can, [ ["类型", "public", "protected", "private"], - {_input: "text", name: "群名", value: "hi"}, - {_input: "text", name: "简介", value: "hello"}, + {name: "群名", value: "hi"}, + {name: "简介", value: "hello"}, ], function(event, button, meta, list) { can.run(event, ["action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { can.user.Search(can, {river: msg.Result()}) @@ -136,8 +149,8 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, }) }, carte: function(event, can, list, cb) { - var ui = can.user.carte(event, can, can.ondetail, list, cb) - can.page.Modify(can, ui.first, {style: { + var carte = can.user.carte(event, can, can.ondetail, list, cb) + can.page.Modify(can, carte._target, {style: { left: event.clientX-event.offsetX+event.target.offsetWidth-3, top: event.clientY-event.offsetY, }}) }, @@ -156,7 +169,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "共享群组": function(event, can, button, river) { can.user.input(event, can, [ - {_input: "text", name: "name", value: river}, + {name: "name", value: river}, ], function(event, button, meta, list) { var msg = can.request(event) can.user.share(can, msg, [river, "action", "share", "type", can._RIVER, "name", meta.name]) @@ -179,8 +192,8 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "添加应用": function(event, can, button, river) { can.user.input(event, can, [ ["类型", "public", "protected", "private"], - {_input: "text", name: "名称", value: "hi"}, - {_input: "text", name: "简介", value: "hello"}, + {name: "名称", value: "hi"}, + {name: "简介", value: "hello"}, ], function(event, button, meta, list) { can.run({}, [river, "tool", "action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) { can.user.Search(can, {river: river, storm: msg.Result()}) @@ -203,7 +216,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "共享应用": function(event, can, button, river, storm) { can.user.input(event, can, [ - {_input: "text", name: "name", value: storm}, + {name: "name", value: storm}, ], function(event, button, meta, list) { var msg = can.request(event) can.user.share(can, msg, [river, "action", "share", "type", can._STORM, "name", meta.name, @@ -224,7 +237,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 can.search(event, ["Action.onexport.args"], function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id}) can.run(msg._event, [river, "tool", "action", "modify", "arg", item.dataset.args], function(msg) { - can.user.toast(can, "保存"+(index+1)+"/"+array.length) + can.user.toast(can, (index+1)+"/"+array.length, "保存参数", 10000, (index+1)/array.length) next() }) }) @@ -268,7 +281,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 "共享主机": function(event, can, button, river, storm) { can.run(event, ["action", "invite"], function(msg) { - var toast = can.user.toast(can, { + can.user.toast(can, { title: "共享主机", content: msg.Result(), button: ["close"], duration: -1, width: -100, }) @@ -288,9 +301,9 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 var msg = can.request(event, {action: "start"}) can.run(event, cmds, cb, silent) }}, [ - {_input: "text", name: "name", value: "@key"}, - {_input: "text", name: "repos", value: "@key"}, - {_input: "text", name: "template", value: "@key"}, + {name: "name", value: "@key"}, + {name: "repos", value: "@key"}, + {name: "template", value: "@key"}, ], function(event, button, data, list, args) { can.run(event, ["action", "start"].concat(args), function(msg) { can.user.open(can.user.MergeURL(can, {pod: can.core.Keys(can.user.Search(can, "pod"), msg.Option("name"))})) diff --git a/plugin/input.js b/plugin/input.js index 9c890e28..f66bbdfe 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -13,7 +13,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, } }, - "upload": function(event, can) { can.user.upload(event, can) }, + upload: function(event, can) { can.user.upload(event, can) }, "执行": function(event, can) { can.run(event) }, "刷新": function(event, can) { can.run(event) }, "查看": function(event, can) { can.run(event) }, diff --git a/plugin/input/date.css b/plugin/input/date.css index e4be3dc8..588c4656 100644 --- a/plugin/input/date.css +++ b/plugin/input/date.css @@ -7,3 +7,7 @@ fieldset.input.date div.output td.last { fieldset.input.date div.output td.next { color:gray; } +fieldset.input.date div.output td { + padding:2px 12px; +} + diff --git a/plugin/input/date.js b/plugin/input/date.js index a7fd4896..d4636e4a 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -56,7 +56,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e 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")} - can.onlayout.figure(event, can); return now + return can.onlayout.figure(event, can), now }; show(now) }} }, ["/plugin/input/date.css"]) diff --git a/plugin/local/chat/media.js b/plugin/local/chat/media.js index 93ed06b5..62e486f5 100644 --- a/plugin/local/chat/media.js +++ b/plugin/local/chat/media.js @@ -24,7 +24,7 @@ Volcanos("onaction", {help: "操作数据", list: [], _init: function(can, msg, video.srcObject = stream, video.play() can.ui.video = video }, function(error) { - can.base.Log("open camera", error) + can.misc.Log("open camera", error) }) }, snapshot: function(event, can) { diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 32dc6772..40c57769 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -95,7 +95,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, can.onimport.tabview(can, path, file, "", cb) }, _init: function(item) { can.core.Timer(10, function() { item.click() }) - can.page.EnableDrop(can, can._action, "div.file", item) + can.onmotion.EnableDrop(can, can._action, "div.file", item) }} ]).last }, true) @@ -264,7 +264,7 @@ Volcanos("onaction", {help: "控件交互", list: ["项目"], can.page.Modify(can, can.ui.search, {style: {display: ""}}) value = can.ui.word.value = value || can.ui.word.value || "main" - var msg = can.request(event, {_toast: "搜索中..."}) + can.request(event, {_toast: "搜索中..."}) can.run(event, ["action", "search", can.parse, value, can.Option("path")], function(msg) { can.onmotion.clear(can, can.ui.tags) @@ -304,8 +304,8 @@ Volcanos("onaction", {help: "控件交互", list: ["项目"], favorLine: function(can, value) { can.user.input(event, can, [ - {_input: "text", name: "topic", value: "@key"}, - {_input: "text", name: "name", value: "@key"}, + {name: "topic", value: "@key"}, + {name: "name", value: "@key"}, ], function(event, button, meta, list) { can.run(event, ["action", "favor", "action", "insert", "topic", meta.topic||"some", diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 1e740507..953db26a 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -86,9 +86,8 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" can.ui.current.focus() }, - _remote: function(event, can, key, arg, cb) { - var toast = can.user.toast(can, "执行中...", key, 1000000) - can.run(event, arg||["action", key, can.parse, can.Option("file"), can.Option("path")], cb||function(msg) { toast.Close() + _remote: function(event, can, key, arg, cb) { can.request(event, {_toast: "执行中..."}) + can.run(event, arg||["action", key, can.parse, can.Option("file"), can.Option("path")], cb||function(msg) { can.onappend.table(can, msg, function(value, key, index) { return {text: [value, "td"]} }, can.ui.output) can.onappend.board(can, msg.Result(), can.ui.output) }, true) @@ -273,7 +272,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" can.ui.current.setSelectionRange(can.ui.current.selectionStart, can.ui.current.selectionEnd) }, jk: function(event, can) { - can.page.DelText(can.ui.current, can.ui.current.selectionStart-1, 1) + can.onkeypop.DelText(can.ui.current, can.ui.current.selectionStart-1, 1) can.onkeymap.insert.Escape(event, can) }, }, diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index dac1de4b..39374ab1 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -105,7 +105,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport._figure(event, can, can.point = can.point.concat(point)) }, onmousemove: function(event, can) { var point = can.onimport._point(event, can) - can.page.Prepos(event, event.target) + can.onmotion.Prepos(event, event.target) if (can.Action("go") == "run") { return can.page.Modify(can, event.target, {style: {cursor: ""}}) } if (can.Action("go") == "auto") { can.onaction._auto(can, event.target) } can.onimport._figure(event, can, can.point.concat(point)) @@ -213,8 +213,8 @@ Volcanos("onfigure", {help: "图形绘制", list: [], }, grid: function(event, can, point) { var target = event.target if (target == can.svg) { return } - var p = point[point.length-1], pos = can.page.Prepos(event, target) - target.Val && can.page.Anchor(event, target, pos, p) + var p = point[point.length-1], pos = can.onmotion.Prepos(event, target) + target.Val && can.onmotion.Anchor(event, target, pos, p) return p.target = target, p.anchor = pos, point }, draw: function(event, can, point) { if (point.length < 2) { return } @@ -327,7 +327,7 @@ Volcanos("onaction", {help: "组件菜单", list: [ can.user.toast(can, "保存成功") }, true) }, - "项目": function(event, can) { can.page.Toggle(can, can.ui.project) }, + "项目": function(event, can) { can.onmotion.Toggle(can, can.ui.project) }, "显示": function(event, can) { can.onmotion.show(can, {value: 100, length: 10}, null, can.group) }, "隐藏": function(event, can) { can.onmotion.hide(can, {value: 100, length: 10}, null, can.group) }, "添加": function(event, can) { @@ -359,7 +359,7 @@ Volcanos("onaction", {help: "组件菜单", list: [ _auto: function(can, target) { if (can.point.length > 0) { return } - var pos = can.page.Prepos(event, event.target) + var pos = can.onmotion.Prepos(event, event.target) if (target.tagName == "text") { } else if (target == can.svg) { @@ -406,7 +406,7 @@ Volcanos("onaction", {help: "组件菜单", list: [ return ship.pid && (ship.target = can.page.Select(can, can.svg, "."+ship.pid)[0]) && ship }) } - }), pos: can.page.Prepos(event, target)} + }), pos: can.onmotion.Prepos(event, target)} } return } @@ -415,12 +415,12 @@ Volcanos("onaction", {help: "组件菜单", list: [ } can.core.List(can.current.begin, function(item) { var figure = can.onfigure._get(can, item.target) - can.page.Resizes(event, item.target, item, point[0], point[1], can.current.pos) + can.onmotion.Resizes(event, item.target, item, point[0], point[1], can.current.pos) can.page.Select(can, can.svg, "."+item.target.Value("text"), function(text) { text.Value(figure.text(can, {}, item.target)) }) can.core.List(item.ship, function(ship) { - var p = can.page.Anchor(event, item.target, ship.anchor, {}) + var p = can.onmotion.Anchor(event, item.target, ship.anchor, {}) if (ship.which == 0) { ship.target.Val("x1", p.x) ship.target.Val("y1", p.y) diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 40b7ca8f..d57eff0e 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -5,28 +5,6 @@ fieldset.word>form.option>div.item.text input { fieldset.word a { word-break:break-word; } -fieldset.word h1.story { - clear:both; -} -fieldset.word h2.story { - clear:both; -} -fieldset.word h3.story { - clear:both; -} -fieldset.word h1:hover { - background:green; - cursor:pointer; -} -fieldset.word h2:hover { - background:green; - cursor:pointer; -} -fieldset.word h3:hover { - background:green; - cursor:pointer; -} - fieldset.word ul.story[data-type=premenu] { cursor:pointer; } diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 10fd5cfc..234b950a 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -133,12 +133,12 @@ Volcanos("onaction", {help: "控件交互", list: [], "快闪": function(event, sub) { sub.sup.onaction.flash(sub) }, "网格": function(event, sub) { sub.sup.onaction.grid(sub) }, - "大纲": function(event, sub) { sub.page.Toggle(sub, sub.ui.project) }, + "大纲": function(event, sub) { sub.onmotion.Toggle(sub, sub.ui.project) }, "首页": function(event, sub) { sub.sup.onaction.show(sub, 0) }, "上一页": function(event, sub) { sub.sup.onaction.prev(sub, sub.ui.content) }, "菜单": function(event, sub) { sub.sup.onaction.show(sub, event.target.selectedIndex) }, "下一页": function(event, sub) { sub.sup.onaction.next(sub, sub.ui.content) }, - "隐藏": function(event, sub) { sub.page.Toggle(sub, sub._output) }, + "隐藏": function(event, sub) { sub.onmotion.Toggle(sub, sub._output) }, "结束": function(event, sub) { sub.page.Remove(sub, sub._target) sub.onengine.signal(sub, "keymap.focus", sub.request(event, {cb: null})) }, diff --git a/plugin/state.js b/plugin/state.js index c53e8acd..d5619ccd 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -98,8 +98,8 @@ Volcanos("onaction", {help: "交互操作", list: ["保存参数", "清空参数 res.push(can.core.Item(line, function(key, value) { return value }).join(",")) }) - res.length > 1 && can.user.download(can, URL.createObjectURL(new Blob([res.join("\n")])), meta.name+".csv") - msg.result && can.user.download(can, URL.createObjectURL(new Blob([msg.Result()])), meta.name+".txt") + res.length > 1 && can.user.downloads(can, res.join("\n"), meta.name+".csv") + msg.result && can.user.downloads(can, msg.Result(), meta.name+".txt") }, "清空数据": function(event, can) { can.onmotion.clear(can, can._output) @@ -135,10 +135,10 @@ Volcanos("onaction", {help: "交互操作", list: ["保存参数", "清空参数 can.run(event, can.base.Simple("action", cmd, can.base.parseJSON(text)), function(msg) { can.user.toast(can, text, "添加成功"), can.run() }, true) - }).catch((err) => { can.base.Log(err) }) + }).catch((err) => { can.misc.Log(err) }) return } else { - can.user.input(event, can, [{_input: "textarea"}], function(ev, button, data, list, args) { + can.user.input(event, can, [{type: "textarea"}], function(ev, button, data, list, args) { can.run(event, can.base.Simple("action", cmd, can.base.parseJSON(list[0])), function(msg) { can.user.toast(can, list[0], "添加成功"), can.run() }, true) @@ -157,7 +157,7 @@ Volcanos("onaction", {help: "交互操作", list: ["保存参数", "清空参数 }, openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) }, - "参数": function(event, can) { can.page.Toggle(can, can._action) }, + "参数": function(event, can) { can.onmotion.Toggle(can, can._action) }, "关闭": function(event, can) { can.page.Remove(can, can._target) }, "清空": function(event, can, name) { can.onmotion.clear(can, can._output) }, }) diff --git a/proto.js b/proto.js index 4e4aa840..a88f37d7 100644 --- a/proto.js +++ b/proto.js @@ -11,7 +11,7 @@ function shy(help, meta, list, cb) { cb.list = next("object") || [] return cb }; var _can_name = "" -var Volcanos = shy("火山架", {args: {}, data: {}, pack: {}, libs: [], cache: {}}, [], function(name, can, libs, cb) { +var Volcanos = shy("火山架", {args: {}, pack: {}, libs: [], cache: {}, float: {}}, [], function(name, can, libs, cb) { var meta = arguments.callee.meta, list = arguments.callee.list if (typeof name == "object") { var Config = name; _can_name = "" meta.libs = Config.libs, meta.volcano = Config.volcano @@ -24,7 +24,7 @@ var Volcanos = shy("火山架", {args: {}, data: {}, pack: {}, libs: [], cache: // 根模块 name = Config.name, can = {_follow: Config.name, _target: document.body} libs = Preload.concat(Config.main.list, Config.libs), cb = function(can) { - can.onengine._init(can, can.Conf(Config), Config.panels, function(msg) { can.base.Log(can.user.title(), "run", can) + can.onengine._init(can, can.Conf(Config), Config.panels, function(msg) { can.misc.Log(can.user.title(), "run", can) document.body.onresize = function() { can.onlayout._init(can, can._target) } }, can._target) } @@ -82,7 +82,7 @@ var Volcanos = shy("火山架", {args: {}, data: {}, pack: {}, libs: [], cache: cmd: function(target, field) { return can.search({}, [target+".onaction."+field]) }, - search: function(event, cmds, cb) { can.run(event, ["search"].concat(cmds), cb, true) }, + search: function(event, cmds, cb) { can.run && can.run(event, ["search"].concat(cmds), cb, true) }, Conf: function(key, value) { return can.core.Value(can._conf, key, value) }, _conf: {}, // }; can = can || {}; for (var k in proto) { can.hasOwnProperty(k) || (can[k] = proto[k]) } }; can = can || {}; can.__proto__ = proto