From d221b3cf1bfe2639c27748e9b86c73e8c8108553 Mon Sep 17 00:00:00 2001 From: shaoying Date: Thu, 10 Dec 2020 19:08:44 +0800 Subject: [PATCH] opt volcanos --- chrome/spided.js | 2 +- frame.js | 223 +++++++++++++++++----------- index.css | 254 ++++++++++---------------------- index.js | 4 +- lib/base.js | 72 ++++----- lib/core.js | 62 ++++---- lib/misc.js | 102 +++++++++++-- lib/page.js | 122 +++++---------- lib/user.js | 118 +++++++-------- pane/Action.css | 41 ++++++ pane/Action.js | 11 +- pane/Footer.css | 6 + pane/Footer.js | 1 + pane/Header.css | 13 +- pane/Header.js | 3 +- pane/River.css | 29 ++-- pane/River.js | 8 +- plugin/input.js | 23 +-- plugin/local/code/inner.js | 6 +- plugin/local/code/vimer.js | 2 +- plugin/local/team/plan.js | 4 +- plugin/local/wiki/draw.js | 2 +- plugin/state.js | 62 ++++++-- plugin/story/spide.js | 4 +- plugin/story/trend.js | 4 +- plugin/table.js | 93 ++---------- proto.js | 136 +---------------- trash/frame_old.js | 2 +- trash/pane/Action.js | 4 +- trash/pane/Header.js | 2 +- trash/pane/float/Toast.js | 2 +- trash/plugin/local/wiki/draw.js | 4 +- 32 files changed, 648 insertions(+), 773 deletions(-) diff --git a/chrome/spided.js b/chrome/spided.js index a9925655..c1e61515 100644 --- a/chrome/spided.js +++ b/chrome/spided.js @@ -5,7 +5,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onappend.table(can, msg, can.ui.content, "table") can.onappend.board(can, msg,can.ui.display, "board") var refresh = msg.Option("_refresh") || can.Conf("feature")["_refresh"] - refresh && can.Timer(refresh, function() { + refresh && can.core.Timer(refresh, function() { can.run({}) }) return typeof cb == "function" && cb(msg) diff --git a/frame.js b/frame.js index c034d14d..dc001907 100644 --- a/frame.js +++ b/frame.js @@ -1,31 +1,33 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, list, cb, target) { - can.core.Next(meta.panes, function(item, next) { + can.core.Next(meta.panes, function(item, next) { item.type = "pane" can.onappend._init(can, item, item.list, function(pane) { + pane.onaction && pane.onappend._action(pane, pane._action, item._action||pane.onaction.list) pane.run = function(event, cmds, cb, silent) { var msg = pane.request(event); cmds = cmds || [] return (can.onengine[cmds[0]]||can.onengine[meta.main.engine])(event, can, msg, pane, cmds, function(msg) { - return typeof cb == "function" && cb(msg) + typeof cb == "function" && cb(msg) }) }, can[item.name] = pane, next() }, target) }, function() { - can.onlayout._init(can, meta, list, function() {}, target) - can.onkeypop._init(can) + can.onlayout._init(can, meta, list, function() { + can.onkeypop._init(can) + }, target) - can.onengine._daemon(can, can.user.title()) - can.require(Volcanos.meta.webpack? []: meta.main.list, function(can) { + can.require(meta.main.list, function(can) { var pane = can[meta.main.name], msg = can.request({}) - pane.onaction._init(pane, msg, msg.option||[], function(msg) { - return typeof cb == "function" && cb(msg) + pane.onengine._daemon(pane, pane.user.title()) + pane.onaction._init(pane, msg, [], function(msg) { + typeof cb == "function" && cb(msg) }, pane._target) }) }) }, - _daemon: function(can, name) { return - can.misc.WSS(can, "", {type: "chrome", name: name}, function(event, msg) { + _daemon: function(can, name) { + can.misc.WSS(can, "", {type: "chrome", name: name}, function(event, msg, cmd, arg) { if (msg.Option("_handle")) { return can.user.toast(can, msg.result.join("")) } can.user.toast(can, msg.detail.join(" ")) - switch (msg.detail[0]) { + switch (cmd) { case "pwd": msg.Echo("hello world") break @@ -47,49 +49,30 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, }, remote: function(event, can, msg, pane, cmds, cb) { if (can.onengine.engine(event, can, msg, pane, cmds, cb)) { return } - - if (Volcanos.meta.webpack == true || location.protocol == "file:") { - var res = Volcanos.meta.pack[pane._name+","+cmds.join(",")] - if (res) { res = can.request(event, res) - delete(msg._event), delete(msg._can) - return typeof cb == "function" && cb(res) - } - return typeof cb == "function" && cb(msg) - } - + can.misc.Run(event, can, {names: pane._name}, cmds, cb) pane.run(event, ["search", "Footer.onimport.ncmd"]) - can.misc.Run(event, can, {names: pane._name}, cmds, function(msg) { - delete(msg._event), delete(msg._can) - Volcanos.meta.pack[pane._name+","+cmds.join(",")] = msg - typeof cb == "function" && cb(msg) - delete(msg.sessid) - }) }, - engine: function(event, can, msg, pane, cmds, cb) { if (!can.onengine) { return false } + engine: function(event, can, msg, pane, cmds, cb) { switch (pane._name) { case "River": cmds.length == 0 && can.core.Item(can.onengine.river, function(key, value) { msg.Push("hash", key), msg.Push("name", value.name) - }) - if (cmds.length != 1 && cmds[1] != "tool") { break } - case "Storm": - var river = can.onengine.river[cmds[0]]; if (!river) { break } + }); if (cmds.length != 1 && cmds[1] != "tool") { return false } + + var river = can.onengine.river[cmds[0]]; if (!river) { return false } can.core.Item(river.storm, function(key, value) { msg.Push("hash", key), msg.Push("name", value.name) - }) - typeof cb == "function" && cb(msg) + }), typeof cb == "function" && cb(msg) return true - case "Action": - var river = can.onengine.river[cmds[0]||"main"] - var storm = river && river.storm[cmds[1]] - var action = storm && storm.action && storm.action[cmds[2]] - if (!storm) { break } if (cmds.length == 2) { - if (storm.index) { - if (Volcanos.meta.webpack == true) { typeof cb == "function" && cb(msg); return true } - can.misc.Run(event, can, {names: pane._name}, ["action", "command"].concat(storm.index), cb) - return true - } + case "Action": + var river = can.onengine.river[cmds[0]] + var storm = river && river.storm[cmds[1]] + if (!storm || cmds.length != 2) { break } + + if (storm.index) { + can.misc.Run(event, can, {names: pane._name}, ["action", "command"].concat(storm.index), cb) + } else { can.core.List(storm.action, function(value) { msg.Push("name", value.name||"") msg.Push("help", value.help||"") @@ -97,10 +80,9 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, msg.Push("feature", JSON.stringify(value.feature||{})) msg.Push("index", value.index||"") msg.Push("args", value.args||"[]") - }) - typeof cb == "function" && cb(msg) - return true + }), typeof cb == "function" && cb(msg) } + return true } return false }, @@ -216,58 +198,54 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, }, }) Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list, cb, target, field) { + meta.name = meta.name.split(" ")[0] field = field || can.onappend.field(can, target, meta.type, meta).first var legend = can.page.Select(can, field, "legend")[0] var option = can.page.Select(can, field, "form.option")[0] var action = can.page.Select(can, field, "div.action")[0] var output = can.page.Select(can, field, "div.output")[0] var status = can.page.Select(can, field, "div.status")[0] - meta.id && (option.dataset.id = meta.id) - // 添加插件 var sub = Volcanos(meta.name, { _help: meta.name, _follow: can._follow+"."+meta.name, _legend: legend, _option: option, _action: action, _output: output, _status: status, _target: field, _inputs: {}, _outputs: [], _history: [], Option: function(key, value) { - if (typeof key == "object") { return sub.core.Item(key, sub.Option), key } if (key == undefined) { value = {} sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) { item.name && item.value && (value[item.name] = item.value) - }) - return value + }); return value } - sub.page.Select(sub, option, "input[name="+key+"],"+"select[name="+key+"]", function(item) { + + if (typeof key == "object") { return sub.core.Item(key, sub.Option), key } + sub.page.Select(sub, option, "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]", function(item) { value == undefined? (value = item.value): (item.value = value) - }) - return value + }); return value }, Action: function(key, value) { if (typeof key == "object") { return sub.core.Item(key, sub.Action), key } - sub.page.Select(sub, action, "input[name="+key+"],"+"select[name="+key+"]", function(item) { + sub.page.Select(sub, action, "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]", function(item) { value == undefined? (value = item.value): (item.value = value) - }) - return value + }); return value }, Status: function(key, value) { if (typeof key == "object") { return sub.core.Item(key, sub.Status), key } sub.page.Select(sub, status, "div."+key+">span", function(item) { value == undefined? (value = item.innerHTML): (item.innerHTML = value) - }) - return value + }); return value }, Clone: function() { - meta.args = sub.page.Select(sub, sub._option, "textarea.args,input.args,select.args", function(item) { + meta.args = sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) { return item.name && item.value || "" }) can.onappend._init(can, meta, list, function(sub) { typeof cb == "function" && cb(sub) - sub.Timer(10, function() { + can.core.Timer(10, function() { for (var k in sub._inputs) { sub._inputs[k]._target.focus(); break } }) }, target) }, Pack: function(cmds, slient) { - cmds = cmds && cmds.length > 0? cmds: sub.page.Select(sub, sub._option, "textarea.args,input.args,select.args", function(item) { + cmds = cmds && cmds.length > 0? cmds: sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) { return item.name && item.value || "" }); for (var i = cmds.length-1; i >= 0; i--) { if (!cmds[i]) { cmds.pop() } else { break } @@ -283,30 +261,30 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, typeof cb == "function" && cb(sub) meta.inputs && sub.onappend._option(sub, meta, list, cb) }) - return sub }, - _option: function(can, meta, list, cb) { var index = -1, args = can.base.Obj(meta.arg||meta.args, []) + _option: function(can, meta, list, cb) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []) function add(item, next) { item._input != "button" && index++ - can._inputs[item.name] = Volcanos(item.name, { _help: item.name, _follow: can._follow+"."+item.name, + var input = Volcanos(item.name, { _help: item.name, _follow: can._follow+"."+item.name, _target: can.onappend.input(can, can._option, item.type, item, args[index]), _option: can._option, _action: can._action, _output: can._output, CloneInput: function() { add(item)._target.focus() }, CloneField: function() { can.Clone() }, }, Volcanos.meta.libs.concat([item.display||"/plugin/input.js", Volcanos.meta.volcano]), function(input) { - input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) { + input.Conf(item), input.sup = can + input.run = function(event, cmds, cb, silent) { var msg = can.request(event, can.Conf("option")) return can.onappend._output(can, meta, event, can.Pack(cmds), cb, silent) } input.onaction && input.onaction._init && input.onaction._init(input, item, [], next, input._target) - }) + }); return can._inputs[item.name] = input }; can.core.Next(can.base.Obj(meta.inputs, []), add) }, _action: function(can, action, list) { can.onmotion.clear(can, action), can.core.List(list, function(item) { item === ""? /*空白*/ can.page.Append(can, action, [{view: "item space"}]): typeof item == "string"? /*按键*/ can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) { - var cb = can.onaction[item] || can.onaction["_engine"] || can.onkeymap && can.onkeymap._remote + var cb = can.onaction[item] || can.onaction["_engine"] || can.onkeymap && can.onkeymap._remote cb? cb(event, can, item): can.run(event, ["action", item], function(msg) {}, true) }}): item.length > 0? /*列表*/ can.onappend.input(can, action, "input", {type: "select", name: item[0], values: item.slice(1), title: item[0], onchange: function(event) { var which = item[event.target.selectedIndex+1] @@ -329,16 +307,19 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, typeof cb == "function" && cb(msg) if (silent) { return } + if (can.onimport._process(can, msg)) { return } + var display = meta.feature.display || "table.js" display.indexOf("/") == 0 || (display = "/plugin/"+display) display.endsWith(".js") || (display += ".js") - can._outputs.push(Volcanos(display, { _help: display, _follow: can._follow+"."+display, + var output = Volcanos(display, { _help: display, _follow: can._follow+"."+display, _target: can._output, _fields: can._target, _option: can._option, _action: can._action, _output: can._output, _status: can._status, Option: can.Option, Action: can.Action, Status: can.Status, }, Volcanos.meta.libs.concat([display, Volcanos.meta.volcano]), function(table) { - table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) { + table.Conf(can.Conf()), table.sup = can + table.run = function(event, cmds, cb, silent) { var msg = can.request(event, can.Conf("option")) return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) }, table._msg = msg @@ -348,13 +329,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, table.ondetail && table.onappend._detail(table, table._output, msg._detail||meta._detail||table.ondetail.list) table.onexport && table.onappend._status(table, table._status, msg._export||meta._export||table.onexport.list) }, can._output) - })) + }); can._outputs.push(output) }, silent) }, - _detail: function(can, target, list) { + _detail: function(can, target, list, cb) { list.length > 0 && (target.oncontextmenu = function(event) { can.user.carte(can, can.ondetail||{}, list, function(ev, item, meta) { - (can.ondetail[item] || can.onaction[item])(event, can, item) + (cb||can.ondetail[item]||can.onaction[item])(event, can, item) }) }) }, @@ -390,15 +371,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }) }) }, - menu: function(can, msg, list) { - can.ondetail && can.onappend._detail(can, can._target, list||msg._detail||meta._detail||table.ondetail.list) - }, - field: function(can, target, type, item) { var dataset = {}; item && item.name && (dataset.names = item.name) - item.help = typeof item.help == "string" && item.help.startsWith("[") && (item.help = can.base.Obj(item.help, [""])[0]) || item.help || "" + field: function(can, target, type, item) { return can.page.Append(can, target, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [ - item.pos? undefined: {text: [(item.nick||item.name||"")+"("+(item.help||"")+")", "legend"]}, - {view: ["option", "form"], dataset: dataset, list: []}, - {view: ["action"]}, {view: ["output"]}, {view: ["status"]}, + item.pos? undefined: {text: [(item.nick||item.name||"").split(" ")[0]+"("+(item.help||"").split(" ")[0]+")", "legend"]}, + {view: ["option", "form"]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]}, ]}]) }, input: function(can, option, type, item, value) { @@ -465,7 +441,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.onappend._init(can, value, ["/plugin/state.js"], function(story) { story.page.Remove(story, story._legend) - return typeof cb == "function" && cb(story, value) + typeof cb == "function" && cb(story, value) }, target || can._output) }, true) }, @@ -475,7 +451,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, meta, var width = can._width, height = can._height can.page.Select(can, target, "fieldset.head", function(field) { - height -= field.offsetHeight + height -= field.offsetHeight + 15 }) can.page.Select(can, target, "fieldset.foot", function(field) { height -= field.offsetHeight @@ -520,7 +496,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) { }} })}]) var iu = can.page.Append(can, document.body, [{view: "nice", style: {position: "fixed", top: 40, width: 0, height: 40}}]) - can.Timer({interval: 100}, function() { + can.core.Timer({interval: 100}, function() { can.page.Select(can, ui.high, "div.char", function(item) { item.offsetHeight > -2 && can.page.Modify(can, item, {style: { height: item.offsetHeight-item.offsetHeight/200-1+"px", @@ -534,7 +510,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) { }) var count = 0, add = true - can.Timer({interval: 100}, function() { + can.core.Timer({interval: 100}, function() { if (add) { count++ if (count > 100) { @@ -596,7 +572,76 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) { } document.body.onkeyup = function(event) { } -}, action: null, show: function(event, can) { +}, + oninput: function(event, can, local) {var target = event.target + if (event.ctrlKey) { + if (typeof local == "function" && local(event)) { + event.stopPropagation() + event.preventDefault() + return true + } + + var his = target.History || [] + var pos = target.Current || -1 + switch (event.key) { + case "p": + pos = (pos-1+his.length+1) % (his.length+1) + target.value = pos < his.length? his[pos]: "" + target.Current = pos + break + case "n": + pos = (pos+1) % (his.length+1) + target.value = pos < his.length? his[pos]: "" + target.Current = pos + break + case "a": + case "e": + case "f": + case "b": + break + case "h": + can.page.DelText(target, target.selectionStart-1, target.selectionStart) + break + case "d": + can.page.DelText(target, 0, target.selectionStart) + break + case "k": + can.page.DelText(target, target.selectionStart) + break + case "u": + can.page.DelText(target, 0, target.selectionEnd) + break + case "w": + 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) + break + default: + return false + } + } else { + switch (event.key) { + case " ": + event.stopPropagation() + return true + default: + return false + } + } + + event.stopPropagation() + event.preventDefault() + return true + }, + action: null, show: function(event, can) { var key = event.key, map = { "~": "q", "`": "q", @@ -726,7 +771,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) { time = typeof time == "object"? time: {value: 10, length: time||20} can.page.Modify(can, target, {style: {opacity: 0, display: "block"}}) - can.Timer(time, function(event, value, index) { + can.core.Timer(time, function(event, value, index) { can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) }, cb) }, @@ -734,7 +779,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) { time = typeof time == "object"? time: {value: 10, length: time||20} can.page.Modify(can, target, {style: {opacity: 1}}) - can.Timer(time, function(event, value, index) { + can.core.Timer(time, function(event, value, index) { can.page.Modify(can, target, {style: {opacity: 1-(index+1)/time.length}}) }, cb) }, diff --git a/index.css b/index.css index 832f5cd7..7ce9c0cd 100644 --- a/index.css +++ b/index.css @@ -1,27 +1,19 @@ body { + margin:0; padding:0; background:black; - padding:0; - margin:0; } fieldset { + margin:0; border:0; padding:2px; color:cyan; - padding:2px; - margin:0; border:0; } legend { margin-left:10px; - box-shadow: 4px 4px 20px 4px #626bd0; + box-shadow:4px 4px 20px 4px #626bd0; } legend:hover { cursor:pointer; background:red; } -div.hidden { - display:none; -} -h1 { - margin:0; -} input[type=text] { background-color:cyan; @@ -36,6 +28,58 @@ select { color:cyan; } +table { + border:0; white-space: pre; + font-size:14px; font-family:monospace; + cursor:pointer; overflow: auto; +} +table tr:hover { + background-color:#0fbd45; +} +table tr.select { + background-color:#0fbd45; +} +table tr.over { + background:red; +} +table th { + background-color:#0fbd45; + padding: 0 10px; + cursor:pointer; +} +table td { + overflow:auto; + max-width:1200px; + padding:0 10px; +} +table td.done { + background-color:green; +} +table td:hover { + background-color:red; +} +table td.select { + background-color:red; +} +table td input { + margin-left:4px; +} + +h1 { + margin:0; +} +div.code { + box-shadow: 4px 4px 20px 4px #626bd0; + font-size:14px; font-family:monospace; + color:white; background-color:#343a34f2; + padding:10px; border:solid 3px green; + text-align:left; white-space:pre; + overflow:auto; +} +div.hidden { + display:none; +} + fieldset>form.option { padding:0 5px; } @@ -82,9 +126,6 @@ fieldset>form.option>div.item.textarea { clear:both; } -fieldset>div.action { - /* clear:none; */ -} fieldset>div.action>div.item { float:left; margin:2px 0; @@ -134,52 +175,19 @@ fieldset>div.output>pre.display:hover { /* max-height:640px; */ } -table { - border:0; white-space: pre; - font-size:14px; font-family:monospace; - /* box-shadow: 4px 4px 10px 1px #626bd0; */ - cursor:pointer; overflow: auto; +fieldset.input { + background-color:black; + position:fixed; + left:0; top:0; } -table tr:hover { - background-color:#0fbd45; +fieldset.input { + z-index:99; } -table tr.select { - background-color:#0fbd45; +fieldset.input.date { + z-index:101; } -table tr.over { - background:red; -} -table th { - background-color:#0fbd45; - padding: 0 10px; - cursor:pointer; -} -table td { - overflow:auto; - max-width:1200px; - padding:0 10px; -} -table td.done { - background-color:green; -} -table td:hover { - background-color:red; -} -table td.select { - background-color:red; -} -table td input { - margin-left:4px; -} - -div.code { - box-shadow: 4px 4px 20px 4px #626bd0; - font-size:14px; font-family:monospace; - color:white; background-color:#343a34f2; - padding:10px; border:solid 3px green; - text-align:left; white-space:pre; - overflow:auto; - /* max-height:640px; */ +fieldset.input.key { + z-index:101; } div.toast { @@ -239,21 +247,6 @@ div.upload div.item { float:left; } -fieldset.input { - background-color:black; - position:fixed; - left:0; top:0; -} -fieldset.input { - z-index:99; -} -fieldset.input.date { - z-index:101; -} -fieldset.input.key { - z-index:101; -} - body.white { margin:0; padding:0; background-color:#0dabda; @@ -275,15 +268,6 @@ body.white input[type=button] { background-color:#FF9900; color:white; } -body.white table input[type=button][value=结束] { - background:red; -} -body.white table input[type=button][value=停止] { - background:red; -} -body.white table input[type=button][value=启动] { - background:#52ce78; -} body.white input[type=button]:hover { border-radius:10px 10px 10px 10px; border:2px solid #FFCC33; @@ -299,6 +283,15 @@ body.white select { } body.white select:hover { } +body.white table input[type=button][value=结束] { + background:red; +} +body.white table input[type=button][value=停止] { + background:red; +} +body.white table input[type=button][value=启动] { + background:#52ce78; +} body.white fieldset { /* color:black; */ @@ -312,100 +305,6 @@ body.white fieldset.plugin { background-color:white; color:black; } -body.white fieldset.editor { - background:#0b2c54ab; - color:white; -} -body.white fieldset.Header { - border:solid 2px #1f2224; - background-color:#2f3638; - color:white; -} -body.white fieldset.Header input[type=text] { - border:2px solid #c4c7ce; - border-radius:10px 10px 10px 10px; - background-color:white; - color:white; -} -body.white fieldset.Footer { - border:solid 2px #1f2224; - background-color:#1f2224; - color:white; -} -body.white fieldset.River { - border:solid 2px #1f2224; - background-color:#1f2224; - color:white; -} -body.white fieldset.River>div.output div.item:hover { - background-color:black; - border:solid 2px black; -} -body.white fieldset.River>div.output div.item.select { - background-color:black; - border:solid 2px black; -} -body.white fieldset.River>div.output div.subitem:hover { - background-color:black; - border:solid 2px black; -} -body.white fieldset.River>div.output div.subitem.select { - background-color:black; - border:solid 2px black; -} -body.white fieldset.Storm { - border:solid 10px #1f2224; - background-color:#1f2224; - color:white; -} -body.white fieldset.Storm>div.output>div.item:hover { - background-color:black; - border:solid 2px black; -} -body.white fieldset.Storm>div.output>div.item.select { - background-color:black; - border:solid 2px black; -} -body.white fieldset.Action { - background-color:#0dabda; - border-top:0; -} -body.white fieldset.Action fieldset.plugin { - color:black; background-color:white; - border:0; border-top:solid 2px #CCCCFF; - box-shadow: 4px 4px 10px 4px #626bd0; - margin:8px 8px; -} -body.white fieldset.Action fieldset.plugin:hover { - border-top:solid 2px #6666FF; -} -body.white fieldset.Action fieldset.plugin legend { - font-size:16px; font-family:monospace; - color:white; background-color:#339999; - padding:2px 20px; border:2px solid #99CCFF; - border-radius:10px 10px 10px 10px; -} -body.white fieldset.Action fieldset.plugin legend:hover { - background-color:#6ee4e4; -} -body.white fieldset.Action fieldset.plugin div.output{ - color:black; - padding:10px; -} -body.white fieldset.Action fieldset.plugin div.item input[type=button] { - letter-spacing:4px; -} -body.white fieldset.Action fieldset.plugin div.item input { - box-shadow: 4px 4px 10px 1px #626bd0; -} -body.white fieldset.Action fieldset.plugin div.item input[name=cmd] { - width:160px; -} -body.white fieldset.Action fieldset.plugin div.item select { - box-shadow: 4px 4px 10px 1px #626bd0; - margin-top:-2px; -} - body.white fieldset.plugin table { color:black; background-color:white; } @@ -428,6 +327,10 @@ body.white fieldset.plugin table td { body.white fieldset.plugin table td:hover { background-color:#98ecd4; } +body.white fieldset.editor { + background:#0b2c54ab; + color:white; +} fieldset.command>form.option>div.item input.args { width:300px; @@ -435,7 +338,6 @@ fieldset.command>form.option>div.item input.args { fieldset.command>form.option>div.item textarea { height:160px; } - fieldset.max>form.option>div.item textarea.args { background-color:cyan; width:500px; diff --git a/index.js b/index.js index cc72886c..43bb354b 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ _can_name = "" -Volcanos({name: "chat", volcano: "/frame.js", iceberg: "/chat/", +Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js", libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panes: [ {name: "Header", help: "标题栏", pos: "head", state: ["time", "username"]}, {name: "Search", help: "搜索框", pos: "float"}, @@ -8,8 +8,8 @@ Volcanos({name: "chat", volcano: "/frame.js", iceberg: "/chat/", {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, ], main: {name: "Header", engine: "remote", list: ["publish/order.js"]}, plugin: [ "/plugin/state.js", - "/plugin/table.js", "/plugin/input.js", + "/plugin/table.js", "/plugin/input/key.js", "/plugin/input/date.js", "/plugin/local/team/plan.js", diff --git a/lib/base.js b/lib/base.js index 4bead58a..ae31e5fc 100644 --- a/lib/base.js +++ b/lib/base.js @@ -1,38 +1,21 @@ -var base = Volcanos("base", {help: "基础模块", - isNone: function(c) {return c === undefined || c === null}, - isSpace: function(c) {return c == " " || c == "Enter"}, - - Ext: function(file) { return (file.split("/").pop().split(".").pop()||"txt").toLowerCase() }, - Path: function() {var res = "" - for (var i = 0; i < arguments.length; i++) { - res += (arguments[i].indexOf("/") == 0 || res.endsWith("/")? "": "/") + arguments[i].trim() - } - return res - }, +Volcanos("base", {help: "基础模块", Int: function(value) {return parseInt(value)||0}, Obj: function(value, def) { try { - return typeof value == "string" && value != ""? JSON.parse(value): value || def || {} + return (typeof value == "string" && value != ""? JSON.parse(value): value) || def || {} } catch { return [value] } }, - parseSize: function(size) { - if (size.endsWith("TB") || size.endsWith("tb") || size.endsWith("T") || size.endsWith("t")) { - return parseInt(size) * 1024 * 1024 * 1024 * 1024 + Ext: function(file) { return (file.split("/").pop().split(".").pop()||"txt").toLowerCase() }, + Path: function() { var res = "" + for (var i = 0; i < arguments.length; i++) { + res += (arguments[i].indexOf("/") == 0 || res.endsWith("/")? "": "/") + arguments[i].trim() } - if (size.endsWith("GB") || size.endsWith("gb") || size.endsWith("G") || size.endsWith("g")) { - return parseInt(size) * 1024 * 1024 * 1024 - } - if (size.endsWith("MB") || size.endsWith("mb") || size.endsWith("M") || size.endsWith("m")) { - return parseInt(size) * 1024 * 1024 - } - if (size.endsWith("KB") || size.endsWith("kb") || size.endsWith("K") || size.endsWith("k")) { - return parseInt(size) * 1024 - } - return parseInt(size) + return res }, + Args: function(obj) {var res = []; for (var k in obj) { res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k])) @@ -51,24 +34,6 @@ var base = Volcanos("base", {help: "基础模块", } return size + "B" }, - date: shy("时间格式化", function(t) { - var now = new Date() - if (t) { return now } - if (typeof t == "string") { var ls = t.split(" ") - var vs = ls[0].split("-") - now.setFullYear(parseInt(vs[0])) - now.setMonth(parseInt(vs[1])) - now.setDate(parseInt(vs[2])) - - var vs = ls[1].split(":") - now.setHours(parseInt(vs[0])) - now.setMinutes(parseInt(vs[1])) - now.setSeconds(parseInt(vs[2])) - } else { - now = t - } - return now - }), Time: shy("时间格式化", function(t, fmt) { var now = new Date() if (t && typeof t == "string") { var ls = t.split(" ") @@ -97,9 +62,6 @@ var base = Volcanos("base", {help: "基础模块", fmt = fmt.replace("%S", this.Number(now.getSeconds(), 2)) return fmt }), - TimeAdd: shy("时间格式化", 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; @@ -115,8 +77,26 @@ var base = Volcanos("base", {help: "基础模块", }), Format: shy("数据格式化", function(obj) {return JSON.stringify(obj)}), + TimeAdd: shy("时间格式化", function(t, d) { + return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000) + }), isNight: function() { var now = new Date() return now.getHours() < 7 || now.getHours() > 17 }, + parseSize: function(size) { + if (size.endsWith("TB") || size.endsWith("tb") || size.endsWith("T") || size.endsWith("t")) { + return parseInt(size) * 1024 * 1024 * 1024 * 1024 + } + if (size.endsWith("GB") || size.endsWith("gb") || size.endsWith("G") || size.endsWith("g")) { + return parseInt(size) * 1024 * 1024 * 1024 + } + if (size.endsWith("MB") || size.endsWith("mb") || size.endsWith("M") || size.endsWith("m")) { + return parseInt(size) * 1024 * 1024 + } + if (size.endsWith("KB") || size.endsWith("kb") || size.endsWith("K") || size.endsWith("k")) { + return parseInt(size) * 1024 + } + return parseInt(size) + }, }) diff --git a/lib/core.js b/lib/core.js index 0d7de56a..a8ab054a 100644 --- a/lib/core.js +++ b/lib/core.js @@ -1,21 +1,4 @@ -var core = Volcanos("core", {help: "核心模块", - Copy: function(to, from, fields) { - var list = [] - for (var i = 2; i < arguments.length; i++) { - list.push(arguments[i]) - } - - for (var i = 0; i < list.length; i++) { - to[list[i]] = from[list[i]] - } - }, - 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 - }), +Volcanos("core", {help: "核心模块", Items: shy("迭代器", function(obj, cb) {var list = []; for (var key in obj) { list = list.concat(this.List(obj[key], function(value, index, array) { @@ -24,6 +7,13 @@ var core = Volcanos("core", {help: "核心模块", } 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; @@ -128,6 +118,29 @@ var core = Volcanos("core", {help: "核心模块", } return res }), + Timer: shy("定时器, value, [1,2,3,4], {value, 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.value||interval[i], i, interval)? + typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.value||interval[i+1]) + } + setTimeout(function() { loop(timer, 0) }, interval.value||interval[0]) + return timer + }), + + Copy: function(to, from, fields) { + var list = [] + for (var i = 2; i < arguments.length; i++) { + list.push(arguments[i]) + } + + for (var i = 0; i < list.length; i++) { + to[list[i]] = from[list[i]] + } + }, Eq: function(obj, other) { var self = arguments.callee // undefined null // string number boolen @@ -151,18 +164,5 @@ var core = Volcanos("core", {help: "核心模块", } return obj === other }, - - Timer: shy("定时器, value, [1,2,3,4], {value, 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.value||interval[i], i, interval)? - typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.value||interval[i+1]) - } - setTimeout(function() { loop(timer, 0) }, interval.value||interval[0]) - return timer - }), }) diff --git a/lib/misc.js b/lib/misc.js index c1e408c1..24221004 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -1,4 +1,84 @@ -var misc = Volcanos("misc", {help: "工具模块", +Volcanos("misc", {help: "工具模块", + Message: function(event, can) { var msg = {} + msg.__proto__ = {_event: event, _can: can, _create_time: new Date(), + Option: function(key, val) { + 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) + msg[key] = can.core.List(arguments).slice(1) + return 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) + msg[key] = can.core.List(arguments).slice(1) + return val + }, + Result: function(cb) { + return msg.result && msg.result.join("") || "" + }, + Table: function(cb) { if (!msg.append || !msg.append.length || !msg[msg.append[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]||"").trim() }) + return typeof cb == "function" && (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] = [] + } + }, + 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) { + res[item] && (msg[item] = (msg[item]||[]).concat(res[item])) + }) + res.option && (msg.option = res.option) && res.option.forEach(function(item) { + res[item] && (msg[item] = res[item]) + }) + return msg + }, + Push: function(key, value, detail) { msg.append = msg.append || [] + 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]||""): + msg.Push(item, key[item]||"") + }) + return + } + + for (var i = 0; i < msg.append.length; i++) { + if (msg.append[i] == key) { + break + } + } + if (i >= msg.append.length) {msg.append.push(key)} + msg[key] = msg[key] || [] + msg[key].push(""+(typeof value == "object"? JSON.stringify(value): value)+"") + return msg + }, + Echo: function(res) {msg.result = msg.result || [] + msg._hand = true + for (var i = 0; i < arguments.length; i++) {msg.result.push(arguments[i])} + return msg + }, + } + return msg + }, POST: shy("请求后端", {order: 0}, function(can, msg, url, form, cb) { var xhr = new XMLHttpRequest() xhr.open("POST", url), xhr.onreadystatechange = function() { @@ -99,14 +179,13 @@ var misc = Volcanos("misc", {help: "工具模块", } can._socket.onmessage = function(event) {var order = ++meta.order - try { - // 解析命令 - var msg = JSON.parse(event.data) + try { // 解析命令 + var data = JSON.parse(event.data) } catch (e) { - var msg = {"result": [event.data]} + var data = {"result": [event.data]} } - msg = (can.request||can.Event)(event, msg), msg.Reply = function() { + var msg = can.request(event); msg.Reply = function() { // 回复命令 delete(msg._can) delete(msg._event) @@ -114,16 +193,13 @@ var misc = Volcanos("misc", {help: "工具模块", msg.Option("_target", msg.Option("_source")) console.log(["wss", order, "result"].concat(msg.result).concat([msg])) can._socket.send(JSON.stringify(msg)) - } + }, msg.detail = data.detail, msg.Copy(data) - try { - // 执行命令 - // c + try { // 执行命令 console.log(["wss", order].concat(msg.detail).concat([msg])) typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1)) - } catch (e) { - // 执行失败 - // con + + } catch (e) { // 执行失败 console.log(e) } } diff --git a/lib/page.js b/lib/page.js index b296f921..c853e71c 100644 --- a/lib/page.js +++ b/lib/page.js @@ -1,4 +1,4 @@ -var page = Volcanos("page", {help: "网页模块", +Volcanos("page", {help: "网页模块", ClassList: { has: function(can, obj, key) {var list = obj.className? obj.className.split(" "): []; for (var i = 2; i < arguments.length; i++) { @@ -185,13 +185,17 @@ var page = Volcanos("page", {help: "网页模块", Remove: shy("删除节点", function(can, target) { target && target.parentNode && target.parentNode.removeChild(target) }), - 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 - }, + 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} @@ -265,17 +269,6 @@ var page = Volcanos("page", {help: "网页模块", }) }, - 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]} - })) - }), - Display: function(text) { if (text.startsWith("http://") || text.startsWith("https://") || text.startsWith("ftp://")) { var ls = text.split(" ") @@ -307,75 +300,39 @@ var page = Volcanos("page", {help: "网页模块", target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length) target.setSelectionRange(start, start) }, - oninput: function(event, can, local) {var target = event.target - if (event.ctrlKey) { - if (typeof local == "function" && local(event)) { - event.stopPropagation() - event.preventDefault() - return true + + 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) { + var item = output.childNodes[0] + item.parentNode.removeChild(item) + temp.appendChild(item) } - var his = target.History || [] - var pos = target.Current || -1 - switch (event.key) { - case "p": - pos = (pos-1+his.length+1) % (his.length+1) - target.value = pos < his.length? his[pos]: "" - target.Current = pos - break - case "n": - pos = (pos+1) % (his.length+1) - target.value = pos < his.length? his[pos]: "" - target.Current = pos - break - case "a": - case "e": - case "f": - case "b": - break - case "h": - can.page.DelText(target, target.selectionStart-1, target.selectionStart) - break - case "d": - can.page.DelText(target, 0, target.selectionStart) - break - case "k": - can.page.DelText(target, target.selectionStart) - break - case "u": - can.page.DelText(target, 0, target.selectionEnd) - break - case "w": - 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) - break - default: - return false - } - } else { - switch (event.key) { - case " ": - event.stopPropagation() - return true - default: - return false - } + cache[name] = {node: temp, data: data} + return name } - event.stopPropagation() - event.preventDefault() - return true - }, + output.innerHTML = "" + 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: @@ -519,7 +476,6 @@ var page = Volcanos("page", {help: "网页模块", 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) { diff --git a/lib/user.js b/lib/user.js index a4a6afdc..a21c717a 100644 --- a/lib/user.js +++ b/lib/user.js @@ -1,4 +1,4 @@ -var user = Volcanos("user", {help: "用户模块", agent: { +Volcanos("user", {help: "用户模块", agent: { getLocation: function(cb) { typeof cb == "function" && cb({name: "some"}) }, @@ -12,11 +12,21 @@ var user = Volcanos("user", {help: "用户模块", agent: { typeof cb == "function" && cb([]) }, }, - alert: function(text) {alert(JSON.stringify(text))}, - 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}, + isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, + isMobile: navigator.userAgent.indexOf("Mobile") > -1, + isIPhone: navigator.userAgent.indexOf("iPhone") > -1, + isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1, + isWindows: navigator.userAgent.indexOf("Windows") > -1, + isLocalFile: location && location.protocol && location.protocol == "file:", + isExtension: location && location.protocol && location.protocol == "chrome-extension:", + + alert: function(text) { alert(JSON.stringify(text)) }, + 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 }, + scan: function(str) { try { var value = JSON.parse(str) } catch(e) { try { var value = {"type": "url", "text": str} @@ -28,7 +38,6 @@ var user = Volcanos("user", {help: "用户模块", agent: { } catch(e) { } } return value }, - copy: function(can, text) { var input = can.page.Append(can, document.body, [{type: "input", value: text}]).first input.setSelectionRange(0,-1) @@ -37,24 +46,9 @@ var user = Volcanos("user", {help: "用户模块", agent: { can.page.Remove(can, input) can.user.toast(can, {text: text, title: "复制成功", width: 400}) }, - login: function(can, cb) { - var ui = can.user.input({clientX: 200, clientY: 100}, can, [ - {username: "username", name: "用户"}, - {password: "password", name: "密码"}, - {button: [["登录", function(event) { - 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("用户或密码错误") - }) - }], ["扫码", function(event) { - // TODO - }]]}, - ], function(event, button, data, list) { - // TODO - }) + + topic: function(can, name) { + can.page.Modify(can, document.body, {className: name}) }, toast: function(can, text, title, duration, progress) { var meta = typeof text == "object"? text: {text: text, title: title||can._help, duration: duration, progress: progress} @@ -72,7 +66,7 @@ var user = Volcanos("user", {help: "用户模块", agent: { ]}, ], ondblclick: function(event) { ui.Close() }}]) - var timer = can.Timer({value: 100, length: (meta.duration||1000)/100}, function(event, interval, index) { + var timer = can.core.Timer({value: 100, length: (meta.duration||1000)/100}, function(event, interval, index) { if (index > 20) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." } }, function() { can.page.Remove(can, ui.first), timer.stop = true }) @@ -111,12 +105,23 @@ var user = Volcanos("user", {help: "用户模块", agent: { event.preventDefault() return ui }, - select: function(event, can, type, fields, cb, cbs) { - var msg = can.request(event, {fields: fields||"pod,name,text"}) - can.run(msg._event, ["search", "Search.onimport.select", type, "", ""], function(list) { - can.core.Next(list, cb, cbs||function() { - can.user.toast(can, "添加成功") - }) + login: function(can, cb) { + var ui = can.user.input({clientX: 200, clientY: 100}, can, [ + {username: "username", name: "用户"}, + {password: "password", name: "密码"}, + {button: [["登录", function(event) { + 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("用户或密码错误") + }) + }], ["扫码", function(event) { + // TODO + }]]}, + ], function(event, button, data, list) { + // TODO }) }, input: function(event, can, form, cb) { // form [ string, {_input: }, array, object, button ] @@ -178,6 +183,14 @@ var user = Volcanos("user", {help: "用户模块", agent: { }) return ui }, + select: function(event, can, type, fields, cb, cbs) { + var msg = can.request(event, {fields: fields||"pod,name,text"}) + can.run(msg._event, ["search", "Search.onimport.select", type, "", ""], function(list) { + can.core.Next(list, cb, cbs||function() { + can.user.toast(can, "添加成功") + }) + }) + }, upload: function(event, can) { var begin = new Date() var x = event.clientX, y = event.clientY; y += 10; if (x > 400) { x -= 200 } var ui = can.page.Append(can, document.body, [{view: "upload", style: {left: x+"px", top: y+"px"}, list: [ @@ -223,6 +236,12 @@ var user = Volcanos("user", {help: "用户模块", agent: { a.click() can.page.Remove(can, a) }, + logout: function(can) { + if (can.user.confirm("logout?")) { + can.user.Cookie(can, "sessid", "") + can.user.reload(true) + } + }, Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; var path = location.pathname; obj._path && (path = obj._path, delete(obj._path)) @@ -246,7 +265,7 @@ var user = Volcanos("user", {help: "用户模块", agent: { return args } else if (value == undefined) { // return args[key] || can.user.Cookie(can, key) - return args[key]||can.user.locals(can, key) + return args[key] } else { args[key] = value args[key] == "" && delete(args[key]) @@ -278,38 +297,5 @@ var user = Volcanos("user", {help: "用户模块", agent: { var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) return result && result.length > 0? result[1]: "" }), - locals: function(can, key, value) { - if (typeof key == "object") { - can.core.Item(key, function(key, value) { - localStorage.setItem(key, value) - }) - return key - } - if (value != undefined) { - localStorage.setItem(key, value) - } - if (key != undefined) { - return localStorage.getItem(key) - } - }, - - topic: function(can, name) { - can.page.Modify(can, document.body, {className: name}) - }, - jumps: function(can, url) { location.href = url }, - logout: function(can) { - if (can.user.confirm("logout?")) { - can.user.Cookie(can, "sessid", "") - can.user.reload(true) - } - }, - - isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, - isMobile: navigator.userAgent.indexOf("Mobile") > -1, - isIPhone: navigator.userAgent.indexOf("iPhone") > -1, - isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1, - isWindows: navigator.userAgent.indexOf("Windows") > -1, - isLocalFile: location && location.protocol && location.protocol == "file:", - isExtension: location && location.protocol && location.protocol == "chrome-extension:", }) diff --git a/pane/Action.css b/pane/Action.css index a7df8780..15dd7a43 100644 --- a/pane/Action.css +++ b/pane/Action.css @@ -23,3 +23,44 @@ fieldset.Action fieldset.plugin div.output { margin:5px; color:white; } + +body.white fieldset.Action { + background-color:#0dabda; + border-top:0; +} +body.white fieldset.Action fieldset.plugin { + color:black; background-color:white; + border:0; border-top:solid 2px #CCCCFF; + box-shadow: 4px 4px 10px 4px #626bd0; + margin:8px 8px; +} +body.white fieldset.Action fieldset.plugin:hover { + border-top:solid 2px #6666FF; +} +body.white fieldset.Action fieldset.plugin legend { + font-size:16px; font-family:monospace; + color:white; background-color:#339999; + padding:2px 20px; border:2px solid #99CCFF; + border-radius:10px 10px 10px 10px; +} +body.white fieldset.Action fieldset.plugin legend:hover { + background-color:#6ee4e4; +} +body.white fieldset.Action fieldset.plugin div.output{ + color:black; + padding:10px; +} +body.white fieldset.Action fieldset.plugin div.item input[type=button] { + letter-spacing:4px; +} +body.white fieldset.Action fieldset.plugin div.item input { + box-shadow: 4px 4px 10px 1px #626bd0; +} +body.white fieldset.Action fieldset.plugin div.item input[name=cmd] { + width:160px; +} +body.white fieldset.Action fieldset.plugin div.item select { + box-shadow: 4px 4px 10px 1px #626bd0; + margin-top:-2px; +} + diff --git a/pane/Action.js b/pane/Action.js index 840a5c00..53e6e01c 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -12,26 +12,27 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onimport._plugin(can, target, river, storm, value), next() }): (can.onimport._plugin(can, target, river, storm, value), next()) }) - return typeof cb == "function" && cb(msg) + typeof cb == "function" && cb(msg) }, _plugin: function(can, target, river, storm, value) { value.name = value.name.split(" ")[0] value.action = value.id || value.index || value.key+"."+value.name value.width = can._target.offsetWidth value.type = "plugin" + // 添加插件 can.onappend._init(can, value, ["/plugin/state.js"], function(plugin) { plugin.run = function(event, cmds, cb, silent) { var msg = plugin.request(event); cmds = cmds || [] - return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { - return typeof cb == "function" && cb(msg) + can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { + typeof cb == "function" && cb(msg) }, silent) } }, target) }, }) Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { - can.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1) + can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1) var river = can.Conf(RIVER, msg.Option(RIVER)), storm = can.Conf(STORM, msg.Option(STORM)) - var position = can.Conf(ACTION, msg.Option(ACTION, can.Cache(river+"."+storm, can._output)||"")) + var position = can.Conf(ACTION, msg.Option(ACTION, can.page.Cache(river+"."+storm, can._output)||"")) if (position) { can._output.scrollTo(0, position-1); return } can.run({}, [river, storm], function(msg) { diff --git a/pane/Footer.css b/pane/Footer.css index e4f82b52..a6180000 100644 --- a/pane/Footer.css +++ b/pane/Footer.css @@ -13,3 +13,9 @@ fieldset.Footer>div.output div.state { margin-right:5px; float:right; } + +body.white fieldset.Footer { + border:solid 2px #1f2224; + background-color:#1f2224; + color:white; +} diff --git a/pane/Footer.js b/pane/Footer.js index d186ba9c..0162bcff 100644 --- a/pane/Footer.js +++ b/pane/Footer.js @@ -21,6 +21,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Select(can, target, "span.ncmd", function(item) { item.innerHTML = can.Conf("ncmd", parseInt(can.Conf("ncmd")||"0")+1+"")+"" }) + typeof cb == "function" && cb(msg) }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { diff --git a/pane/Header.css b/pane/Header.css index 791453ca..ea77d05f 100644 --- a/pane/Header.css +++ b/pane/Header.css @@ -29,8 +29,6 @@ fieldset.Header>div.output>div.item { cursor:pointer; float:left; } - - fieldset.Header>div.output>div.state { cursor:pointer; margin-right:5px; @@ -40,3 +38,14 @@ fieldset.Header>div.output>div.state:hover { background-color:red; } +body.white fieldset.Header { + border:solid 2px #1f2224; + background-color:#2f3638; + color:white; +} +body.white fieldset.Header input[type=text] { + border:2px solid #c4c7ce; + border-radius:10px 10px 10px 10px; + background-color:white; + color:white; +} diff --git a/pane/Header.js b/pane/Header.js index 4c1bfa2b..933154eb 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -85,6 +85,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { function init() { can.run({}, [], function(msg) { can.Conf(USERNAME, msg.Option("user.nick")||msg.Option("user.name")) can.onimport._init(can, msg, list, function(msg) { + typeof cb == "function" && cb(msg) can.run({}, ["search", "River.onaction._init"]) can.run({}, ["search", "Footer.onaction._init"]) }, can._output) @@ -97,7 +98,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, var args = {}; can.core.List([POD, TOPIC, TITLE], function(key) { var value = can.user.Search(can, key); value && (args[key] = value) }) - can.user.jumps(can, can.user.Share(can, args, true)) + can.user.jumps(can.user.Share(can, args, true)) }, username: function(event, can) { can.user.logout(can) }, diff --git a/pane/River.css b/pane/River.css index e5d05b50..392e12f0 100644 --- a/pane/River.css +++ b/pane/River.css @@ -20,17 +20,28 @@ fieldset.River>div.output div.item.select { background-color:red; border:ridge 2px yellow; } -fieldset.River>div.output div.sublist { +fieldset.River>div.output div.list { margin-left:20px; } -fieldset.River>div.output div.subitem { + +body.white fieldset.River { + border:solid 2px #1f2224; + background-color:#1f2224; + color:white; } -fieldset.River>div.output div.subitem:hover { - cursor:pointer; - background-color:red; - border:ridge 2px yellow; +body.white fieldset.River>div.output div.item:hover { + background-color:black; + border:solid 2px black; } -fieldset.River>div.output div.subitem.select { - background-color:red; - border:ridge 2px yellow; +body.white fieldset.River>div.output div.item.select { + background-color:black; + border:solid 2px black; +} +body.white fieldset.River>div.output div.subitem:hover { + background-color:black; + border:solid 2px black; +} +body.white fieldset.River>div.output div.subitem.select { + background-color:black; + border:solid 2px black; } diff --git a/pane/River.js b/pane/River.js index 2d838773..0495c170 100644 --- a/pane/River.js +++ b/pane/River.js @@ -30,10 +30,10 @@ Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: f var list = can.sublist[river]; if (list) { return can.page.Toggle(can, list) } can.run({}, [river, "tool"], function(msg) { - var select = 0; list = can.page.Append(can, can._output, [{view: "sublist", list: msg.Table(function(storm, index) { + 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", "subitem"], onclick: function(event) { + return {text: [storm.name, "div", "item"], onclick: function(event) { // 左键点击 can.onaction.action(event, can, river, storm.hash) can.user.title(can.user.Search(can, POD) || storm.name) @@ -43,7 +43,7 @@ Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: f can.ondetail[item](event, can, item, storm.hash, river) }) }} - }) }]).sublist, list.children.length > 0 && list.children[select].click() + }) }]).first, list.children.length > 0 && list.children[select].click() event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) can.sublist[river] = list @@ -53,7 +53,7 @@ Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: f var msg = can.request(event, {river: can.Conf(RIVER, river), storm: can.Conf(STORM, storm)}) can.run(event, ["search", "Action.onaction._init"]) - can.page.Select(can, can._output, "div.subitem.select", function(item) { + can.page.Select(can, can._output, "div.item.select", function(item) { can.page.ClassList.del(can, item, "select") }), can.page.ClassList.add(can, event.target, "select") }, diff --git a/plugin/input.js b/plugin/input.js index 842a035b..76828fb5 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,4 +1,4 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { }, }) Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) { @@ -38,7 +38,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, "查看": function(event, can) { can.run(event) }, "返回": function(event, can) { can.sup._history.pop(); var his = can.sup._history.pop(); if (his) { - can.page.Select(can, can._option, "input.args,select.args", function(item, index) { + can.page.Select(can, can._option, "textarea.args,input.args,select.args", function(item, index) { item.value = his[index] || "" }) } @@ -46,7 +46,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, }, onchange: function(event, can) { - if (event.target.tagName == "SELECT") { can.run(event) } + if (can.Conf("type") == "select") { can.run(event) } }, ondblclick: function(event, can) { if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1) } @@ -71,31 +71,32 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, var cb = can.onaction[action] || can.onaction[name] if (typeof cb == "function") { return cb(event, can, name) } + // 组件回调 + var cb = can.sup.onaction[action] || can.sup.onaction[name] + if (typeof cb == "function") { return cb(event, can, name) } + // 通用回调 if (can.Conf("type") == "button") { can.run(event, [name].concat(can.sup.Pack())) } }, onkeydown: function(event, can) { - can.onkeypop.show(event, can) switch (event.key) { case "Enter": - if (event.target.tagName == "INPUT") { event.target.setSelectionRange(0, -1), can.run(event) } - if (event.target.tagName == "TEXTAREA") { break } + if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1), can.run(event) } + if (can.Conf("type") == "textarea") { break } event.stopPropagation() event.preventDefault() break - case "b": if (!event.ctrlKey) { return }; can.CloneInput(); break - case "m": if (!event.ctrlKey) { return }; can.CloneField(); break - default: return + case "b": if (!event.ctrlKey) { break }; can.CloneInput(); break + case "m": if (!event.ctrlKey) { break }; can.CloneField(); break } }, onkeyup: function(event, can) { switch (event.key) { case "Enter": - if (event.target.tagName == "TEXTAREA") { break } + if (can.Conf("type") == "textarea") { break } event.stopPropagation() event.preventDefault() break - default: return } }, }) diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index ef131d9f..15851e4e 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -62,7 +62,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, project: function(can, path, cb) { can.Option({path: path}) var msg = can.request({}); msg.Option("dir_root", path), msg.Option("dir_deep", "true") can.run(msg._event, ["action", "dir", "./"], function(msg) { can.ui.project.innerHTML = "" - can.Status("文件数", msg.path.length) + msg.path && can.Status("文件数", msg.path.length) can.onappend.tree(can, msg, "path", "/", can.ui.project, function(event, value) { can.onimport.tabview(can, can.Option("path"), value.path) }), typeof cb == "function" && cb() @@ -75,7 +75,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }) // caches save - can.core.List(["content"], function(item) { can.Cache(can.file+item, can.ui[item], { + can.core.List(["content"], function(item) { can.page.Cache(can.file+item, can.ui[item], { scrollTop: can.ui.profile.parentNode.scrollTop, current: can.current, max: can.max, @@ -87,7 +87,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], // caches load var cache = false; can.core.List(["content"], function(item) { - var p = can.Cache(can.file+item, can.ui[item]); if (p != undefined) { cache = true + var p = can.page.Cache(can.file+item, can.ui[item]); if (p != undefined) { cache = true can.ui.profile.parentNode.scrollTo(0, p.scrollTop) can.onaction.selectLine(can, p.current.line) can.max = p.max diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 7c4ca9bc..79668a65 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -6,7 +6,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _merge: function(can, sub) var ui = can.page.Append(can, can.ui.profile, [ {view: ["editor", "input"], onkeydown: function(event) { can.onkeymap.parse(event, can, "insert") - can.Timer(1, function() { + can.core.Timer(1, function() { can.current.text(can.ui.editor.value) }) }, onfocus: function(event) { diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 66ce00ab..37ac2366 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -73,8 +73,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, _profile: function(can, msg, task) { task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra) - can.task && can.Cache(can.task.id, can.ui.display, can.task.id) - can.Status(can.task = task); can.Cache(task.id, can.ui.display) || task["extra.cmd"] && can.onappend.plugin(can, { + can.task && can.page.Cache(can.task.id, can.ui.display, can.task.id) + can.Status(can.task = task); can.page.Cache(task.id, can.ui.display) || task["extra.cmd"] && can.onappend.plugin(can, { height: can.Conf("height"), width: can.Conf("width"), index: task["extra.ctx"]+"."+task["extra.cmd"], args: task["extra.arg"], }, function(sub) { sub.run = function(event, cmds, cb, silent) { diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index 09adeb96..02f28b8e 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -32,7 +32,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, } }) - can.Timer(10, function() { + can.core.Timer(10, function() { // 默认参数 can.core.Item({ "font-size": "24", diff --git a/plugin/state.js b/plugin/state.js index 93efd487..b2ad7a4c 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -1,13 +1,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { }, -}) -Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { - // can.onaction._process(can, sub, value, msg, cmds, cb, silent) - }, - _process: function(can, sub, conf, msg, cmds, cb, silent) { - var p = can.onaction[msg.Option("_process")] - typeof p == "function"? p(can, sub, conf, msg, cmds, cb, silent): typeof cb == "function" && cb(msg) - can.run(msg._event, ["search", "Footer.onaction.ncmd"]) + _process: function(can, msg) { + var cb = can.onimport[msg.Option("_process") || can.Conf("feature._process")] + return typeof cb == "function" && cb(can, msg) }, _progress: function(can, sub, conf, msg, cmds, cb, silent) { var size = msg.Append("size") || msg.Append("count") @@ -25,11 +20,36 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, can.page.ClassList.add(can, td, "done") } }) - can.Timer(1000, function() { + can.core.Timer(1000, function() { var res = sub.request({}) res.Option("_progress", msg.Option("_progress")) sub.run(res._event, cmds, cb, silent) }) + return true + }, + _refresh: function(can, msg) { + can.core.Timer(500, function(timer) { + var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1}) + can.run(sub._event) + }) + }, + _field: function(can, msg) { + msg.Table(function(value) { + value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) + value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) + value.width = can._target.offsetWidth + value.type = "story" + + can.onappend._init(can, value, ["/plugin/state.js"], function(sub) { + sub.run = function(event, cmds, cb, silent) { + can.run(event, (msg["_prefix"]||[]).concat(cmds), cb, true) + } + }, can._output) + }) + return true + }, +}) +Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { }, input: function(event, can, name, cb) { var feature = can.Conf("feature") feature[name]? can.user.input(event, can, feature[name], function(ev, button, data, list) { @@ -50,5 +70,29 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, } } }) }, + + getLocation: function(event, can, cmd) { var msg = can.request(can) + can.user.agent.getLocation(function(res) { + var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) + can.run(event, ["action", cmd].concat(arg)) + }) + }, + openLocation: function(event, can) { var msg = can.request(can) + can.user.agent.openLocation(msg) + }, + scanQRCode0: function(event, can) { var msg = can.request(can) + can.user.agent.scanQRCode() + }, + scanQRCode: function(event, can, cmd) { var msg = can.request(can) + can.user.agent.scanQRCode(function(res) { + var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) + can.run(event, ["action", cmd].concat(arg)) + }) + }, + + "清空": function(event, can, name) { can._output.innerHTML = "" }, + "结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) { + can.run({}) + }, true) }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/story/spide.js b/plugin/story/spide.js index f70869c4..555bc768 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -24,7 +24,7 @@ Volcanos("onimport", {help: "导入数据", list: [], can.page.Modify(can, sub._status, {style: {display: "none"}}) sub.run = function(event, cmds, cb, silent) { typeof cb == "function" && cb(can.request(event)) - can.Timer(1000, function() { + can.core.Timer(1000, function() { can.sub = sub._outputs[0] can.msg = msg, can.data = msg.Table() can.Action("height", "400") @@ -228,7 +228,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "横向", break default: can.run(event, ["inner"].concat(cmds), function(msg) { - cb(msg), can.Timer(10, function() { + cb(msg), can.core.Timer(10, function() { // can.onaction._resize(sub, layout) }) }, true) diff --git a/plugin/story/trend.js b/plugin/story/trend.js index 95fa34f4..d8f6b5a2 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -23,7 +23,7 @@ Volcanos("onimport", {help: "导入数据", list: [], can.page.Modify(can, sub._status, {style: {display: "none"}}) sub.run = function(event, cmds, cb, silent) { typeof cb == "function" && cb(can.request(event)) - can.Timer(100, function() { + can.core.Timer(100, function() { can.sub = sub._outputs[0] can.msg = msg, can.data = msg.Table() var action = can.Conf("action") @@ -128,7 +128,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view", one.onmouseover = function(event) { can.Status(line) } - can.Timer(parseInt(can.Action("speed")), next) + can.core.Timer(parseInt(can.Action("speed")), next) })() }) }, diff --git a/plugin/table.js b/plugin/table.js index ed000b96..b3b46ed9 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,40 +1,22 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - if (can.onimport._process(can, msg)) { - return typeof cb == "function" && cb(msg) - } + if (can.onimport._process(can, msg)) { return typeof cb == "function" && cb(can, msg) } + can.ui = can.page.Appends(can, target, [can.onimport._control(can, msg)].concat([ - {view: ["content", "div"]}, - {view: ["display", "pre"]}, + {view: ["content", "div"]}, {view: ["display", "pre"]}, ])) - var cmd = "", arg = "" can.onappend.table(can, msg, can.ui.content, "table", function(value, key, index, line, array) { - if (key == "key") { - switch (value) { - case "extra.cmd": cmd += line.value; break - case "extra.ctx": cmd = line.value + "." + cmd; break - case "extra.arg": arg = line.value; break - } - } return can.onimport._table(can, value, key, index, line, array) }) - cmd && can.onappend.plugin(can, { - height: can.Conf("height"), width: can.Conf("width"), index: cmd, args: arg, - }, function(sub) { - sub.run = function(event, cmds, cb, silent) { - var msg = can.request(event); can.core.List(msg["key"], function(key, index) { - msg.Option("list."+key, msg["value"][index]) - }) - can.run(event, ["action", "command", "run", cmd].concat(cmds), function(msg) { - typeof cb == "function" && cb(msg) - }, true) - } - }, can.ui.display) - can.onappend.board(can, msg, can.ui.display, "board") can.onimport._board(can, msg) - return typeof cb == "function" && cb(msg) + + typeof cb == "function" && cb(msg) + }, + _control: function(can, msg) { + var cb = can.onimport[msg.Option("_control")] + return typeof cb == "function" && cb(can, msg) }, _page: function(can, msg) { return {view: ["control", "div"], list: [ @@ -87,10 +69,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, data: {"className": "args"}}, ]} }, - _control: function(can, msg) { - var cb = can.onimport[msg.Option("_control")] - return typeof cb == "function" && cb(can, msg) - }, _table: function(can, value, key, index, line, array) { return {type: "td", inner: value, click: function(event) { var target = event.target if (target.tagName == "INPUT" && target.type == "button") { var msg = can.sup.request(event); msg.Option(can.Option()) @@ -139,9 +117,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Modify(can, item, {style: can.base.Obj(data.style)}) }) }, + _process: function(can, msg) { - var process = msg.Option("_process") || can.Conf("feature")["_process"] - var cb = can.onimport[process]; return typeof cb == "function" && cb(can, msg) + var cb = can.onimport[msg.Option("_process") || can.Conf("feature._process")] + return typeof cb == "function" && cb(can, msg) }, _follow: function(can, msg) { if (msg.Option("cache.status") == "stop") { return can.user.toast(can, msg.Option("cache.action")+" done!")} @@ -151,7 +130,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Append(can, can.ui.content, [{text: msg.Result()}]) can.ui.content.scrollBy(0, 1000) - can.Timer(100, function() { + can.core.Timer(100, function() { var sub = can.request({}) sub.Option("cache.hash", msg.Option("cache.hash")) sub.Option("cache.begin", msg.Option("cache.begin")) @@ -170,26 +149,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onappend.board(can, msg, can._output, "board") // can.onimport._board(can, msg) return true - - }, - _field: function(can, msg) { - msg.Table(function(value) { - value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) - value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) - value.name && can.onappend._init(can, value, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) { - sub.run = function(event, cmds, cb, silent) { - can.run(event, (msg["_prefix"]||[]).concat(cmds), cb, true) - } - }, can._output) - }) - return true - }, - _refresh: function(can, msg) { - can.Timer(500, function(timer) { - var sub = can.request({}) - sub.Option("_count", parseInt(msg.Option("_count"))-1) - can.run(sub._event) - }) }, spark: function(can, list, target) { @@ -206,29 +165,5 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, }) -Volcanos("onaction", {help: "控件交互", list: [], - getLocation: function(event, can, cmd) { var msg = can.request(can) - can.user.agent.getLocation(function(res) { - var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) - can.run(event, ["action", cmd].concat(arg)) - }) - }, - openLocation: function(event, can) { var msg = can.request(can) - can.user.agent.openLocation(msg) - }, - scanQRCode0: function(event, can) { var msg = can.request(can) - can.user.agent.scanQRCode() - }, - scanQRCode: function(event, can, cmd) { var msg = can.request(can) - can.user.agent.scanQRCode(function(res) { - var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) }) - can.run(event, ["action", cmd].concat(arg)) - }) - }, - - "清空": function(event, can, name) { can._output.innerHTML = "" }, - "结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) { - can.run({}) - }, true) }, -}) +Volcanos("onaction", {help: "控件交互", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/proto.js b/proto.js index fe9ccc2b..7e177bed 100644 --- a/proto.js +++ b/proto.js @@ -11,14 +11,12 @@ function shy(help, meta, list, cb) { cb.list = next("object") || [] return cb }; var _can_name = "" -var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index: 1}, [], function(name, can, libs, cb) { +var Volcanos = shy("火山架", {libs: [], cache: {}, index: 1}, [], function(name, can, libs, cb) { var meta = arguments.callee.meta, list = arguments.callee.list if (typeof name == "object") { var Config = name meta.volcano = Config.volcano, meta.libs = Config.libs var Preload = Config.libs; Config.panes.forEach(function(pane) { - pane.type= "pane" - pane.list = pane.list || ["/pane/"+pane.name+".css", "/pane/"+pane.name+".js"] - Preload = Preload.concat(pane.list) + Preload = Preload.concat(pane.list = pane.list || ["/pane/"+pane.name+".css", "/pane/"+pane.name+".js"]) }); Preload = Preload.concat(Config.plugin) name = Config.name, can = { _follow: Config.name, @@ -26,11 +24,12 @@ var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index: _target: document.body, _head: document.head, _body: document.body, }, libs = Preload.concat(Config.volcano), cb = function(can) { can.onengine._init(can, can.Conf(Config), [], function(msg) { + console.log(can) }, can._target) } } - var conf = {}, conf_cb = {}, cache = {} + var conf = {}, conf_cb = {} can = can || {}, list.push(can) && (can.__proto__ = {__proto__: Volcanos.meta, _name: name, _create_time: new Date(), _load: function(name, cb) { for (var cache = meta.cache[name] || []; meta.index < list.length; meta.index++) { if (name == "/plugin/input/date.css" && cache.length > 0) { continue } @@ -91,97 +90,16 @@ var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index: }, request: function(event, option) { event = event || {} if (event._msg) { - can.core.Item(option, function(key, value) { - event._msg.Option(key, value) - }) + can.core.Item(option, event._msg.Option) return event._msg } var ls = (can._name||can._help).split("/") event._pane = ls[ls.length-1] - var msg = {}; event._msg = msg, msg._event = event, msg._can = can - msg.__proto__ = { _name: meta.order++, _create_time: new Date(), - Option: function(key, val) { - 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) - msg[key] = can.core.List(arguments).slice(1) - return 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) - msg[key] = can.core.List(arguments).slice(1) - return val - }, - Result: function(cb) { - return msg.result && msg.result.join("") || "" - }, - Table: function(cb) { if (!msg.append || !msg.append.length || !msg[msg.append[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]||"").trim() }) - return typeof cb == "function" && (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] = [] - } - }, - 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) { - res[item] && (msg[item] = (msg[item]||[]).concat(res[item])) - }) - res.option && (msg.option = res.option) && res.option.forEach(function(item) { - res[item] && (msg[item] = res[item]) - }) - return msg - }, - Push: function(key, value, detail) { msg.append = msg.append || [] - 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]||""): - msg.Push(item, key[item]||"") - }) - return - } - - for (var i = 0; i < msg.append.length; i++) { - if (msg.append[i] == key) { - break - } - } - if (i >= msg.append.length) {msg.append.push(key)} - msg[key] = msg[key] || [] - msg[key].push(""+(typeof value == "object"? JSON.stringify(value): value)+"") - return msg - }, - Echo: function(res) {msg.result = msg.result || [] - msg._hand = true - for (var i = 0; i < arguments.length; i++) {msg.result.push(arguments[i])} - return msg - }, - } - can.core.Item(option, function(key, value) { - msg.Option(key, value) - }) - return msg + var msg = can.misc.Message(event, can) + can.core.Item(option, msg.Option) + return event._msg = msg }, Conf: function(key, value, cb) { @@ -200,44 +118,6 @@ var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index: } return conf[key] || "" }, - Cache: function(name, output, data) { - if (data) { if (output.children.length == 0) { return } - // 写缓存 - var temp = document.createDocumentFragment() - while (output.childNodes.length>0) { - var item = output.childNodes[0] - item.parentNode.removeChild(item) - temp.appendChild(item) - } - - cache[name] = {node: temp, data: data} - return name - } - - output.innerHTML = "" - 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 - }, - Timer: shy("定时器, value, [1,2,3,4], {value, 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.value||interval[i], i, interval)? - typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.value||interval[i+1]) - } - setTimeout(function() { loop(timer, 0) }, interval.value||interval[0]) - return timer - }), }) if (_can_name) { diff --git a/trash/frame_old.js b/trash/frame_old.js index 33f98189..0b173553 100644 --- a/trash/frame_old.js +++ b/trash/frame_old.js @@ -233,7 +233,7 @@ var can = Volcanos("chat", { }) for (var i = args.length-1; i >= 0; i--) {if (args[i] == "") {args = args.slice(0, i)} else {break}} - show && plugin.Timer(1000, function() {show && plugin.user.toast(can.base.Format(args||["running..."]), meta.name, -1)}); + show && can.core.Timer(1000, function() {show && plugin.user.toast(can.base.Format(args||["running..."]), meta.name, -1)}); run(event, args, function(msg) {if (silent) {return typeof cb == "function" && cb(msg)} plugin.msg = msg, plugin.Show(feature.display || "table", msg, cb) show = false, plugin.user.toast(); diff --git a/trash/pane/Action.js b/trash/pane/Action.js index c30f888e..37a13463 100644 --- a/trash/pane/Action.js +++ b/trash/pane/Action.js @@ -21,8 +21,8 @@ Volcanos("onimport", {help: "导入数据", list: [], }, storm: function(event, can, value, cmd, field) {if (value == "update") {return} // 保存界面 - can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some"); - if (can.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) { + can.page.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some"); + if (can.page.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) { // 恢复界面 return } diff --git a/trash/pane/Header.js b/trash/pane/Header.js index 79a2d94b..44f7dad6 100644 --- a/trash/pane/Header.js +++ b/trash/pane/Header.js @@ -12,7 +12,7 @@ Volcanos("onimport", {help: "导入数据", list: [], return {text: meta[item]||"", className: item, click: function(event) {can.Export(event, meta[item], item)}}; })}]) - can.timer = can.Timer({interval: 1000, length: -1}, function(event) { + can.timer = can.core.Timer({interval: 1000, length: -1}, function(event) { can.onimport.time(event, can, can.base.Time().split(" ")[1], "time") }) }) diff --git a/trash/pane/float/Toast.js b/trash/pane/float/Toast.js index ebb5fd96..41d53fa0 100644 --- a/trash/pane/float/Toast.js +++ b/trash/pane/float/Toast.js @@ -27,7 +27,7 @@ Volcanos("onimport", {help: "导入数据", list: [], if (text.duration == -1) {return {toast: toast}} var begin = can.base.Time().split(" ")[1] - timer = can.Timer({value: 1000, length: text.duration > 0? text.duration/1000: text.duration}, function(t, i) { + timer = can.core.Timer({value: 1000, length: text.duration > 0? text.duration/1000: text.duration}, function(t, i) { if (i < 10) {return} if (i > 10000) {return true} toast.tick.innerHTML = can.base.Duration(i*t) + " after " + begin diff --git a/trash/plugin/local/wiki/draw.js b/trash/plugin/local/wiki/draw.js index b858ebf9..26d9cd88 100644 --- a/trash/plugin/local/wiki/draw.js +++ b/trash/plugin/local/wiki/draw.js @@ -882,7 +882,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["标签", "编辑", "复制", } var list = ["red", "green", "yellow", "blue"] - target._timer = can.Timer({value: 500, length: -1}, function() { + target._timer = can.core.Timer({value: 500, length: -1}, function() { target.Value("fill", list[parseInt(Math.random()*list.length%list.length)]) }) }, @@ -893,7 +893,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["标签", "编辑", "复制", return } - target._timer = can.Timer({value: 500, length: -1}, function(event) { + target._timer = can.core.Timer({value: 500, length: -1}, function(event) { can.onaction._run({type: "click", target: target}, can, target) }) },