1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
This commit is contained in:
shaoying 2020-06-30 18:10:22 +08:00
parent 51635036cd
commit 7d0876c419
18 changed files with 382 additions and 234 deletions

132
frame.js
View File

@ -105,6 +105,7 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) {
can.core.Item(river.storm, function(key, value) {
msg.Push("key", key)
msg.Push("name", value.name)
msg.Push("count", (value.index||value.action).length)
})
typeof cb == "function" && cb(msg)
return true
@ -199,6 +200,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
meta.detail = meta.feature["detail"] || {}
sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field)
sub.onappend._status(sub, status)
// 添加控件
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) {
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)
})
})
@ -355,7 +357,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
},
menu: function(can, msg, value) {
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)
})
})
@ -450,7 +452,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
run(event, "编辑", value)
})
}, 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) {
case "编辑":
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()))
},
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
var ui = can.page.Appends(can, target, [{type: "input", value: back, onkeydown: function(event) {
switch (event.key) {
@ -606,9 +490,9 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
},
daemon: function(can, name) {
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
default:
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)
}
}, function() {can.user.toast("wss connect", "iceberg")})
}, function() {can.user.toast(can, "wss connect", "iceberg")})
},
}, [], function(can) {})
Volcanos("onlayout", { _init: function(can, meta, list, cb, target) {

View File

@ -53,11 +53,11 @@ Volcanos("onaction", {help: "组件交互", list: [],
can.Hide(), can.onaction.check(event, can, cb, "check", target)
return
}
can.user.toast("用户或密码错误")
can.user.toast(can, "用户或密码错误")
})
}]},
{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",
}, true)]}]})
}]},

View File

@ -135,8 +135,12 @@ fieldset>div.output>div.profile>div.item:hover {
}
fieldset>div.output>pre.display {
position:sticky; bottom:0;
max-height:120px;
clear:both;
}
fieldset>div.output>pre.display:hover {
max-height:640px;
}
fieldset div.code {
color:white;
@ -185,10 +189,11 @@ fieldset table td.select {
}
div.carte {
color:cyan;
background:black;
border:solid 2px red;
position:absolute;
z-index:10;
position:fixed;
z-index:100;
}
div.carte div.item {
padding:0 5px;
@ -200,11 +205,11 @@ div.carte div.item:hover {
}
div.toast {
color:yellow;
background:black;
border:solid 2px red;
position:absolute;
position:fixed;
padding:5px;
color:yellow;
z-index:100;
}
div.toast div.title {
@ -220,14 +225,12 @@ div.toast div.duration {
}
div.upload {
color:yellow;
background:black;
border:solid 2px red;
position:absolute;
position:fixed;
padding:5px;
color:yellow;
z-index:100;
left:20px;
top:20px;
}
div.upload div.item {
float:left;

View File

@ -378,7 +378,7 @@ var page = Volcanos("page", {help: "网页模块",
return text;
},
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>',
})
can.page.Select(can, timer.toast.content, "a", function(item) {

View File

@ -5,47 +5,153 @@ var user = Volcanos("user", {help: "用户模块",
reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()},
title: function(text) {return text && (document.title = text), document.title},
input: function(event, can, form, cb) { var button
function cbs(event, button) { var data = {}
var list = can.page.Select(can, view.table, "select,input,textarea", function(item) {
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
})
},
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
})
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) {
if (item.button) { button = can.core.List(item.button, function(item) { return {button: typeof item == "object"? item: [item, function(event) {
cbs(event, item)
} ]} } ); return }
if (item.button) { button = can.core.List(item.button, function(item) {
return {button: typeof item == "object"? item: [item, function(event) { cbs(event, item) }]}
}); return }
return {type: ["tr"], list: [
{type: "td", list: [{text: typeof item == "string"?
item: item.length > 0? item[0]: item.name || "",
}]},
{type: "td", list: [typeof item == "string"? {input: item, data: {autofocus: true}}:
item.length > 0? {select: [item]}:
item._input == "select"? {select: [[item.name].concat(item.values)], data: item}:
item._input? {type: "input", data: (item.type = item._input, item)}: item,
{type: "td", list: [{text: typeof item == "string"? 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]}:
item._input == "select"? /* select */ {select: [[item.name].concat(item.values)], data: item}:
item._input? /* input */ {type: "input", data: (item.type = item._input, item)}:
/* other */ item,
]},
]}
})},
{view: "action", list: button||[{button: ["提交", function(event) {
cbs(event, "提交")
}]}, {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())
})
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) {},
carte: function(event, cb) {},
login: function(cb) {},
function show(event, value, total, loaded) {
var now = new Date(); can.page.Appends(can, ui.output, [
{view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{
view: ["progress"], style: {height: "10px", width: value + "%", background: "red"},
}]},
{text: [value+"%", "div"], style: {"float": "right"}},
{text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}},
{text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}},
])
}
var action = can.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;
obj._path && (path = obj._path, delete(obj._path))
@ -81,7 +187,6 @@ var user = Volcanos("user", {help: "用户模块",
Searchs: shy("请求参数", function(can, key, def) {
return can.user.Search(can, "active") == can._name? can.user.Search(can, key): def
}),
Cookie: shy("会话变量", function(can, key, value, 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)
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) {
if (typeof key == "object") {
can.core.Item(key, function(key, value) {
@ -121,5 +220,11 @@ var user = Volcanos("user", {help: "用户模块",
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,
})

View File

@ -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 })),
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";
@ -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) {
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)
}, silent)
}
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)
})

