mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
opt chat
This commit is contained in:
parent
51635036cd
commit
7d0876c419
132
frame.js
132
frame.js
@ -105,6 +105,7 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) {
|
|||||||
can.core.Item(river.storm, function(key, value) {
|
can.core.Item(river.storm, function(key, value) {
|
||||||
msg.Push("key", key)
|
msg.Push("key", key)
|
||||||
msg.Push("name", value.name)
|
msg.Push("name", value.name)
|
||||||
|
msg.Push("count", (value.index||value.action).length)
|
||||||
})
|
})
|
||||||
typeof cb == "function" && cb(msg)
|
typeof cb == "function" && cb(msg)
|
||||||
return true
|
return true
|
||||||
@ -199,6 +200,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
|||||||
|
|
||||||
meta.detail = meta.feature["detail"] || {}
|
meta.detail = meta.feature["detail"] || {}
|
||||||
sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field)
|
sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field)
|
||||||
|
sub.onappend._status(sub, status)
|
||||||
|
|
||||||
// 添加控件
|
// 添加控件
|
||||||
function add(item, next, index) {
|
function add(item, next, index) {
|
||||||
@ -332,7 +334,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
|||||||
},
|
},
|
||||||
_detail: function(can, msg, list, target) {
|
_detail: function(can, msg, list, target) {
|
||||||
can.ondetail && can.ondetail.list && can.ondetail.list.length > 0 && (target.oncontextmenu = function(event) {
|
can.ondetail && can.ondetail.list && can.ondetail.list.length > 0 && (target.oncontextmenu = function(event) {
|
||||||
can.onappend.carte(can, can.ondetail||{}, list, function(ev, item, meta) {
|
can.user.carte(can, can.ondetail||{}, list, function(ev, item, meta) {
|
||||||
(can.ondetail[item] || can.onaction[item] || can.onkeymap && can.onkeymap._remote)(event, can, item)
|
(can.ondetail[item] || can.onaction[item] || can.onkeymap && can.onkeymap._remote)(event, can, item)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -355,7 +357,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
|||||||
},
|
},
|
||||||
menu: function(can, msg, value) {
|
menu: function(can, msg, value) {
|
||||||
can.ondetail && can.ondetail.list && can.ondetail.list.length > 0 && (can._target.oncontextmenu = function(event) {
|
can.ondetail && can.ondetail.list && can.ondetail.list.length > 0 && (can._target.oncontextmenu = function(event) {
|
||||||
can.onappend.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail"), function(ev, item, meta) {
|
can.user.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail"), function(ev, item, meta) {
|
||||||
(can.ondetail[item]||can.onaction[item])(event, can, value, item)
|
(can.ondetail[item]||can.onaction[item])(event, can, value, item)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -450,7 +452,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
|||||||
run(event, "编辑", value)
|
run(event, "编辑", value)
|
||||||
})
|
})
|
||||||
}, oncontextmenu: function(event) {
|
}, oncontextmenu: function(event) {
|
||||||
can.onappend.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail") || can.ondetail.list, function(event, item, meta) {
|
can.user.carte(can, can.ondetail||{}, msg["_detail"] || can.Conf("detail") || can.ondetail.list, function(event, item, meta) {
|
||||||
switch (item) {
|
switch (item) {
|
||||||
case "编辑":
|
case "编辑":
|
||||||
can.onappend.modify(can, event.target, function(event, value, old) {
|
can.onappend.modify(can, event.target, function(event, value, old) {
|
||||||
@ -469,124 +471,6 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
|||||||
msg.result && can.page.AppendBoard(can, target, can.page.Display(msg.Result()))
|
msg.result && can.page.AppendBoard(can, target, can.page.Display(msg.Result()))
|
||||||
},
|
},
|
||||||
|
|
||||||
carte: function(can, meta, list, cb) { meta = meta || can.ondetail, list = list && list.length > 0? list: meta.list; if (list.length == 0) { return }
|
|
||||||
can._carte = can._carte || can.page.Append(can, can._target, [{view: "carte", onmouseleave: function(event) {
|
|
||||||
can.page.Modify(can, can._carte, {style: {display: "none"}})
|
|
||||||
}}]).last
|
|
||||||
|
|
||||||
meta = meta||can.ondetail||{}, cb = cb||function(ev, item, meta) {
|
|
||||||
var cb = can.ondetail[item] || can.onaction[item] || can.onkeymap&&can.onkeymap._remote
|
|
||||||
cb && cb(event, can, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
can.page.Appends(can, can._carte, can.core.List(list, function(item) {
|
|
||||||
return {view: ["item"], list: [typeof item == "string"? {text: [item], click: function(event) {
|
|
||||||
typeof cb == "function" && cb(event, item, meta)
|
|
||||||
}}: item.args? {text: [item.name], click: function(event) {
|
|
||||||
can.user.input(event, can, item.args, function(event, cmd, form, list) {
|
|
||||||
var msg = can.Event(event)
|
|
||||||
can.core.Item(form, function(key, value) {msg.Option(key, value)})
|
|
||||||
cmd == "提交" && typeof cb == "function" && cb(event, item.name, meta)
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
}}: {select: [item, function(event) {
|
|
||||||
typeof cb == "function" && cb(event, event.target.value, meta)
|
|
||||||
}], value: src[item[0]]||""}]}
|
|
||||||
}))
|
|
||||||
|
|
||||||
|
|
||||||
var ls = can._follow.split(".")
|
|
||||||
|
|
||||||
var left = (ls.length > 2) && can.run({}, ["search", can._follow.split(".")[1]+".onexport.left"]) || 0
|
|
||||||
var top = (ls.length == 3) && can.run({}, ["search", can._follow.split(".")[1]+".onexport.top"]) || 0
|
|
||||||
var top = (ls.length > 3)? event.y: top
|
|
||||||
var pos = {position: "absolute", display: "block", left: event.x-left, top: event.y-top}
|
|
||||||
// if (document.body.clientWidth - event.x < 60) {
|
|
||||||
// var pos = {display: "block", right: event.x, top: event.y}
|
|
||||||
// }
|
|
||||||
can.page.Modify(can, can._carte, {style: pos})
|
|
||||||
console.log("carte ", can._carte.offsetLeft, "output", can._carte.parentNode.offsetLeft)
|
|
||||||
|
|
||||||
event.stopPropagation()
|
|
||||||
event.preventDefault()
|
|
||||||
},
|
|
||||||
toast: function(can, text, title, duration) {
|
|
||||||
var meta = typeof text == "object"? text: {text: text, title: title, duration: duration}
|
|
||||||
can._toast = can._toast || can.page.Append(can, can._target, [{view: "toast", onmouseleave: function(event) {
|
|
||||||
can.page.Modify(can, can._toast, {style: {display: "none"}})
|
|
||||||
}}]).last
|
|
||||||
|
|
||||||
var ui = can.page.Appends(can, can._toast, [
|
|
||||||
{text: [meta.title||"", "div", "title"]},
|
|
||||||
typeof meta.text == "object"? meta.text: {text: [meta.text||"执行成功", "div", "content"]},
|
|
||||||
{view: ["button"], list: meta.button},
|
|
||||||
{text: ["", "div", "duration"]},
|
|
||||||
])
|
|
||||||
|
|
||||||
var width = meta.width||200, height = meta.height||100
|
|
||||||
var pos = {position: "absolute", display: "block",
|
|
||||||
width: width, bottom: 100,
|
|
||||||
left: document.body.clientWidth/2-width/2,
|
|
||||||
}
|
|
||||||
can.page.Modify(can, can._toast, {style: pos})
|
|
||||||
|
|
||||||
can.Timer({value: 1000, length: (meta.duration||3000)/1000}, function(event, interval, index) {
|
|
||||||
if (index > 2) {
|
|
||||||
ui.duration.innerHTML = index+"s..."
|
|
||||||
}
|
|
||||||
}, function() {
|
|
||||||
can.page.Modify(can, can._toast, {style: {display: "none"}})
|
|
||||||
})
|
|
||||||
ui.Close = function() {
|
|
||||||
can.page.Modify(can, can._toast, {style: {display: "none"}})
|
|
||||||
}
|
|
||||||
return ui
|
|
||||||
},
|
|
||||||
share: function(can, msg, cmd) {
|
|
||||||
can.run(msg._event, cmd||["action", "share"], function(msg) {
|
|
||||||
var src = can.user.Share(can, {_path: "/share/"+msg.Result()}, true)
|
|
||||||
var ui = can.onappend.toast(can, {title: can.page.Format("a", src, msg.Result()), text: can.page.Format("img", src+"/share"),
|
|
||||||
width: 300, height: 300, duration: 100000, button: [{button: ["确定", function(event) {
|
|
||||||
can.page.Modify(can, can._toast, {style: {display: "none"}})
|
|
||||||
}]}] })
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
upload: function(can) { var begin = new Date()
|
|
||||||
can._upload = can._upload || can.page.Append(can, can._target, [{view: "upload", list: [{view: "action"}, {view: "output"}]}])
|
|
||||||
|
|
||||||
function show(event, value, total, loaded) {
|
|
||||||
var now = new Date(); can.page.Appends(can, can._upload.output, [
|
|
||||||
{view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{
|
|
||||||
view: ["progress"], style: {height: "10px", width: value + "%", background: "red"},
|
|
||||||
}]},
|
|
||||||
{text: [value+"%", "div"], style: {"float": "right"}},
|
|
||||||
{text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}},
|
|
||||||
{text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}},
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
var action = can.page.AppendAction(can, can._upload.action, [
|
|
||||||
{type: "input", data: {name: "upload", type: "file", onchange: function(event) {
|
|
||||||
var file = action.upload.files[0]
|
|
||||||
show(event, 0, file.size, 0)
|
|
||||||
}}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) {
|
|
||||||
if (action.upload.files.length == 0) {return action.upload.focus()}
|
|
||||||
if (value == "关闭") {can._upload.stick = false; return can.page.Remove(can, can._upload.output.parentNode)}
|
|
||||||
|
|
||||||
var msg = can.request(event)
|
|
||||||
can.core.Item(can.Option(), msg.Option)
|
|
||||||
|
|
||||||
// 上传文件
|
|
||||||
begin = new Date()
|
|
||||||
msg._progress = show
|
|
||||||
msg.upload = action.upload.files[0]
|
|
||||||
can.run(event, ["action", "upload"], function(msg) {
|
|
||||||
can.onappend.toast(can, "上传成功")
|
|
||||||
}, true)
|
|
||||||
})
|
|
||||||
action.upload.click()
|
|
||||||
},
|
|
||||||
modify: function(can, target, cb) { var back = target.innerHTML
|
modify: function(can, target, cb) { var back = target.innerHTML
|
||||||
var ui = can.page.Appends(can, target, [{type: "input", value: back, onkeydown: function(event) {
|
var ui = can.page.Appends(can, target, [{type: "input", value: back, onkeydown: function(event) {
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
@ -606,9 +490,9 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
|||||||
},
|
},
|
||||||
daemon: function(can, name) {
|
daemon: function(can, name) {
|
||||||
can.misc.WSS(can, "", {name: name, type: "chrome"}, function(event, msg) {
|
can.misc.WSS(can, "", {name: name, type: "chrome"}, function(event, msg) {
|
||||||
if (msg.Option("_handle")) {return can.onappend.toast(can, msg.result.join(""))}
|
if (msg.Option("_handle")) {return can.user.toast(can, msg.result.join(""))}
|
||||||
|
|
||||||
can.onappend.toast(can, msg.detail.join(" ")); switch (msg.detail[0]) {
|
can.user.toast(can, msg.detail.join(" ")); switch (msg.detail[0]) {
|
||||||
case "pwd": msg.Echo("hello world"); break
|
case "pwd": msg.Echo("hello world"); break
|
||||||
default:
|
default:
|
||||||
can.run(event, ["search"].concat(msg.detail), function(msg) {
|
can.run(event, ["search"].concat(msg.detail), function(msg) {
|
||||||
@ -617,7 +501,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
|||||||
|
|
||||||
msg.Reply(msg)
|
msg.Reply(msg)
|
||||||
}
|
}
|
||||||
}, function() {can.user.toast("wss connect", "iceberg")})
|
}, function() {can.user.toast(can, "wss connect", "iceberg")})
|
||||||
},
|
},
|
||||||
}, [], function(can) {})
|
}, [], function(can) {})
|
||||||
Volcanos("onlayout", { _init: function(can, meta, list, cb, target) {
|
Volcanos("onlayout", { _init: function(can, meta, list, cb, target) {
|
||||||
|
@ -53,11 +53,11 @@ Volcanos("onaction", {help: "组件交互", list: [],
|
|||||||
can.Hide(), can.onaction.check(event, can, cb, "check", target)
|
can.Hide(), can.onaction.check(event, can, cb, "check", target)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
can.user.toast("用户或密码错误")
|
can.user.toast(can, "用户或密码错误")
|
||||||
})
|
})
|
||||||
}]},
|
}]},
|
||||||
{button: ["扫码登录", function(event, cmd) {
|
{button: ["扫码登录", function(event, cmd) {
|
||||||
can.user.toast({title: "请用微信扫码("+can._share+")", list: [{img: [can.user.Share(can, {
|
can.user.toast(can, {title: "请用微信扫码("+can._share+")", list: [{img: [can.user.Share(can, {
|
||||||
path: "/share/"+can._share+"/value",
|
path: "/share/"+can._share+"/value",
|
||||||
}, true)]}]})
|
}, true)]}]})
|
||||||
}]},
|
}]},
|
||||||
|
19
index.css
19
index.css
@ -135,8 +135,12 @@ fieldset>div.output>div.profile>div.item:hover {
|
|||||||
}
|
}
|
||||||
fieldset>div.output>pre.display {
|
fieldset>div.output>pre.display {
|
||||||
position:sticky; bottom:0;
|
position:sticky; bottom:0;
|
||||||
|
max-height:120px;
|
||||||
clear:both;
|
clear:both;
|
||||||
}
|
}
|
||||||
|
fieldset>div.output>pre.display:hover {
|
||||||
|
max-height:640px;
|
||||||
|
}
|
||||||
|
|
||||||
fieldset div.code {
|
fieldset div.code {
|
||||||
color:white;
|
color:white;
|
||||||
@ -185,10 +189,11 @@ fieldset table td.select {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.carte {
|
div.carte {
|
||||||
|
color:cyan;
|
||||||
background:black;
|
background:black;
|
||||||
border:solid 2px red;
|
border:solid 2px red;
|
||||||
position:absolute;
|
position:fixed;
|
||||||
z-index:10;
|
z-index:100;
|
||||||
}
|
}
|
||||||
div.carte div.item {
|
div.carte div.item {
|
||||||
padding:0 5px;
|
padding:0 5px;
|
||||||
@ -200,11 +205,11 @@ div.carte div.item:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.toast {
|
div.toast {
|
||||||
|
color:yellow;
|
||||||
background:black;
|
background:black;
|
||||||
border:solid 2px red;
|
border:solid 2px red;
|
||||||
position:absolute;
|
position:fixed;
|
||||||
padding:5px;
|
padding:5px;
|
||||||
color:yellow;
|
|
||||||
z-index:100;
|
z-index:100;
|
||||||
}
|
}
|
||||||
div.toast div.title {
|
div.toast div.title {
|
||||||
@ -220,14 +225,12 @@ div.toast div.duration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.upload {
|
div.upload {
|
||||||
|
color:yellow;
|
||||||
background:black;
|
background:black;
|
||||||
border:solid 2px red;
|
border:solid 2px red;
|
||||||
position:absolute;
|
position:fixed;
|
||||||
padding:5px;
|
padding:5px;
|
||||||
color:yellow;
|
|
||||||
z-index:100;
|
z-index:100;
|
||||||
left:20px;
|
|
||||||
top:20px;
|
|
||||||
}
|
}
|
||||||
div.upload div.item {
|
div.upload div.item {
|
||||||
float:left;
|
float:left;
|
||||||
|
@ -378,7 +378,7 @@ var page = Volcanos("page", {help: "网页模块",
|
|||||||
return text;
|
return text;
|
||||||
},
|
},
|
||||||
Download: function(can, name, value) {
|
Download: function(can, name, value) {
|
||||||
var timer = can.user.toast({title: "下载中...", width: 200,
|
var timer = can.user.toast(can, {title: "下载中...", width: 200,
|
||||||
text:'<a href="'+URL.createObjectURL(new Blob([value]))+'" target="_blank" download="'+name+'">'+name+'</a>',
|
text:'<a href="'+URL.createObjectURL(new Blob([value]))+'" target="_blank" download="'+name+'">'+name+'</a>',
|
||||||
})
|
})
|
||||||
can.page.Select(can, timer.toast.content, "a", function(item) {
|
can.page.Select(can, timer.toast.content, "a", function(item) {
|
||||||
|
161
lib/user.js
161
lib/user.js
@ -5,47 +5,153 @@ var user = Volcanos("user", {help: "用户模块",
|
|||||||
reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()},
|
reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()},
|
||||||
title: function(text) {return text && (document.title = text), document.title},
|
title: function(text) {return text && (document.title = text), document.title},
|
||||||
|
|
||||||
input: function(event, can, form, cb) { var button
|
login: function(can, cb) {
|
||||||
function cbs(event, button) { var data = {}
|
var ui = can.user.input({clientX: 200, clientY: 100}, can, [
|
||||||
var list = can.page.Select(can, view.table, "select,input,textarea", function(item) {
|
{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
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toast: function(can, text, title, duration) {
|
||||||
|
var meta = typeof text == "object"? text: {text: text, title: title, duration: duration}
|
||||||
|
var width = meta.width||200, height = meta.height||100
|
||||||
|
|
||||||
|
var ui = can.page.Append(can, document.body, [{view: "toast", style: {
|
||||||
|
width: width, bottom: 100, left: document.body.clientWidth/2-width/2,
|
||||||
|
}, list: [
|
||||||
|
{text: [meta.title||"", "div", "title"]},
|
||||||
|
typeof meta.text == "object"? meta.text: {text: [meta.text||"执行成功", "div", "content"]},
|
||||||
|
{view: ["button"], list: meta.button},
|
||||||
|
{text: ["", "div", "duration"]},
|
||||||
|
]}])
|
||||||
|
|
||||||
|
can.Timer({value: 1000, length: (meta.duration||3000)/1000}, function(event, interval, index) {
|
||||||
|
if (index > 2) { ui.duration.innerHTML = index+"s..." }
|
||||||
|
}, function() { can.page.Remove(can, ui.first) })
|
||||||
|
|
||||||
|
ui.Close = function() { can.page.Remove(can, ui.first) }
|
||||||
|
return ui
|
||||||
|
},
|
||||||
|
share: function(can, msg, cmd) {
|
||||||
|
can.run(msg._event, cmd||["action", "share"], function(msg) {
|
||||||
|
var src = can.user.Share(can, {_path: "/share/"+msg.Result()}, true)
|
||||||
|
var ui = can.user.toast(can, {title: can.page.Format("a", src, msg.Result()), text: can.page.Format("img", src+"/share"),
|
||||||
|
width: 300, height: 300, duration: 100000, button: [{button: ["确定", function(event) {
|
||||||
|
ui.Close()
|
||||||
|
}]}] })
|
||||||
|
})
|
||||||
|
},
|
||||||
|
carte: function(can, meta, list, cb) { meta = meta || can.ondetail, list = list && list.length > 0? list: meta.list; if (list.length == 0) { return }
|
||||||
|
meta = meta||can.ondetail||{}, cb = cb||function(ev, item, meta) {
|
||||||
|
var cb = can.ondetail[item] || can.onaction[item] || can.onkeymap&&can.onkeymap._remote
|
||||||
|
cb && cb(event, can, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
var x = event.clientX, y = event.clientY; y += 0; if (x > 600) { x -= 20 }
|
||||||
|
var ui = can.page.Append(can, document.body, [{view: "carte", style: {left: x+"px", top: y+"px"}, onmouseleave: function(event) {
|
||||||
|
can.page.Remove(can, ui.first)
|
||||||
|
}, list: can.core.List(list, function(item) {
|
||||||
|
return {view: "item", list: [typeof item == "string"? /* button */ {text: item, click: function(event) {
|
||||||
|
typeof cb == "function" && cb(event, item, meta)
|
||||||
|
}}: item.args? /* input */ {text: item.name, click: function(event) {
|
||||||
|
can.user.input(event, can, item.args, cb)
|
||||||
|
}}: /* select */ {select: [item, function(event) {
|
||||||
|
typeof cb == "function" && cb(event, event.target.value, meta)
|
||||||
|
}]} ]}
|
||||||
|
}) }])
|
||||||
|
|
||||||
|
event.stopPropagation()
|
||||||
|
event.preventDefault()
|
||||||
|
return ui
|
||||||
|
},
|
||||||
|
input: function(event, can, form, cb) {
|
||||||
|
function cbs(event, button) {
|
||||||
|
var data = {}; var list = can.page.Select(can, ui.table, "select,input,textarea", function(item) {
|
||||||
return data[item.name] = item.value
|
return data[item.name] = item.value
|
||||||
})
|
})
|
||||||
if (typeof cb == "function" && cb(event, button, data, list)) {
|
if (typeof cb == "function" && cb(event, button, data, list)) {
|
||||||
can.page.Remove(can, view.first)
|
can.page.Remove(can, ui.first)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var view = can.page.Append(can, document.body, [{view: ["input", "fieldset"], style: {left: event.clientX+"px", top: event.clientY+"px"}, list: [
|
var x = event.clientX, y = event.clientY; y += 10; if (x > 600) { x -= 160 }
|
||||||
|
var button; var ui = can.page.Append(can, document.body, [{view: ["input", "fieldset"], style: {left: x+"px", top: y+"px"}, list: [
|
||||||
{view: ["option", "table"], list: can.core.List(form, function(item) {
|
{view: ["option", "table"], list: can.core.List(form, function(item) {
|
||||||
if (item.button) { button = can.core.List(item.button, function(item) { return {button: typeof item == "object"? item: [item, function(event) {
|
if (item.button) { button = can.core.List(item.button, function(item) {
|
||||||
cbs(event, item)
|
return {button: typeof item == "object"? item: [item, function(event) { cbs(event, item) }]}
|
||||||
} ]} } ); return }
|
}); return }
|
||||||
return {type: ["tr"], list: [
|
return {type: ["tr"], list: [
|
||||||
{type: "td", list: [{text: typeof item == "string"?
|
{type: "td", list: [{text: typeof item == "string"? item: item.length > 0? item[0]: item.name || ""}]},
|
||||||
item: item.length > 0? item[0]: item.name || "",
|
{type: "td", list: [typeof item == "string"? /* input */ {input: item, data: {autofocus: true}}:
|
||||||
}]},
|
item.length > 0? /* select */ {select: [item]}:
|
||||||
{type: "td", list: [typeof item == "string"? {input: item, data: {autofocus: true}}:
|
item._input == "select"? /* select */ {select: [[item.name].concat(item.values)], data: item}:
|
||||||
item.length > 0? {select: [item]}:
|
item._input? /* input */ {type: "input", data: (item.type = item._input, item)}:
|
||||||
item._input == "select"? {select: [[item.name].concat(item.values)], data: item}:
|
/* other */ item,
|
||||||
item._input? {type: "input", data: (item.type = item._input, item)}: item,
|
|
||||||
]},
|
]},
|
||||||
]}
|
]}
|
||||||
})},
|
})},
|
||||||
{view: "action", list: button||[{button: ["提交", function(event) {
|
{view: "action", list: button||[{button: ["提交", function(event) {
|
||||||
cbs(event, "提交")
|
cbs(event, "提交")
|
||||||
}]}, {button: ["关闭", function(event, button) {
|
}]}, {button: ["关闭", function(event, button) {
|
||||||
can.page.Remove(can, view.first)
|
can.page.Remove(can, ui.first)
|
||||||
}]}]},
|
}]}]},
|
||||||
]}])
|
]}])
|
||||||
can.page.Select(can, view.first, "input", function(item, index) {
|
can.page.Select(can, ui.first, "input", function(item, index) {
|
||||||
index == 0 && (item.setSelectionRange(0, -1), item.focus())
|
index == 0 && (item.setSelectionRange(0, -1), item.focus())
|
||||||
})
|
})
|
||||||
return view
|
return ui
|
||||||
},
|
},
|
||||||
|
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: [
|
||||||
|
{view: "action"}, {view: "output"},
|
||||||
|
]}])
|
||||||
|
|
||||||
toast: function(text) {},
|
function show(event, value, total, loaded) {
|
||||||
carte: function(event, cb) {},
|
var now = new Date(); can.page.Appends(can, ui.output, [
|
||||||
login: function(cb) {},
|
{view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{
|
||||||
|
view: ["progress"], style: {height: "10px", width: value + "%", background: "red"},
|
||||||
|
}]},
|
||||||
|
{text: [value+"%", "div"], style: {"float": "right"}},
|
||||||
|
{text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}},
|
||||||
|
{text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}},
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
var action = can.page.AppendAction(can, ui.action, [
|
||||||
|
{type: "input", data: {name: "upload", type: "file", onchange: function(event) {
|
||||||
|
var file = action.upload.files[0]
|
||||||
|
show(event, 0, file.size, 0)
|
||||||
|
}}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) {
|
||||||
|
if (value == "关闭") { return can.page.Remove(can, ui.first) }
|
||||||
|
if (action.upload.files.length == 0) {return action.upload.focus()}
|
||||||
|
|
||||||
|
var msg = can.request(event)
|
||||||
|
can.core.Item(can.Option(), msg.Option)
|
||||||
|
|
||||||
|
// 上传文件
|
||||||
|
begin = new Date()
|
||||||
|
msg._progress = show
|
||||||
|
msg.upload = action.upload.files[0]
|
||||||
|
can.run(event, ["action", "upload"], function(msg) {
|
||||||
|
can.user.toast(can, "上传成功")
|
||||||
|
}, true)
|
||||||
|
})
|
||||||
|
action.upload.click()
|
||||||
|
return ui
|
||||||
|
},
|
||||||
|
|
||||||
Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; var path = location.pathname;
|
Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; var path = location.pathname;
|
||||||
obj._path && (path = obj._path, delete(obj._path))
|
obj._path && (path = obj._path, delete(obj._path))
|
||||||
@ -81,7 +187,6 @@ var user = Volcanos("user", {help: "用户模块",
|
|||||||
Searchs: shy("请求参数", function(can, key, def) {
|
Searchs: shy("请求参数", function(can, key, def) {
|
||||||
return can.user.Search(can, "active") == can._name? can.user.Search(can, key): def
|
return can.user.Search(can, "active") == can._name? can.user.Search(can, key): def
|
||||||
}),
|
}),
|
||||||
|
|
||||||
Cookie: shy("会话变量", function(can, key, value, path) {
|
Cookie: shy("会话变量", function(can, key, value, path) {
|
||||||
function set(k, v) {document.cookie = k+"="+v+";path="+(path||"/")}
|
function set(k, v) {document.cookie = k+"="+v+";path="+(path||"/")}
|
||||||
|
|
||||||
@ -101,12 +206,6 @@ var user = Volcanos("user", {help: "用户模块",
|
|||||||
var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie)
|
var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie)
|
||||||
return result && result.length > 0? result[1]: ""
|
return result && result.length > 0? result[1]: ""
|
||||||
}),
|
}),
|
||||||
|
|
||||||
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,
|
|
||||||
locals: function(can, key, value) {
|
locals: function(can, key, value) {
|
||||||
if (typeof key == "object") {
|
if (typeof key == "object") {
|
||||||
can.core.Item(key, function(key, value) {
|
can.core.Item(key, function(key, value) {
|
||||||
@ -121,5 +220,11 @@ var user = Volcanos("user", {help: "用户模块",
|
|||||||
return localStorage.getItem(key)
|
return localStorage.getItem(key)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
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,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"]
|
|||||||
value.pod||"", value.group||"", value.index, JSON.stringify(can.core.Item(sub.Option(), function(key, value) { return value })),
|
value.pod||"", value.group||"", value.index, JSON.stringify(can.core.Item(sub.Option(), function(key, value) { return value })),
|
||||||
JSON.stringify(sub.Option())
|
JSON.stringify(sub.Option())
|
||||||
])
|
])
|
||||||
can.onappend.share(can, msg, list)
|
can.user.share(can, msg, list)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "action";
|
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "action";
|
||||||
@ -37,12 +37,12 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg,
|
|||||||
// 插件回调
|
// 插件回调
|
||||||
return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) {
|
return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) {
|
||||||
can.run(msg._event, ["search", "Footer.onaction.ncmd"]);
|
can.run(msg._event, ["search", "Footer.onaction.ncmd"]);
|
||||||
can.onappend.toast(can, "执行成功", value.name, 2000);
|
can.user.toast(can, "执行成功", value.name, 2000);
|
||||||
typeof cb == "function" && cb(msg)
|
typeof cb == "function" && cb(msg)
|
||||||
}, silent)
|
}, silent)
|
||||||
}
|
}
|
||||||
sub._target.oncontextmenu = function(event) {
|
sub._target.oncontextmenu = function(event) {
|
||||||
can.onappend.carte(can, can.ondetail, can.ondetail.list, function(event, item, meta) {
|
can.user.carte(can, can.ondetail, can.ondetail.list, function(event, item, meta) {
|
||||||
// 菜单命令
|
// 菜单命令
|
||||||
meta[item] && meta[item](event, can, value, sub)
|
meta[item] && meta[item](event, can, value, sub)
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,25 @@
|
|||||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
|
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
|
||||||
|
document.body.onkeydown = function(event) { if (event.target != document.body) { return }
|
||||||
|
switch (event.key) {
|
||||||
|
case "n":
|
||||||
|
can.run(event, ["search", "River.onaction.create"])
|
||||||
|
break
|
||||||
|
case "m":
|
||||||
|
can.run(event, ["search", "Storm.onaction.create"])
|
||||||
|
break
|
||||||
|
case " ":
|
||||||
|
can.search.focus()
|
||||||
|
can.search.setSelectionRange(0, -1)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
event.stopPropagation()
|
||||||
|
event.preventDefault()
|
||||||
|
}
|
||||||
|
document.body.onkeyup = function(event) {
|
||||||
|
console.log(event)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
demo: function(can, msg, cmd, cb) {
|
demo: function(can, msg, cmd, cb) {
|
||||||
msg.Echo("hello demo world")
|
msg.Echo("hello demo world")
|
||||||
@ -14,23 +35,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg,
|
|||||||
}, target)
|
}, target)
|
||||||
}
|
}
|
||||||
can.run({}, ["check"], function(msg) { if (msg.Result()) { return init() }
|
can.run({}, ["check"], function(msg) { if (msg.Result()) { return init() }
|
||||||
var ui = can.user.input({}, can, [
|
can.user.login(can, init)
|
||||||
{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 init()
|
|
||||||
}
|
|
||||||
can.user.alert("用户或密码错误")
|
|
||||||
})
|
|
||||||
}], ["扫码", function(event) {
|
|
||||||
// TODO
|
|
||||||
}]]},
|
|
||||||
], function(event, button, data, list) {
|
|
||||||
// TODO
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
title: function(event, can, key) { var msg = can.request(event)
|
title: function(event, can, key) { var msg = can.request(event)
|
||||||
@ -68,11 +73,11 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg,
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
can.page.Append(can, can._output, [{view: "search", list: [{type: "input", onkeydown: function(event) {
|
can.search = can.page.Append(can, can._output, [{view: "search", list: [{type: "input", onkeydown: function(event) {
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
case "Enter": can.run(event, ["search", "Search.onimport.input", event.target.value]); break
|
case "Enter": can.run(event, ["search", "Search.onimport.input", event.target.value]); break
|
||||||
}
|
}
|
||||||
}, }], }])
|
}, }], }]).input
|
||||||
|
|
||||||
var height = document.body.offsetHeight
|
var height = document.body.offsetHeight
|
||||||
var ui = can.page.Append(can, can._output, can.core.List(["Search", "River", "Storm", "Footer"], function(item) {
|
var ui = can.page.Append(can, can._output, can.core.List(["Search", "River", "Storm", "Footer"], function(item) {
|
||||||
@ -99,7 +104,7 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg,
|
|||||||
ui.River.click()
|
ui.River.click()
|
||||||
} else {
|
} else {
|
||||||
// ui.River.click(), ui.Footer.click(), ui.Storm.click()
|
// ui.River.click(), ui.Footer.click(), ui.Storm.click()
|
||||||
ui.River.click(), ui.Footer.click()
|
// ui.River.click(), ui.Footer.click()
|
||||||
}
|
}
|
||||||
|
|
||||||
typeof cb == "function" && cb()
|
typeof cb == "function" && cb()
|
||||||
|
@ -1,21 +1,57 @@
|
|||||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
|
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, list, cb, target) {
|
Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: function(can, msg, list, cb, target) {
|
||||||
can.onexport._init(can, msg, list, cb, target)
|
can.onexport._init(can, msg, list, cb, target)
|
||||||
},
|
},
|
||||||
|
create: function(can) {
|
||||||
|
can.user.input(event, can, [["type", "public", "protected", "private"], "name", "text"], function(event, button, meta, list) {
|
||||||
|
can.run(event, ["action", "create"].concat(list), function(msg) {
|
||||||
|
can.user.Search(can, {"river": msg.Result()})
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"创建": function(event, can) {
|
||||||
|
can.onaction.create(can)
|
||||||
|
},
|
||||||
|
"刷新": function(event, can) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river")})
|
||||||
|
},
|
||||||
})
|
})
|
||||||
Volcanos("ondetail", {help: "菜单交互", list: ["添加用户", "重命名", "删除"], _init: function(can, msg, list, cb, target) {
|
Volcanos("ondetail", {help: "菜单交互", list: ["添加用户", "重命名", "共享", "删除"], _init: function(can, msg, list, cb, target) {
|
||||||
can.onexport._init(can, msg, list, cb, target)
|
can.onexport._init(can, msg, list, cb, target)
|
||||||
},
|
},
|
||||||
"添加用户": function(event, can, river, button) {
|
"添加用户": function(event, can, river, button) {
|
||||||
console.log(river, button)
|
can.run(event, ["search", "Search.onimport.select", "", "", "user"], function(list) {
|
||||||
|
var args = []; can.core.List(list, function(item) {
|
||||||
|
args = args.concat([item[4]])
|
||||||
|
})
|
||||||
|
can.run(event, [can.Conf("river"), "action", "user"].concat(args), function(msg) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river")})
|
||||||
|
})
|
||||||
|
})
|
||||||
},
|
},
|
||||||
"重命名": function(event, can, river, button) {
|
"重命名": function(event, can, river, button) {
|
||||||
console.log(river, button)
|
can.user.input(event, can, ["name"], function(event, button, meta, list) {
|
||||||
|
can.run(event, [river.key, "action", "rename", meta.name], function(msg) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river")})
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"共享": function(event, can, value) {
|
||||||
|
can.user.input(event, can, ["name"], function(event, button, meta, list) {
|
||||||
|
var msg = can.request(event)
|
||||||
|
can.user.share(can, msg, [value.key, "action", "share", meta.name])
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
"删除": function(event, can, river, button) {
|
"删除": function(event, can, river, button) {
|
||||||
console.log(river, button)
|
can.run(event, [river.key, "action", "remove"], function(msg) {
|
||||||
|
can.user.Search(can, {})
|
||||||
|
})
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "river"
|
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "river"
|
||||||
|
@ -4,9 +4,13 @@ fieldset.Search {
|
|||||||
left:120px;
|
left:120px;
|
||||||
top:40px;
|
top:40px;
|
||||||
background:black;
|
background:black;
|
||||||
|
z-index:102;
|
||||||
|
}
|
||||||
|
fieldset.Search div.output div.content:hover {
|
||||||
|
max-height:400px;
|
||||||
}
|
}
|
||||||
fieldset.Search div.output div.content {
|
fieldset.Search div.output div.content {
|
||||||
max-width:1000px;
|
max-height:200px;
|
||||||
overflow:auto;
|
overflow:auto;
|
||||||
}
|
}
|
||||||
fieldset.Search div.output div.display {
|
fieldset.Search div.output div.display {
|
||||||
|
@ -3,6 +3,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta,
|
|||||||
},
|
},
|
||||||
|
|
||||||
input: function(can, msg, cmd, cb) { can._output.innerHTML = ""
|
input: function(can, msg, cmd, cb) { can._output.innerHTML = ""
|
||||||
|
can.cb = cb
|
||||||
can.ui = can.page.Append(can, can._output, [{view: "content"}, {view: "display"}])
|
can.ui = can.page.Append(can, can._output, [{view: "content"}, {view: "display"}])
|
||||||
can.page.Modify(can, can._target, {style: {display: "block"}})
|
can.page.Modify(can, can._target, {style: {display: "block"}})
|
||||||
|
|
||||||
@ -10,6 +11,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta,
|
|||||||
can.run({}, cmd, function(msg) {
|
can.run({}, cmd, function(msg) {
|
||||||
can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) {
|
can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) {
|
||||||
return {text: [value, "td"], onclick: function(event) {
|
return {text: [value, "td"], onclick: function(event) {
|
||||||
|
can.Status("index", index)
|
||||||
|
can.Status("value", value)
|
||||||
can.run(event, [line.type, line.name, line.text], function(msg) {
|
can.run(event, [line.type, line.name, line.text], function(msg) {
|
||||||
can.ui.display.innerHTML = ""
|
can.ui.display.innerHTML = ""
|
||||||
can.onappend.table(can, can.ui.display, "table", msg)
|
can.onappend.table(can, can.ui.display, "table", msg)
|
||||||
@ -18,22 +21,71 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta,
|
|||||||
}}
|
}}
|
||||||
ca.run(event, [""])
|
ca.run(event, [""])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
can.Status("count", msg.append && msg.append[0] && msg[msg.append[0]].length || 0)
|
||||||
can.onappend.board(can, can.ui.content, "board", msg)
|
can.onappend.board(can, can.ui.content, "board", msg)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
select: function(can, msg, cmd, cb) { can._output.innerHTML = ""
|
||||||
|
function search(word) { cmd[0] = word
|
||||||
|
can.run({}, [cmd.join(";")], function(msg) { can.ui.content.innerHTML = ""
|
||||||
|
can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) {
|
||||||
|
return {text: [value, "td"], onclick: function(event) {
|
||||||
|
can.Status("index", index)
|
||||||
|
can.Status("value", value)
|
||||||
|
|
||||||
|
can.page.Append(can, can.ui.table, [{td: [line.pod, line.ctx, line.cmd, line.type, line.name, line.text], data: {index: index}, onclick: function(event) {
|
||||||
|
can.page.Remove(can, event.target.parentNode)
|
||||||
|
}}])
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
can.cb = function() {
|
||||||
|
typeof cb == "function" && cb(can.page.Select(can, can.ui.display, "tr", function(tr) {
|
||||||
|
return can.page.Select(can, tr, "td", function(td) {
|
||||||
|
return td.innerHTML
|
||||||
|
})
|
||||||
|
}).slice(1))
|
||||||
|
can.onaction.close(can)
|
||||||
|
}, can.ui = can.page.Append(can, can._output, [
|
||||||
|
{input: ["word", function(event) {
|
||||||
|
if (event.key == "Enter") { search(event.target.value)
|
||||||
|
var list = can.page.Select(can, can.ui.content, "tr")
|
||||||
|
if (list.length == 2) {
|
||||||
|
list[1].firstChild.click()
|
||||||
|
event.target.setSelectionRange(0, -1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]},
|
||||||
|
{view: "content"}, {view: "display", list: [{type: "table", list: [{th: ["pod", "ctx", "cmd", "type", "name", "text"]}]}]},
|
||||||
|
])
|
||||||
|
can.page.Modify(can, can._target, {style: {display: "block"}})
|
||||||
|
can.ui.input.focus()
|
||||||
|
search(cmd[0])
|
||||||
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "下载", "渲染", "执行", "收藏", "搜索"], _init: function(can, msg, list, cb, target) {
|
Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "完成"], _init: function(can, msg, list, cb, target) {
|
||||||
can.onexport._init(can, msg, list, cb, target)
|
can.onexport._init(can, msg, list, cb, target)
|
||||||
},
|
},
|
||||||
"关闭": function(event, can, key) {
|
close: function(can) {
|
||||||
can.page.Modify(can, can._target, {style: {display: "none"}})
|
can.page.Modify(can, can._target, {style: {display: "none"}})
|
||||||
},
|
},
|
||||||
|
"关闭": function(event, can, key) {
|
||||||
|
can.onaction.close(can)
|
||||||
|
},
|
||||||
|
"清空": function(event, can, key) {
|
||||||
|
can._output.innerHTML = ""
|
||||||
|
},
|
||||||
|
"完成": function(event, can, key) { can.cb() },
|
||||||
})
|
})
|
||||||
Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"],
|
Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"],
|
||||||
"共享": function(event, can, value, sub) { var msg = sub.request(event)
|
"共享": function(event, can, value, sub) { var msg = sub.request(event)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) {
|
Volcanos("onexport", {help: "导出数据", list: ["count", "index", "value"], _init: function(can, msg, list, cb, target) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -1,17 +1,54 @@
|
|||||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
|
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
|
Volcanos("onaction", {help: "交互操作", list: ["创建", "刷新"], _init: function(can, msg, list, cb, target) {
|
||||||
can.onexport._init(can, msg, list, cb, target)
|
can.onexport._init(can, msg, list, cb, target)
|
||||||
},
|
},
|
||||||
|
create: function(can) {
|
||||||
|
can.user.input(event, can, [["type", "public", "protected", "private"], "name", "text"], function(event, button, meta, list) {
|
||||||
|
can.run(event, [can.Conf("river"), can.Conf("storm"), "action", "create"].concat(list), function(msg) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river"), "storm": msg.Result()})
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"创建": function(event, can) {
|
||||||
|
can.onaction.create(can)
|
||||||
|
},
|
||||||
|
"刷新": function(event, can) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")})
|
||||||
|
},
|
||||||
})
|
})
|
||||||
Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"],
|
Volcanos("ondetail", {help: "交互菜单", list: ["添加工具", "重命名", "共享", "删除"],
|
||||||
|
"添加工具": function(event, can, value) {
|
||||||
|
can.run(event, ["search", "Search.onimport.select", "", "", "command"], function(list) {
|
||||||
|
var args = []; can.core.List(list, function(item) {
|
||||||
|
args = args.concat([item[0], item[5], item[4], ""])
|
||||||
|
})
|
||||||
|
can.run(event, [can.Conf("river"), can.Conf("storm"), "action", "tool"].concat(args), function(msg) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
"重命名": function(event, can, value) {
|
||||||
|
can.user.input(event, can, ["name"], function(event, button, meta, list) {
|
||||||
|
can.run(event, [can.Conf("river"), value.key, "action", "rename", meta.name], function(msg) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river"), "storm": can.Conf("storm")})
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
},
|
||||||
"共享": function(event, can, value) {
|
"共享": function(event, can, value) {
|
||||||
var msg = can.request(event)
|
can.user.input(event, can, ["name"], function(event, button, meta, list) {
|
||||||
msg.Option("name", "storm")
|
var msg = can.request(event)
|
||||||
msg.Option("storm", can.Conf("storm"))
|
can.user.share(can, msg, [can.Conf("river"), value.key, "action", "share", meta.name])
|
||||||
msg.Option("river", can.Conf("river"))
|
return true
|
||||||
can.onappend.share(can, msg)
|
})
|
||||||
|
},
|
||||||
|
"删除": function(event, can, value) {
|
||||||
|
can.run(event, [can.Conf("river"), value.key, "action", "remove"], function(msg) {
|
||||||
|
can.user.Search(can, {"river": can.Conf("river")})
|
||||||
|
})
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "storm"
|
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { var key = "storm"
|
||||||
@ -31,7 +68,12 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg,
|
|||||||
can.onappend.menu(can, msg, value)
|
can.onappend.menu(can, msg, value)
|
||||||
})
|
})
|
||||||
|
|
||||||
if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) { select = view }
|
if (index == 0 || [value.key, value.name].indexOf(can.user.Search(can, key)) > -1) {
|
||||||
|
select = view
|
||||||
|
if (!value.count) {
|
||||||
|
can.ondetail["添加工具"]({}, can, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
}); select && select.click() })
|
}); select && select.click() })
|
||||||
},
|
},
|
||||||
key: function(can, msg) { msg.Option("storm", can.Conf("storm")) },
|
key: function(can, msg) { msg.Option("storm", can.Conf("storm")) },
|
||||||
|
@ -31,7 +31,7 @@ Volcanos("onfigure", {help: "控件详情", list: [],
|
|||||||
msg._progress = show
|
msg._progress = show
|
||||||
msg.upload = action.upload.files[0];
|
msg.upload = action.upload.files[0];
|
||||||
can.run(event, ["action", "upload"], function(msg) {
|
can.run(event, ["action", "upload"], function(msg) {
|
||||||
can.user.toast("上传成功")
|
can.user.toast(can, "上传成功")
|
||||||
}, true);
|
}, true);
|
||||||
})
|
})
|
||||||
}},
|
}},
|
||||||
|
@ -71,7 +71,7 @@ fieldset.editor>div.output div.content>pre.item span.string {
|
|||||||
}
|
}
|
||||||
fieldset.editor>div.output pre.display {
|
fieldset.editor>div.output pre.display {
|
||||||
padding:6px; border:solid 1px red;
|
padding:6px; border:solid 1px red;
|
||||||
max-height:80px; overflow:auto;
|
max-height:120px; overflow:auto;
|
||||||
position:sticky; bottom:0;
|
position:sticky; bottom:0;
|
||||||
display:none;
|
display:none;
|
||||||
clear:both;
|
clear:both;
|
||||||
@ -79,7 +79,7 @@ fieldset.editor>div.output pre.display {
|
|||||||
}
|
}
|
||||||
fieldset.editor>div.output pre.display:hover {
|
fieldset.editor>div.output pre.display:hover {
|
||||||
background-color:black;
|
background-color:black;
|
||||||
max-height:360px;
|
max-height:640px;
|
||||||
z-index:10;
|
z-index:10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
|
|||||||
}, ondblclick: function(event) {
|
}, ondblclick: function(event) {
|
||||||
can.onkeymap._remote(event, can, "运行")
|
can.onkeymap._remote(event, can, "运行")
|
||||||
}, oncontextmenu: function(event) {
|
}, oncontextmenu: function(event) {
|
||||||
can.onappend.carte(can, null, ["保存", "运行"])
|
can.user.carte(can, null, ["保存", "运行"])
|
||||||
}}]).first.click()
|
}}]).first.click()
|
||||||
}, true)
|
}, true)
|
||||||
},
|
},
|
||||||
@ -102,7 +102,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
|
|||||||
// plugin
|
// plugin
|
||||||
function init(p) { p.display && can.onkeymap._remote({}, can, "运行")
|
function init(p) { p.display && can.onkeymap._remote({}, can, "运行")
|
||||||
typeof p.display == "object" && ( p.display.height && can.page.Modify(can, can.ui.display, {style: {
|
typeof p.display == "object" && ( p.display.height && can.page.Modify(can, can.ui.display, {style: {
|
||||||
"max-height": p.display.height,
|
// "max-height": p.display.height,
|
||||||
}}))
|
}}))
|
||||||
}; var p = can.onsyntax[can.parse]; !p? can.run({}, ["action", "plug", can.Option("path"), can.Option("file")], function(msg) {
|
}; var p = can.onsyntax[can.parse]; !p? can.run({}, ["action", "plug", can.Option("path"), can.Option("file")], function(msg) {
|
||||||
p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()), can.onsyntax._init(can, can._msg), init(p)
|
p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()), can.onsyntax._init(can, can._msg), init(p)
|
||||||
@ -316,8 +316,25 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
|
|||||||
png: {
|
png: {
|
||||||
line: function(can, line) { return can.page.Format("img", "/share/local/"+line) }
|
line: function(can, line) { return can.page.Format("img", "/share/local/"+line) }
|
||||||
},
|
},
|
||||||
|
url: {
|
||||||
|
line: function(can, line) {
|
||||||
|
return {button: [line, function(event) {
|
||||||
|
can.page.Appends(can, can.ui.display, [{type: "iframe", data: {src: line}, style: {
|
||||||
|
height: "600px", width: can.Conf("width")-80+"px",
|
||||||
|
}}])
|
||||||
|
}]}
|
||||||
|
// return {type: "iframe", data: {src: line}, style: {height: "200px", width: can.Conf("width")-80+"px"}}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
svg: {
|
||||||
|
show: function(can) {
|
||||||
|
can.page.Append(can, can.ui.display, can.core.List(can._msg.result, function(line) {
|
||||||
|
return {type: "iframe", data: {src: "/share/local/"+line}, style: {width: can.Conf("width")-80+"px"}}
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
},
|
||||||
jpg: {
|
jpg: {
|
||||||
show: function(can, line) {
|
show: function(can) {
|
||||||
can.page.Append(can, can.ui.display, can.core.List(can._msg.result, function(line) {
|
can.page.Append(can, can.ui.display, can.core.List(can._msg.result, function(line) {
|
||||||
return {img: "/share/local/"+line}
|
return {img: "/share/local/"+line}
|
||||||
}))
|
}))
|
||||||
@ -339,20 +356,20 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
url: {
|
// url: {
|
||||||
line: function(can, line) { var auto = true, loop = true, total = 0
|
// line: function(can, line) { var auto = true, loop = true, total = 0
|
||||||
function cb(event) { console.log(event) }
|
// function cb(event) { console.log(event) }
|
||||||
return {className: "preview", type: "video", style: {height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"},
|
// return {className: "preview", type: "video", style: {height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"},
|
||||||
data: {src: line, controls: "controls", autoplay: auto, loop: loop},
|
// data: {src: line, controls: "controls", autoplay: auto, loop: loop},
|
||||||
oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
|
// oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
|
||||||
onloadedmetadata: function(event) { total = event.timeStamp
|
// onloadedmetadata: function(event) { total = event.timeStamp
|
||||||
event.target.currentTime = can._msg.currentTime || 0
|
// event.target.currentTime = can._msg.currentTime || 0
|
||||||
}, onloadeddata: cb, ontimeupdate: function(event) {
|
// }, onloadeddata: cb, ontimeupdate: function(event) {
|
||||||
can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
|
// can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
|
||||||
},
|
// },
|
||||||
}
|
// }
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
})
|
})
|
||||||
Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"], _init: function(can, mode) {
|
Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"], _init: function(can, mode) {
|
||||||
can.page.Modify(can, can.ui.command, {style: {display: "none", width: can._target.offsetWidth-20+"px"}})
|
can.page.Modify(can, can.ui.command, {style: {display: "none", width: can._target.offsetWidth-20+"px"}})
|
||||||
@ -601,11 +618,11 @@ Volcanos("onaction", {help: "控件交互", list: [
|
|||||||
}, true)
|
}, true)
|
||||||
|
|
||||||
}, function() {
|
}, function() {
|
||||||
can.onappend.toast(can, "执行成功")
|
can.user.toast(can, "执行成功")
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
"项目": function(event, can) { can.onlayout.project(can) },
|
"项目": function(event, can) { can.onlayout.project(can) },
|
||||||
"上传": function(event, can) { can.onappend.upload(can) },
|
"上传": function(event, can) { can.user.upload(event, can) },
|
||||||
"搜索": function(event, can) { can.onkeymap._remote(event, can, "搜索", ["action", "find", "vim.history", "", "id", "type", "name", "text"]) },
|
"搜索": function(event, can) { can.onkeymap._remote(event, can, "搜索", ["action", "find", "vim.history", "", "id", "type", "name", "text"]) },
|
||||||
"记录": function(event, can) { var sub = can.request(event)
|
"记录": function(event, can) { var sub = can.request(event)
|
||||||
can.core.Item(can.Option(), sub.Option)
|
can.core.Item(can.Option(), sub.Option)
|
||||||
|
@ -73,7 +73,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
|
|||||||
can.onaction.pluginTask(event, can, task)
|
can.onaction.pluginTask(event, can, task)
|
||||||
},
|
},
|
||||||
oncontextmenu: function(event) { var target = event.target
|
oncontextmenu: function(event) { var target = event.target
|
||||||
can.onappend.carte(can, can.ondetail, can.ondetail.list, function(event, item) {
|
can.user.carte(can, can.ondetail, can.ondetail.list, function(event, item) {
|
||||||
can.onaction.modifyTask(event, can, task, "status", item)
|
can.onaction.modifyTask(event, can, task, "status", item)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -91,7 +91,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
oncontextmenu: function(event) { var target = event.target
|
oncontextmenu: function(event) { var target = event.target
|
||||||
can.onappend.carte(can, can.ondetail, ["编辑"].concat(can.ondetail.list), function(event, item, meta) {
|
can.user.carte(can, can.ondetail, ["编辑"].concat(can.ondetail.list), function(event, item, meta) {
|
||||||
switch (item) {
|
switch (item) {
|
||||||
case "编辑":
|
case "编辑":
|
||||||
can.onappend.modify(can, target, function(ev, value, old) {
|
can.onappend.modify(can, target, function(ev, value, old) {
|
||||||
@ -244,7 +244,7 @@ Volcanos("onaction", {help: "组件交互", list: ["统计", "添加", "详情",
|
|||||||
{name: "end_time", type: "input", value: can.base.Time(can.base.TimeAdd(now, (now.getHours()+1)/24)), onclick: date},
|
{name: "end_time", type: "input", value: can.base.Time(can.base.TimeAdd(now, (now.getHours()+1)/24)), onclick: date},
|
||||||
], function(event, button, data, list) {
|
], function(event, button, data, list) {
|
||||||
can.run(event, ["action", "insert"].concat(list), function(msg) {
|
can.run(event, ["action", "insert"].concat(list), function(msg) {
|
||||||
can.onappend.toast(can, "添加成功")
|
can.user.toast(can, "添加成功")
|
||||||
can.run({})
|
can.run({})
|
||||||
}, true)
|
}, true)
|
||||||
return true
|
return true
|
||||||
@ -255,7 +255,7 @@ Volcanos("onaction", {help: "组件交互", list: ["统计", "添加", "详情",
|
|||||||
var msg = can.request(event); msg.Option(task)
|
var msg = can.request(event); msg.Option(task)
|
||||||
can.run(event, ["action", "modify", key, value, task[key]], function(msg) {
|
can.run(event, ["action", "modify", key, value, task[key]], function(msg) {
|
||||||
task[key] = value, can.onimport._profile(can, can._msg, task)
|
task[key] = value, can.onimport._profile(can, can._msg, task)
|
||||||
can.onappend.toast(can, "修改成功")
|
can.user.toast(can, "修改成功")
|
||||||
}, true)
|
}, true)
|
||||||
},
|
},
|
||||||
pluginTask: function(event, can, task, key) {
|
pluginTask: function(event, can, task, key) {
|
||||||
|
@ -4,7 +4,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
|
|||||||
])
|
])
|
||||||
can.table = can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) {
|
can.table = can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) {
|
||||||
return {text: [value, "td"], oncontextmenu: function(event) {
|
return {text: [value, "td"], oncontextmenu: function(event) {
|
||||||
can.onappend.carte(can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) {
|
can.user.carte(can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) {
|
||||||
var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line)
|
var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line)
|
||||||
})
|
})
|
||||||
}, ondblclick: function(event) {
|
}, ondblclick: function(event) {
|
||||||
@ -55,7 +55,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", ["mode", "正常",
|
|||||||
|
|
||||||
"保存": function(event, can, cmd) {
|
"保存": function(event, can, cmd) {
|
||||||
can.run(event, ["action", cmd, can.Option("path"), can.onexport.file(can)], function(msg) {
|
can.run(event, ["action", cmd, can.Option("path"), can.onexport.file(can)], function(msg) {
|
||||||
can.user.toast("保存成功")
|
can.user.toast(can, "保存成功")
|
||||||
}, true)
|
}, true)
|
||||||
},
|
},
|
||||||
"正常": function(event, can, cmd) {
|
"正常": function(event, can, cmd) {
|
||||||
|
@ -536,7 +536,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", "清空", "删除",
|
|||||||
"保存": function(event, can, key) { var msg = can.request(event)
|
"保存": function(event, can, key) { var msg = can.request(event)
|
||||||
msg.Option("content", can.onexport.file(can, can.svg))
|
msg.Option("content", can.onexport.file(can, can.svg))
|
||||||
can.run(event, ["action", key, can.Option("path")], function() {
|
can.run(event, ["action", key, can.Option("path")], function() {
|
||||||
can.user.toast("保存成功")
|
can.user.toast(can, "保存成功")
|
||||||
}, true)
|
}, true)
|
||||||
},
|
},
|
||||||
"清空": function(event, can) {
|
"清空": function(event, can) {
|
||||||
@ -731,7 +731,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", "清空", "删除",
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
_menu: function(event, can, target) { var figure = can.onaction._get(can, target)
|
_menu: function(event, can, target) { var figure = can.onaction._get(can, target)
|
||||||
can.onappend.carte(event, can.ondetail, figure.data.detail||can.ondetail.list, function(event, key, meta) {
|
can.user.carte(event, can.ondetail, figure.data.detail||can.ondetail.list, function(event, key, meta) {
|
||||||
typeof cb == "function" && cb(event, can, figure, key, target)
|
typeof cb == "function" && cb(event, can, figure, key, target)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -82,7 +82,7 @@ Volcanos("onfigure", {help: "组件菜单", list: [],
|
|||||||
})
|
})
|
||||||
|
|
||||||
Volcanos("onaction", {help: "组件菜单", list: ["", "上传", "收藏"],
|
Volcanos("onaction", {help: "组件菜单", list: ["", "上传", "收藏"],
|
||||||
"上传": function(event, can) { can.onappend.upload(can) },
|
"上传": function(event, can) { can.user.upload(event, can) },
|
||||||
"收藏": function(event, can) {
|
"收藏": function(event, can) {
|
||||||
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
|
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
|
||||||
chrome.tabs.sendMessage(tabs[0].id, { action: "copy" }, function (response) {
|
chrome.tabs.sendMessage(tabs[0].id, { action: "copy" }, function (response) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user