mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
opt volcanos
This commit is contained in:
parent
daae818739
commit
d221b3cf1b
@ -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)
|
||||
|
223
frame.js
223
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)
|
||||
},
|
||||
|
254
index.css
254
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;
|
||||
|
4
index.js
4
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",
|
||||
|
72
lib/base.js
72
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)
|
||||
},
|
||||
})
|
||||
|
||||
|
62
lib/core.js
62
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
|
||||
}),
|
||||
})
|
||||
|
||||
|
102
lib/misc.js
102
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)
|
||||
}
|
||||
}
|
||||
|
122
lib/page.js
122
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) {
|
||||
|
118
lib/user.js
118
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:",
|
||||
})
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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) },
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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")
|
||||
},
|
||||
|
@ -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
|
||||
}
|
||||
},
|
||||
})
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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",
|
||||
|
@ -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: []})
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
})()
|
||||
})
|
||||
},
|
||||
|
@ -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: []})
|
||||
|
136
proto.js
136
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) {
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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")
|
||||
})
|
||||
})
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
})
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user