View File

@ -1,4 +1,25 @@
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) {
msg.Echo("hello demo world")
@ -14,23 +35,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg,
}, target)
}
can.run({}, ["check"], function(msg) { if (msg.Result()) { return init() }
var ui = can.user.input({}, 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 init()
}
can.user.alert("用户或密码错误")
})
}], ["扫码", function(event) {
// TODO
}]]},
], function(event, button, data, list) {
// TODO
})
can.user.login(can, init)
})
},
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) {
case "Enter": can.run(event, ["search", "Search.onimport.input", event.target.value]); break
}
}, }], }])
}, }], }]).input
var height = document.body.offsetHeight
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()
} else {
// 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()

View File

@ -1,21 +1,57 @@
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)
},
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()})
})
Volcanos("ondetail", {help: "菜单交互", list: ["添加用户", "重命名", "删除"], _init: function(can, msg, list, cb, target) {
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) {
can.onexport._init(can, msg, list, cb, target)
},
"添加用户": 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) {
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) {
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"

View File

@ -4,9 +4,13 @@ fieldset.Search {
left:120px;
top:40px;
background:black;
z-index:102;
}
fieldset.Search div.output div.content:hover {
max-height:400px;
}
fieldset.Search div.output div.content {
max-width:1000px;
max-height:200px;
overflow:auto;
}
fieldset.Search div.output div.display {

View File

@ -3,6 +3,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta,
},
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.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.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.run(event, [line.type, line.name, line.text], function(msg) {
can.ui.display.innerHTML = ""
can.onappend.table(can, can.ui.display, "table", msg)
@ -18,22 +21,71 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta,
}}
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)
})
},
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)
}}])
}}
})
Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "下载", "渲染", "执行", "收藏", "搜索"], _init: function(can, msg, list, cb, target) {
})
}
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) {
can.onexport._init(can, msg, list, cb, target)
},
"关闭": function(event, can, key) {
close: function(can) {
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: ["共享", "更名", "删除"],
"共享": 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) {
},
})

View File

@ -1,17 +1,54 @@
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)
},
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()})
})
Volcanos("ondetail", {help: "交互菜单", list: ["共享", "更名", "删除"],
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: ["添加工具", "重命名", "共享", "删除"],
"添加工具": 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) {
can.user.input(event, can, ["name"], function(event, button, meta, list) {
var msg = can.request(event)
msg.Option("name", "storm")
msg.Option("storm", can.Conf("storm"))
msg.Option("river", can.Conf("river"))
can.onappend.share(can, msg)
can.user.share(can, msg, [can.Conf("river"), value.key, "action", "share", meta.name])
return true
})
},
"删除": 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"
@ -31,7 +68,12 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg,
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() })
},
key: function(can, msg) { msg.Option("storm", can.Conf("storm")) },

View File

@ -31,7 +31,7 @@ Volcanos("onfigure", {help: "控件详情", list: [],
msg._progress = show
msg.upload = action.upload.files[0];
can.run(event, ["action", "upload"], function(msg) {
can.user.toast("上传成功")
can.user.toast(can, "上传成功")
}, true);
})
}},

