1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

add share

This commit is contained in:
shaoying 2020-12-27 03:41:42 +08:00
parent efd69415a2
commit 6d3e088f3a
19 changed files with 167 additions and 179 deletions

View File

@ -35,6 +35,8 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
}, },
search: function(event, can, msg, pane, cmds, cb) { search: function(event, can, msg, pane, cmds, cb) {
can.base.Log(can._name, "search", cmds)
var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) { var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) {
fun && (sub = mod, mod = fun, fun = mod[value], key = value) fun && (sub = mod, mod = fun, fun = mod[value], key = value)
}); if (!sub || !mod || !fun) { can.base.Warn("not found", cmds[1]); return } }); if (!sub || !mod || !fun) { can.base.Warn("not found", cmds[1]); return }
@ -101,9 +103,6 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
}}, }},
"project": {name: "研发群", storm: { "project": {name: "研发群", storm: {
"studio": {name: "研发 studio", action: [ "studio": {name: "研发 studio", action: [
{name: "route", help: "路由器", index: "web.route"},
{name: "tmux", help: "命令行", index: "web.code.tmux.session"},
{name: "inner", help: "编辑器", index: "web.code.inner", args: ["src/", "main.go"]},
{name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"]}, {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"]},
{name: "repos", help: "代码库", index: "web.code.git.status"}, {name: "repos", help: "代码库", index: "web.code.git.status"},
{name: "total", help: "统计量", index: "web.code.git.total"}, {name: "total", help: "统计量", index: "web.code.git.total"},
@ -420,27 +419,24 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
}) })
can.page.Select(can, target, ["fieldset.left", "fieldset.right"], function(field, index) { can.page.Select(can, target, ["fieldset.left", "fieldset.right"], function(field, index) {
var border = field.offsetHeight - field.clientHeight can.page.Modify(can, field, {style: {height: height}})
can.page.Modify(can, field, {style: {height: height-4}})
can.page.Select(can, field, "div.output", function(output) { can.page.Select(can, field, "div.output", function(output) {
var border = output.offsetHeight - output.clientHeight can.page.Modify(can, output, {style: {height: height-32}})
can.page.Modify(can, output, {style: {height: height-26}})
}) })
width -= field.offsetWidth width -= field.offsetWidth
}) })
can.onengine.trigger(can, can.request(event, {width: width, height: height}), "resize")
can.Action._width = width, can.Action._height = height can.Action._width = width, can.Action._height = height
if (can.user.isMobile) { return } if (can.user.isMobile) { return }
can.page.Select(can, target, ["fieldset.middle"], function(field, index) { can.page.Select(can, target, ["fieldset.middle"], function(field, index) {
var border = field.offsetHeight - field.clientHeight can.page.Modify(can, field, {style: {height: height}})
can.page.Modify(can, field, {style: {height: height-border*2}})
}) })
can.page.Select(can, target, ["fieldset.middle>div.output"], function(output) { can.page.Select(can, target, ["fieldset.middle>div.output"], function(output) {
var border = output.offsetHeight - output.clientHeight can.page.Modify(can, output, {style: {height: height}})
can.page.Modify(can, output, {style: {height: height-border*2-14}})
}) })
can.core.List(can.onlayout.resize.list, function(item) { can.core.List(can.onlayout.resize.list, function(item) {
@ -498,11 +494,15 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe
}, },
_mode: { _mode: {
normal: { normal: {
j: function(event, can, target) { target.scrollBy(0, 30) }, j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) },
k: function(event, can, target) { target.scrollBy(0, -30) }, k: function(event, can, target) { target.scrollBy(0, -30) },
b: function(event, can, target) { can.run(event, ["search", "Header.onaction.black"]) }, b: function(event, can, target) { can.run(event, ["search", "Header.onaction.black"]) },
w: function(event, can, target) { can.run(event, ["search", "Header.onaction.white"]) }, w: function(event, can, target) { can.run(event, ["search", "Header.onaction.white"]) },
s: function(event, can, target) { can.run(event, ["search", "River.ondetail.添加应用"]) },
t: function(event, can, target) { can.run(event, ["search", "River.ondetail.添加工具"]) },
" ": function(event, can, target) { " ": function(event, can, target) {
can.page.Select(can, document.body, "fieldset.pane.Header div.search input", function(target) { can.page.Select(can, document.body, "fieldset.pane.Header div.search input", function(target) {
target.focus() target.focus()

View File

@ -5,6 +5,9 @@ body.mobile fieldset.Header.head {
background-color:#000000b8; background-color:#000000b8;
z-index:10; z-index:10;
} }
body.mobile fieldset.Header.head>div.output {
height:48px;
}
body.mobile fieldset.Footer.foot { body.mobile fieldset.Footer.foot {
position:fixed; bottom:0px; position:fixed; bottom:0px;
width:-webkit-fill-available; width:-webkit-fill-available;
@ -28,6 +31,9 @@ body.mobile select {
body.mobile input { body.mobile input {
font-size:18px; font-size:18px;
} }
body.mobile div.carte {
font-size:24px;
}
body { body {
margin:0; padding:0; margin:0; padding:0;
@ -91,6 +97,9 @@ table td {
table td:hover { table td:hover {
background-color:red; background-color:red;
} }
table td.select {
background-color:red;
}
h1 { h1 {
margin:0; margin:0;
@ -178,20 +187,21 @@ fieldset>div.output div.project div.list {
fieldset.input { fieldset.input {
background-color:#30a7a93d; background-color:#30a7a93d;
position:fixed; position:fixed;
z-index:9; z-index:100;
} }
fieldset.input.key { fieldset.input.key {
z-index:10; z-index:90;
} }
fieldset.input.date { fieldset.input.date {
z-index:11; z-index:80;
} }
div.carte { div.carte {
position:absolute; position:fixed;
background:#295b61; background:#295b61;
color:white; color:white;
padding:4px; padding:4px;
z-index:100;
} }
div.carte div.item { div.carte div.item {
padding:3px 12px; padding:3px 12px;
@ -238,6 +248,9 @@ div.toast div.progress div.current {
height:10px; height:10px;
} }
body.black a {
color:yellow;
}
body.white { body.white {
background-color:#2f3638; background-color:#2f3638;
color:white; color:white;

View File

@ -3,6 +3,7 @@
<meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no"> <meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no">
<meta charset="utf-8"> <meta charset="utf-8">
<title>volcanos</title> <title>volcanos</title>
<link rel="shortcut icon" type="image/ico" href="favicon.ico"> <link rel="shortcut icon" type="image/ico" href="favicon.ico">
<link rel="stylesheet" type="text/css" href="cache.css"> <link rel="stylesheet" type="text/css" href="cache.css">
<link rel="stylesheet" type="text/css" href="index.css"> <link rel="stylesheet" type="text/css" href="index.css">

View File

@ -74,9 +74,9 @@ Volcanos("core", {help: "核心模块",
var ls = func.toString(); ls = ls.split(")")[0], ls = ls.split("(")[1] var ls = func.toString(); ls = ls.split(")")[0], ls = ls.split("(")[1]
var msg = args["msg"], echo = false var msg = args["msg"], can = args["can"], echo = false
var list = []; this.List(ls.split(","), function(item) { item = item.trim() var list = []; this.List(ls.split(","), function(item) { item = item.trim()
list.push(args[item]||msg&&msg.Option(item)||args) list.push(args[item] || msg&&msg.Option(item) || can&&can.Conf(item) || args)
if (item == "cb") { echo = true } if (item == "cb") { echo = true }
}) })
@ -159,6 +159,12 @@ Volcanos("core", {help: "核心模块",
setTimeout(function() { loop(timer, 0) }, interval.value||interval[0]) setTimeout(function() { loop(timer, 0) }, interval.value||interval[0])
return timer return timer
}), }),
Delay: function(list, interval, cb, cbs) {
list.push(cb); this.Timer(interval, function() {
var cb = list.pop(); list.length = 0
typeof cb == "function" && cb()
}, cbs)
},
Copy: function(to, from, fields) { Copy: function(to, from, fields) {
var list = [] var list = []

View File

@ -120,7 +120,7 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
var socket = new WebSocket(can.base.URLMerge(url, args)) var socket = new WebSocket(can.base.URLMerge(url, args))
socket.onclose = function() { can.base.Log("wss", "close", args) socket.onclose = function() { can.base.Log("wss", "close", args)
typeof onclose == "function"? onclose(socket): can.core.Timer(1000, function() { typeof onclose == "function"? onclose(socket): can.core.Timer(1000, function() {
can.misc.WSS(can, url, args, cb, onopen, onerror, onclose) can.misc.WSS(can, args, cb, onopen, onerror, onclose)
}) })
}, socket.onerror = function() { can.base.Log("wss", "error", args) }, socket.onerror = function() { can.base.Log("wss", "error", args)
typeof onerror == "function"? onerror(socket): socket.close() typeof onerror == "function"? onerror(socket): socket.close()

View File

@ -48,6 +48,9 @@ Volcanos("user", {help: "用户模块", agent: {
}, },
trans: function(can, text) { trans: function(can, text) {
if (typeof text == "function") {
text = text.name || ""
}
return can._trans && can._trans[text] || text return can._trans && can._trans[text] || text
}, },
topic: function(can, name) { topic: function(can, name) {
@ -80,10 +83,11 @@ Volcanos("user", {help: "用户模块", agent: {
share: function(can, msg, cmd) { share: function(can, msg, cmd) {
can.run(msg._event, cmd||["action", "share"], function(msg) { can.run(msg._event, cmd||["action", "share"], function(msg) {
var src = can.user.Share(can, {_path: "/share/"+msg.Result()}, true) var src = can.user.Share(can, {_path: "/share/"+msg.Result()}, true)
var ui = can.user.toast(can, {title: can.page.Format("a", "/?share="+msg.Result(), "share"), text: can.page.Format("img", src+"/share"), var ui = can.user.toast(can, {
width: 300, height: 300, duration: 100000, button: [{button: ["确定", function(event) { title: can.page.Format("a", "/share?share="+msg.Result(), "share"),
ui.Close() text: can.page.Format("img", src+"/share"), width: 300, height: 300, duration: 100000,
}]}] }) button: [{button: ["确定", function(event) { ui.Close() }]}],
})
}) })
}, },
login: function(can, cb) { login: function(can, cb) {
@ -118,6 +122,7 @@ Volcanos("user", {help: "用户模块", agent: {
can.page.Remove(can, ui.first) can.page.Remove(can, ui.first)
}, list: can.core.List(list, function(item) { }, list: can.core.List(list, function(item) {
return {view: "item", list: [typeof item == "string"? /* button */ {text: item, click: function(event) { return {view: "item", list: [typeof item == "string"? /* button */ {text: item, click: function(event) {
can.user.isMobile && can.page.Remove(can, ui.first)
typeof cb == "function" && cb(event, item, meta) typeof cb == "function" && cb(event, item, meta)
}}: item.args? /* input */ {text: item.name, click: function(event) { }}: item.args? /* input */ {text: item.name, click: function(event) {
can.user.input(event, can, item.args, cb) can.user.input(event, can, item.args, cb)
@ -141,8 +146,9 @@ Volcanos("user", {help: "用户模块", agent: {
} }
var msg = can.request(event) var msg = can.request(event)
var x = event.clientX, y = event.clientY; y += 10; if (x > 600) { x -= 160 } var x = event.clientX||200, y = event.clientY||48; y += 10; if (x > 600) { x -= 160 }
if (can.user.isMobile) { x = 100, y = 100 } if (can.user.isMobile) { x = 100, y = 100 }
var button; var ui = can.page.Append(can, document.body, [{view: ["input", "fieldset"], style: {left: x+"px", top: y+"px"}, list: [ 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) { if (item.button) { button = can.core.List(item.button, function(item) {

View File

@ -2,14 +2,8 @@
"manifest_version": 2, "manifest_version": 2,
"name": "volcanos", "name": "volcanos",
"version": "0.0.1", "version": "0.0.1",
"icons": {
"16": "favicon.png",
"48": "favicon.png",
"128": "favicon.png"
},
"background": {"page": "/publish/chrome/chrome.html"}, "background": {"page": "/publish/chrome/chrome.html"},
"browser_action": { "browser_action": {
"default_icon": "/favicon.png",
"default_popup": "/publish/chrome/popup.html" "default_popup": "/publish/chrome/popup.html"
}, },
"content_scripts": [ "content_scripts": [

View File

@ -1,17 +0,0 @@
body {
background:black;
padding:0;
margin:0;
}
fieldset {
color:cyan;
padding:2px;
}
legend {
margin-left:10px;
}
div.hidden {
display:none;
}

View File

@ -1,15 +1,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<head> <head>
<meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no">
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=0.7,user-scalable=no">
<title>volcanos</title> <title>volcanos</title>
<link rel="shortcut icon" type="image/ico" href="/favicon.ico"> <link rel="shortcut icon" type="image/ico" href="/favicon.ico">
<link rel="stylesheet" type="text/css" href="/index.css"> <link rel="stylesheet" type="text/css" href="/index.css">
<link rel="stylesheet" type="text/css" href="/page/share.css"> <link rel="stylesheet" type="text/css" href="share.css">
</head> </head>
<body> <body>
<script src="/proto.js"></script> <script src="/proto.js"></script>
<script src="/page/share.js"></script> <script src="share.js"></script>
</body> </body>

View File

@ -1,13 +1,11 @@
Volcanos({name: "demo", volcano: "/frame.js", iceberg: "/chat/", intshell: "plug.sh", Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js",
libs: ["/lib/base", "/lib/core", "/lib/misc", "/lib/page", "/lib/user"], panes: [ libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panes: [
{type: "pane", name: "Action", help: "工作台", pos: "middle", list: ["/pane/Action.js", "/pane/Action.css"]}, {name: "Action", help: "工作台", pos: "middle"},
], main: {name: "Action", engine: "remote", list: ["/publish/order.js"]}, plugin: [ ], main: {name: "Action", engine: "remote", list: ["/publish/order.js"]}, plugin: [
"/plugin/state.js", "/plugin/state.js",
"/plugin/input.js", "/plugin/input.js",
"/plugin/table.js", "/plugin/table.js",
"/plugin/input/key", "/plugin/input/key.js",
"/plugin/input/date", "/plugin/input/date.js",
"/plugin/input/upload",
"/plugin/input/province",
], ],
}) })

View File

@ -1,8 +1,5 @@
(function() { const RIVER = "river", STORM = "storm", ACTION = "action" (function() { const RIVER = "river", STORM = "storm", ACTION = "action"
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can._target.ontouchstart = function(event) {
can.run({}, ["search", "River.onmotion.hidden"])
}
var river = can.Conf(RIVER), storm = can.Conf(STORM) var river = can.Conf(RIVER), storm = can.Conf(STORM)
can.onmotion.clear(can), can.core.Next(msg.Table(), function(value, next) { can.onmotion.clear(can), can.core.Next(msg.Table(), function(value, next) {
value.feature = can.base.Obj(value.feature||value.meta||"{}", {}) value.feature = can.base.Obj(value.feature||value.meta||"{}", {})
@ -19,10 +16,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}, },
_plugin: function(can, target, river, storm, value) { value.name = value.name.split(" ")[0] _plugin: function(can, target, river, storm, value) { value.name = value.name.split(" ")[0]
value.action = value.id || value.index || value.key+"."+value.name value.action = value.id || value.index || value.key+"."+value.name
value.width = can._target.offsetWidth
value.type = "plugin" value.type = "plugin"
// 添加插件 // 添加插件
value.width = parseInt(can.Conf("width")), value.height = parseInt(can.Conf("height"))
can.onappend._init(can, value, ["/plugin/state.js"], function(plugin) { can.onappend._init(can, value, ["/plugin/state.js"], function(plugin) {
can._plugins = (can._plugins||[]).concat([plugin]) can._plugins = (can._plugins||[]).concat([plugin])
plugin.run = function(event, cmds, cb, silent) { var msg = plugin.request(event); cmds = cmds || [] plugin.run = function(event, cmds, cb, silent) { var msg = plugin.request(event); cmds = cmds || []
@ -55,6 +52,27 @@ Volcanos("onengine", {help: "解析引擎", list: [],
}, },
}) })
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
var share = can.user.Search(can, "share"); if (share) {
can.run({}, ["_share", share], function(msg) {
can.user.title(msg.Option("title"))
can.Conf(RIVER, "_share"), can.Conf(STORM, share)
can.onimport._init(can, msg, [], cb, can._output)
})
}
can.Conf({width: can._output.offsetWidth-32, height: window.innerHeight})
can.onengine.listen(can, "resize", function(width, height) {
can.Conf({width: width, height: height})
})
can._target.ontouchstart = function(event) {
can.run({}, ["search", "River.onmotion.hidden"])
can.page.Select(can, document.body, "div.carte", function(item) {
can.page.Remove(can, item)
})
}
can.onengine.listen(can, "storm.select", function(msg, river, storm) { can.onengine.listen(can, "storm.select", function(msg, river, storm) {
can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1) can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1)
can.Conf(RIVER, river), can.Conf(STORM, storm) can.Conf(RIVER, river), can.Conf(STORM, storm)
@ -63,9 +81,15 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
if (position) { can._output.scrollTo(0, position-1); return } if (position) { can._output.scrollTo(0, position-1); return }
can.run({}, [river, storm], function(msg) { can.run({}, [river, storm], function(msg) {
if (msg.append && msg[msg.append[0]] && msg[msg.append[0]].length > 0) {
can.onimport._init(can, msg, list, cb, can._output) can.onimport._init(can, msg, list, cb, can._output)
} else {
var msg = can.request({}, {river: river, storm: storm})
can.run(msg._event, ["search", "River.ondetail.添加工具"])
}
}) })
}) })
can.onengine.listen(can, "search", function(msg, word) { can.onengine.listen(can, "search", function(msg, word) {
if (word[0] != "*" && word[0] != "fieldset") { return } if (word[0] != "*" && word[0] != "fieldset") { return }

View File

@ -1,9 +1,12 @@
(function() { const RIVER = "river", STORM = "storm", POD = "pod" (function() { const RIVER = "river", STORM = "storm", POD = "pod"
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can._main_river = can.user.Search(can, RIVER) || (can.user.isMobile||can.user.isExtension? "product": "project") can._main_river = can.user.Search(can, RIVER) || (can.user.isMobile||can.user.isExtension? "product": "project")
can._main_storm = can.user.Search(can, STORM) || (can.user.isMobile||can.user.isExtension? "office": "studio") can._main_storm = can.user.Search(can, STORM) || (can.user.isMobile? "office": can.user.isExtension? "chrome": "studio")
can.run({}, ["search", "Header.onimport.menu", ["群组", "添加用户", "添加设备", "添加应用"], ["应用", "添加工具"]], function(event, item) { can.run({}, ["search", "Header.onimport.menu",
["添加", "创建群组", "添加用户", "添加设备", "添加应用", "添加工具"],
["共享", "共享群组", "共享应用", "共享工具"],
], function(event, item) {
var cb = can.ondetail[item]; typeof cb == "function" && cb(event, can, item, can.Conf(RIVER), can.Conf(STORM)) var cb = can.ondetail[item]; typeof cb == "function" && cb(event, can, item, can.Conf(RIVER), can.Conf(STORM))
}) })
@ -57,7 +60,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
can.user.title(can.user.Search(can, POD) || storm.name) can.user.title(can.user.Search(can, POD) || storm.name)
// 右键点击 // 右键点击
var ui = can.user.carte(event, can, can.ondetail, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(ev, item, meta) { var ui = can.user.carte(event, can, can.ondetail, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(ev, item, meta) {
can.ondetail[item](event, can, item, storm.hash, river) can.ondetail[item](event, can, item, river, storm.hash)
}); can.page.Modify(can, ui.first, {style: {left: can._target.offsetWidth}}) }); can.page.Modify(can, ui.first, {style: {left: can._target.offsetWidth}})
}} }}
}) }]).first, list.children.length > 0 && list.children[select].click() }) }]).first, list.children.length > 0 && list.children[select].click()
@ -90,6 +93,8 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
"刷新": function(event, can) { can.user.Search(can, {river: can.Conf(RIVER), storm: can.Conf(STORM)}) }, "刷新": 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) { can.onaction.create(event, can) },
"共享群组": function(event, can, button, river) { "共享群组": function(event, can, button, river) {
can.user.input(event, can, [ can.user.input(event, can, [
{_input: "text", name: "name", value: river}, {_input: "text", name: "name", value: river},
@ -138,20 +143,18 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
}) })
}, },
"共享应用": function(event, can, button, storm, river) { "共享应用": function(event, can, button, river, storm) {
can.user.input(event, can, [ can.user.input(event, can, [
{_input: "text", name: "name", value: storm}, {_input: "text", name: "name", value: storm},
{_input: "text", name: "username", value: "@key=hi"},
{_input: "text", name: "userrole", value: "@key=void"},
], function(event, button, meta, list) { ], function(event, button, meta, list) {
var msg = can.request(event) var msg = can.request(event)
can.user.share(can, msg, [river, "action", "share", "type", "storm", "name", meta.name, can.user.share(can, msg, [river, "action", "share", "type", "storm", "name", meta.name,
"storm", storm, "username", meta.username, "userrole", meta.userrole, "storm", storm,
]) ])
return true return true
}) })
}, },
"添加工具": function(event, can, button, storm, river) { "添加工具": function(event, can, button, river, storm) {
can.user.select(event, can, "command", "pod,name,text", function(item, next) { can.user.select(event, can, "command", "pod,name,text", function(item, next) {
can.run({}, [river, "tool", "action", "insert", "hash", storm].concat(["pod", item[0], "ctx", item[2], "cmd", item[1]]), function(msg) { can.run({}, [river, "tool", "action", "insert", "hash", storm].concat(["pod", item[0], "ctx", item[2], "cmd", item[1]]), function(msg) {
next() next()
@ -160,7 +163,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
can.user.Search(can, {river: river, storm: storm}) can.user.Search(can, {river: river, storm: storm})
}) })
}, },
"保存参数": function(event, can, button, storm, river) { "保存参数": function(event, can, button, river, storm) {
can.run(event, ["search", "Action.onexport.args"], function(item, next) { can.run(event, ["search", "Action.onexport.args"], function(item, next) {
var msg = can.request({}, {hash: storm, id: item.dataset.id}) var msg = can.request({}, {hash: storm, id: item.dataset.id})
can.run({}, [river, "tool", "action", "modify", "arg", item.dataset.args], function(msg) { can.run({}, [river, "tool", "action", "modify", "arg", item.dataset.args], function(msg) {
@ -168,7 +171,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
}) })
}) })
}, },
"重命名应用": function(event, can, button, storm, river) { "重命名应用": function(event, can, button, river, storm) {
can.user.input(event, can, ["name"], function(event, button, meta, list) { can.user.input(event, can, ["name"], function(event, button, meta, list) {
var msg = can.request(event, {hash: storm}) var msg = can.request(event, {hash: storm})
can.run(event, [river, "tool", "action", "modify", "name", meta.name], function(msg) { can.run(event, [river, "tool", "action", "modify", "name", meta.name], function(msg) {
@ -176,7 +179,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
}) })
}) })
}, },
"删除应用": function(event, can, button, storm, river) { "删除应用": function(event, can, button, river, storm) {
var msg = can.request(event, {hash: storm}) var msg = can.request(event, {hash: storm})
can.run(event, [river, "tool", "action", "remove"], function(msg) { can.run(event, [river, "tool", "action", "remove"], function(msg) {
can.user.Search(can, {river: river}) can.user.Search(can, {river: river})

View File

@ -1,19 +1,17 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, target) {
var width = can.Conf("width"), height = can.Conf("height") var list = []; can.onengine.listen(can, "resize", function(width, height) {
can.Conf({width: width, height: height}), can.core.Delay(list, 100, function() {
can.onimport._init(can, msg, list, cb, target)
})
})
var width = can.Conf("width"), height = can.Conf("height")
can.ui = can.page.Appends(can, target, [ can.ui = can.page.Appends(can, target, [
{type: "table", list: [{type: "tr", list: [ {type: "table", list: [{type: "tr", list: [
{type: "td", list: [{view: "project", style: {"max-height": height-480, display: "none"}} ]}, {type: "td", list: [{view: "project", style: {"max-height": height-240, display: "none"}} ]},
{type: "td", list: [{view: "profile", style: {"max-height": height-480}, list: [ {type: "td", list: [{view: "profile", style: {"max-height": height-240}, list: [
{view: ["content", "table"]}, {view: ["content", "table"]},
]}], style: {"min-width": width-120, "max-width": width-60}, _init: function(item) { ]}], style: {"min-width": width-60, "max-width": width-30}},
can.onlayout.resize(function(width, height) {
width = can.Conf("width", width), height = can.Conf("height", height)
can.page.Modify(can, item, {style: {
"min-width": width-120, "max-width": width-60,
}})
})
}},
]}, ]}, ]}, ]},
{view: "search", style: {display: "none"}, list: [{view: "action", list: [ {view: "search", style: {display: "none"}, list: [{view: "action", list: [
{input: ["word", function(event) { {input: ["word", function(event) {

View File

@ -1,5 +1,10 @@
Volcanos("onimport", {help: "导入数据", list: [], Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
_init: function(can, msg, list, cb, target) { can._output.innerHTML = "" var list = []; can.onengine.listen(can, "resize", function(width, height) {
can.Conf({width: width, height: height}), can.core.Delay(list, 100, function() {
can.onimport._init(can, msg, list, cb, target)
})
})
if (msg.Option("_display") == "table") { if (msg.Option("_display") == "table") {
can.onappend.table(can, msg, can._target, "table", function(value, key) { can.onappend.table(can, msg, can._target, "table", function(value, key) {
return {text: [value, "td"], click: function(event) { return {text: [value, "td"], click: function(event) {
@ -84,7 +89,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view",
var space = 10 var space = 10
var view = parseInt(can.Action("height")) var view = parseInt(can.Action("height"))
var max = parseInt(can.Conf("width"))-100 var max = parseInt(can.Conf("width"))-120
var step = parseInt(max / can.list.length)||2 var step = parseInt(max / can.list.length)||2
var width = can.list.length * step + space * 2 var width = can.list.length * step + space * 2
@ -135,7 +140,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view",
"趋势图": function(event, can, value, cmd, target) {var sub = can.sub, data = can.data; "趋势图": function(event, can, value, cmd, target) {var sub = can.sub, data = can.data;
var space = 10 var space = 10
var view = parseInt(can.Action("height")) var view = parseInt(can.Action("height"))
var max = parseInt(can.Conf("width"))-100 var max = parseInt(can.Conf("width"))-120
var step = parseInt(max / can.list.length)||2 var step = parseInt(max / can.list.length)||2
var width = can.list.length * step + space * 2 var width = can.list.length * step + space * 2

View File

@ -22,14 +22,13 @@ var Volcanos = shy("火山架", {libs: [], cache: {}}, [], function(name, can, l
}); Preload = Preload.concat(Config.plugin) }); Preload = Preload.concat(Config.plugin)
// 根模块 // 根模块
name = Config.name, can = {_follow: Config.name, name = Config.name, can = {_follow: Config.name, _target: document.body}
_target: document.body, _width: window.innerWidth, _height: window.innerHeight, libs = Preload.concat(Config.volcano), cb = function(can) {
}, libs = Preload.concat(Config.volcano), cb = function(can) {
can.onengine._init(can, can.Conf(Config), Config.panes, function(msg) { can.onengine._init(can, can.Conf(Config), Config.panes, function(msg) {
can.base.Log(name, "run", window.can = can) can.base.Log(name, "run", window.can = can)
document.body.onresize = function(event) { var list = []; document.body.onresize = function(event) { can.core.Delay(list, 100, function() {
can.onlayout._init(can, can._target, window.innerWidth, window.innerHeight) can.onlayout._init(can, can._target, can._width = window.innerWidth, can._height = window.innerHeight)
}, can.onlayout._init(can, can._target, window.innerWidth, window.innerHeight-8) }) }, document.body.onresize()
}, can._target) }, can._target)
} }
} }

View File

@ -2,11 +2,10 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/index.css">
</head> </head>
<body> <body>
<script src="/proto.js"></script> <script src="/proto.js"></script>
<script src="/chrome/chrome.js"></script> <script src="/publish/chrome/chrome.js"></script>
</body> </body>
<html> <html>

View File

@ -1,49 +1,39 @@
var can = Volcanos("chrome", { Volcanos("chrome", {
chrome: function(msg, cmd, cb) { chrome: function(can, msg, cmds, cb) {
if (cmd.length == 0) { if (cmds.length == 0) { // 窗口列表
// 窗口列表
chrome.windows.getAll(function(wins) { chrome.windows.getAll(function(wins) {
can.core.List(wins, function(win) {win.wid = win.id can.core.List(wins, function(win) { win.wid = win.id
msg.Push(win, ["wid", "state", "left", "top", "width", "height"]) msg.Push(win, ["wid", "state", "left", "top", "width", "height"])
}) })
typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
}) })
return return
} }
if (cmd.length == 1) { if (cmds.length == 1) { // 标签列表
// 标签列表 chrome.tabs.getAllInWindow(parseInt(cmds[0]), function(tabs) {
chrome.tabs.getAllInWindow(parseInt(cmd[0]), function(tabs) { can.core.List(tabs, function(tab) { tab.tid = tab.id
can.core.List(tabs, function(tab) {tab.tid = tab.id
msg.Push(tab, ["tid", "active", "width", "height", "index", "title", "url"]) msg.Push(tab, ["tid", "active", "width", "height", "index", "title", "url"])
}) })
typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
}) })
return return
} }
if (cmds[1] == "") { // 当前标签
delete(msg._can) chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
delete(msg._event) cmds[1] = tabs[0].id
if (cmd[1] == "") { chrome.tabs.sendMessage(parseInt(cmds[1]), msg, function(res) {
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
cmd[1] = tabs[0].id
chrome.tabs.sendMessage(parseInt(cmd[1]), msg, function (res) {
msg.Copy(res), typeof cb == "function" && cb(msg) msg.Copy(res), typeof cb == "function" && cb(msg)
}) })
}) })
} else {
chrome.tabs.sendMessage(parseInt(cmd[1]), msg, function (res) {
msg.Copy(res), typeof cb == "function" && cb(msg)
})
}
return return
}
// 新建标签 chrome.tabs.sendMessage(parseInt(cmds[1]), msg, function(res) {
chrome.tabs.create({windowId: parseInt(cmd[0]), url: cmd[1], selected: false}, function() { msg.Copy(res), typeof cb == "function" && cb(msg)
can.chrome(msg, [cmd[0]], cb)
}) })
}, },
bookmark: function(msg, cmd, cb) { bookmark: function(msg, cmds, cb) {
chrome.bookmarks.getSubTree(cmd[0]||"0", function(labs) { chrome.bookmarks.getSubTree(cmds[0]||"0", function(labs) {
for (var i = 0; i < labs.length; i++) {labs[i].pid = labs[i].parentId for (var i = 0; i < labs.length; i++) {labs[i].pid = labs[i].parentId
msg.Push("time", can.base.Time(labs[i].dateAdded)) msg.Push("time", can.base.Time(labs[i].dateAdded))
msg.Push(labs[i], ["pid", "id", "index", "title", "url"]) msg.Push(labs[i], ["pid", "id", "index", "title", "url"])
@ -52,45 +42,33 @@ var can = Volcanos("chrome", {
typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
}) })
}, },
}, ["/lib/base", "/lib/core", "/lib/misc", "/lib/page", "/lib/user"], function(can) {can.Conf({iceberg: "http://localhost:9020/"}) }, ["/lib/base", "/lib/core", "/lib/misc", "/lib/page", "/lib/user"], function(can) {
can.Conf({iceberg: "http://localhost:9020/"})
can.user.toast = function(message, title) {chrome.notifications.create(null, { can.user.toast = function(message, title) {chrome.notifications.create(null, {
message: message, title: title||"volcanos", iconUrl: "/favicon.ico", type: "basic", message: message, title: title||can._name, iconUrl: "/favicon.ico", type: "basic",
})}, })},
can.misc.WSS(can, "ws://localhost:9020/space/", {name: "chrome", type: "chrome"}, function(event, msg) { can.misc.WSS(can, {type: "chrome", name: "chrome"}, function(event, msg, cmd, arg) {
if (msg.Option("_handle")) { return can.user.toast(msg.result.join("")) } can.core.CallFunc(can.core.Value(can, cmd), {can: can, msg: msg, cmds: arg, cb: function() {
msg.Reply()
}})
})
// can.user.toast(msg.detail.join(" ")) can.run = function(event, cmds, cb, silent) { var msg = can.request(event)
try { can.misc.Run(event, can, {names: "code/chrome/crx"}, cmds, cb)
switch (msg.detail[0]) {
case "space": can._share = msg.detail[2]; break
case "pwd": msg.Echo("hello world"); break
default: (can[msg.detail[0]]||can.chrome[msg.detail[0]])(msg, msg.detail.slice(1), function(msg) {
msg.Reply(msg)
}); return
}
} catch (e) {
can.user.toast(e)
}
msg.Reply(msg)
}, function() {can.user.toast("wss connect", "iceberg")})
can.run = function(event, cmd, cb, silent) { var msg = can.request(event)
can.misc.Run(event, can, {names: "code/chrome/crx"}, cmd, cb)
}, },
chrome.history.onVisited.addListener(function(item) { chrome.history.onVisited.addListener(function(item) {
can.run({}, ["history", item.id, item.title, item.url]) can.run({}, ["history", item.id, item.title, item.url])
}) })
chrome.contextMenus.create({
title: "favor", chrome.contextMenus.create({title: "favor", onclick: function(event) {
onclick: function(event) { chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
chrome.tabs.query({ active: true}, function (tabs) { var msg = can.request(event); msg.detail = ["chrome", "", "", "favor"]
chrome.tabs.sendMessage(tabs[0].id, { action: "copy" }, function (response) { chrome.tabs.sendMessage(tabs[0].id, msg, function(res) {
console.log(response) return
can.run({}, ["history", "id", response.title, response.src]) can.run({}, ["history", "id", response.title, response.src])
}) })
}) })
}, }, })
})
}) })

View File

@ -1,4 +1,4 @@
var can = Volcanos("chrome", { Volcanos("chrome", {
spide: function(can, msg) { spide: function(can, msg) {
can.page.Select(can, document.body, "video", function(item) { can.page.Select(can, document.body, "video", function(item) {
var p = can.page.Select(can, document.body, "p.title")[0] var p = can.page.Select(can, document.body, "p.title")[0]
@ -28,29 +28,10 @@ var can = Volcanos("chrome", {
msg.Push("link", item.src) msg.Push("link", item.src)
}) })
}, },
}, [], function(can) { }, [], function(can) { can._load("chrome")
can.user = user chrome.extension.onMessage.addListener(function(req, sender, cb) {
can.page = page var msg = can.request(); can.core.List(req.option, function(key) { msg.Option(key, req[key][0]) })
can.misc = misc can.core.CallFunc(can.core.Value(can, req.detail[3]||"spide"), {can: can, msg: msg, cmds: req.detail.slice(4), cb: cb})
can.core = core
can.base = base
chrome.extension.onMessage.addListener( function (msg, sender, cb) { var action = can[msg.detail[3]||"spide"]
msg = can.request({}, msg)
delete(msg._event)
delete(msg._can)
typeof action == "function" && action(can, msg) || typeof cb == "function" && cb(msg)
})
return
chrome.extension.onMessage.addListener( function (request, sender, sendResponse) {
var title = can.page.Select(can, document.body, "p.title", function(item) {
return item.innerText
}).join("-")
can.page.Select(can, document.body, "video", function(item) {
sendResponse({poster: item.poster, src: item.src, title: title})
console.log(item)
})
}) })
}) })

View File

@ -6,7 +6,7 @@
</head> </head>
<body style="min-width:800px; min-height:600px; overflow:auto"> <body style="min-width:800px; min-height:600px; overflow:auto">
<script src="/proto.js"></script> <script src="/proto.js"></script>
<script src="/chrome/popup.js"></script> <script src="/publish/chrome/popup.js"></script>
</body> </body>
<html> <html>