View File

@ -71,7 +71,7 @@ fieldset.editor>div.output div.content>pre.item span.string {
}
fieldset.editor>div.output pre.display {
padding:6px; border:solid 1px red;
max-height:80px; overflow:auto;
max-height:120px; overflow:auto;
position:sticky; bottom:0;
display:none;
clear:both;
@ -79,7 +79,7 @@ fieldset.editor>div.output pre.display {
}
fieldset.editor>div.output pre.display:hover {
background-color:black;
max-height:360px;
max-height:640px;
z-index:10;
}

View File

@ -54,7 +54,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
}, ondblclick: function(event) {
can.onkeymap._remote(event, can, "运行")
}, oncontextmenu: function(event) {
can.onappend.carte(can, null, ["保存", "运行"])
can.user.carte(can, null, ["保存", "运行"])
}}]).first.click()
}, true)
},
@ -102,7 +102,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
// plugin
function init(p) { p.display && can.onkeymap._remote({}, can, "运行")
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) {
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: {
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: {
show: function(can, line) {
show: function(can) {
can.page.Append(can, can.ui.display, can.core.List(can._msg.result, function(line) {
return {img: "/share/local/"+line}
}))
@ -339,20 +356,20 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
}
},
},
url: {
line: function(can, line) { var auto = true, loop = true, total = 0
function cb(event) { console.log(event) }
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},
oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
onloadedmetadata: function(event) { total = event.timeStamp
event.target.currentTime = can._msg.currentTime || 0
}, onloadeddata: cb, ontimeupdate: function(event) {
can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
},
}
},
},
// url: {
// line: function(can, line) { var auto = true, loop = true, total = 0
// function cb(event) { console.log(event) }
// 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},
// oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
// onloadedmetadata: function(event) { total = event.timeStamp
// event.target.currentTime = can._msg.currentTime || 0
// }, onloadeddata: cb, ontimeupdate: function(event) {
// 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) {
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)
}, function() {
can.onappend.toast(can, "执行成功")
can.user.toast(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) { var sub = can.request(event)
can.core.Item(can.Option(), sub.Option)

View File

@ -73,7 +73,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onaction.pluginTask(event, can, task)
},
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)
})
},
@ -91,7 +91,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})
},
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) {
case "编辑":
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},
], function(event, button, data, list) {
can.run(event, ["action", "insert"].concat(list), function(msg) {
can.onappend.toast(can, "添加成功")
can.user.toast(can, "添加成功")
can.run({})
}, true)
return true
@ -255,7 +255,7 @@ Volcanos("onaction", {help: "组件交互", list: ["统计", "添加", "详情",
var msg = can.request(event); msg.Option(task)
can.run(event, ["action", "modify", key, value, task[key]], function(msg) {
task[key] = value, can.onimport._profile(can, can._msg, task)
can.onappend.toast(can, "修改成功")
can.user.toast(can, "修改成功")
}, true)
},
pluginTask: function(event, can, task, key) {

View File

@ -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) {
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)
})
}, ondblclick: function(event) {
@ -55,7 +55,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", ["mode", "正常",
"保存": function(event, can, cmd) {
can.run(event, ["action", cmd, can.Option("path"), can.onexport.file(can)], function(msg) {
can.user.toast("保存成功")
can.user.toast(can, "保存成功")
}, true)
},
"正常": function(event, can, cmd) {

View File

@ -536,7 +536,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", "清空", "删除",
"保存": function(event, can, key) { var msg = can.request(event)
msg.Option("content", can.onexport.file(can, can.svg))
can.run(event, ["action", key, can.Option("path")], function() {
can.user.toast("保存成功")
can.user.toast(can, "保存成功")
}, true)
},
"清空": function(event, can) {
@ -731,7 +731,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["保存", "清空", "删除",
}
},
_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)
})
},

View File

@ -82,7 +82,7 @@ Volcanos("onfigure", {help: "组件菜单", list: [],
})
Volcanos("onaction", {help: "组件菜单", list: ["", "上传", "收藏"],
"上传": function(event, can) { can.onappend.upload(can) },
"上传": function(event, can) { can.user.upload(event, can) },
"收藏": function(event, can) {
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, { action: "copy" }, function (response) {