1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
This commit is contained in:
shylinux 2021-02-04 22:15:53 +08:00
parent 6b930ef204
commit 169c2924ff
13 changed files with 134 additions and 145 deletions

View File

@ -282,8 +282,8 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
item.name && item.value && msg.Option(item.name, item.value)
})
if (cmds && cmds[0] == "action" && can.onaction[cmds[1]]) {
return can.onaction[cmds[1]](event, can)
if (msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && can.onaction[cmds[1]]) {
return can.onaction[cmds[1]](event, can, cmds[1])
}
var feature = can.Conf("feature")
@ -414,19 +414,19 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
return can.page.Append(can, target, [{view: ["item "+item.type], list: [input]}])[item.name]
},
table: function(can, msg, cb, target, list) {
table: function(can, msg, cb, target, sort) {
var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key) {
return {text: [value, "td"], onclick: function(event) {
can.sup.onaction.change(event, can.sup, key, value, function(msg) {
can.onimport._init(can, msg, list, cb, can._output)
can.onimport._init(can, msg, [], cb, can._output)
})
}}
}); table && can.page.Modify(can, table, {className: "content"})
list && can.page.RangeTable(can, table, list)
sort && can.page.RangeTable(can, table, sort)
return table
},
board: function(can, text, target) { text = can.page.Display(text || "")
return text && can.page.Append(can, target, [{view: ["code", "div", text]}]).code
return text && can.page.Append(can, target||can._output, [{view: ["code", "div", text]}]).code
},
figure: function(can, meta, key, target) {
@ -484,28 +484,32 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
}, [], function(can) {})
Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) {
var target = document.body, width = window.innerWidth, height = window.innerHeight
can.user.isMobile && can.page.ClassList.set(can, document.body, "landscape", width > height)
can.page.Select(can, target, ["fieldset.head", "fieldset.foot"], function(field) {
can.page.Modify(can, field, {style: {display: can.user.isMobile && width > height? "none": ""}})
height -= field.offsetHeight
})
can.page.Select(can, target, ["fieldset.left", "fieldset.right"], function(field, index) {
can.page.Select(can, target, "fieldset.left", function(field, index) {
can.page.Modify(can, field, {style: {height: height}})
width -= field.offsetWidth
})
can.page.Select(can, target, "fieldset.left>div.output", function(output) {
can.page.Modify(can, output, {style: {height: height-32}})
})
can.page.Select(can, field, "div.output", function(output) {
can.page.Modify(can, output, {style: {height: height-32}})
if (can.user.isMobile) {
can.page.Select(can, target, "fieldset.main", function(field, index) {
can.user.isMobile && can.page.Modify(can, field, {style: {"padding-top": width > height? "0px": ""}})
})
})
if (can.user.isMobile) { return }
can.page.Select(can, target, ["fieldset.main"], function(field, index) {
can.page.Modify(can, field, {style: {height: height}})
})
can.page.Select(can, target, ["fieldset.main>div.output"], function(output) {
can.page.Modify(can, output, {style: {height: height}})
})
} else {
can.page.Select(can, target, "fieldset.main", function(field, index) {
can.page.Modify(can, field, {style: {height: height}})
})
can.page.Select(can, target, "fieldset.main>div.output", function(output) {
can.page.Modify(can, output, {style: {height: height}})
})
}
can.onengine.signal(can, "resize", can.request({}, {width: width, height: height}))
},
topic: function(can, topic) { topic && (can._topic = topic)

View File

@ -139,6 +139,23 @@ Volcanos("base", {help: "数据类型",
return size + "B"
},
parseJSON: function(str) { var res
if (typeof str == "object") { return str }
if (str.indexOf("http") == 0) { var ls = str.split("?")
res = {type: "link", name: "", text: str}
res.name = ls[0].split("://").pop().split("/")[0]
ls[1] && ls[1].split("&").forEach(function(item) { var ls = item.split("=")
res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1])
})
return res
}
try { res = JSON.parse(str)
res.type = res.type||"json"
} catch (e) {
res = {type: "text", text: str}
}
return res
},
parseSize: function(size) { size = size.toLowerCase()
if (size.endsWith("tb") || size.endsWith("t")) {
return parseInt(size) * 1024 * 1024 * 1024 * 1024

View File

@ -1,12 +1,13 @@
Volcanos("user", {help: "用户模块", agent: {
scanQRCode: function(cb) {
typeof cb == "function" && cb({name: "some"})
},
getLocation: function(cb) {
typeof cb == "function" && cb({name: "some"})
},
openLocation: function(msg) {
window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option("text"))+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option("text")))
},
scanQRCode: function(cb) {
typeof cb == "function" && cb({name: "some"})
window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option("text"))
+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option("text")))
},
chooseImage: function(cb) {
typeof cb == "function" && cb([])
@ -28,23 +29,16 @@ Volcanos("user", {help: "用户模块", agent: {
jumps: function(url) { location.href = url },
open: function(url) { window.open(url) },
scan: function(str) {
try { var value = JSON.parse(str) } catch(e) { try {
var value = {"type": "url", "text": str}
var ls = str.split("?"); if (ls.length > 1) { ls = ls[1].split("&")
for (var i = 0; i < ls.length; i++) { var vs = ls[i].split("=")
value[vs[0]] = decodeURIComponent(vs[1])
}
}
} catch(e) { } }
return value
},
copy: function(event, can, text) {
var input = can.page.Append(can, event.target, [{type: "input", value: text}]).first
input.setSelectionRange(0,-1), input.focus()
document.execCommand("Copy"), can.page.Remove(can, input)
can.user.toast(can, text, "复制成功")
event.stopPropagation(), event.preventDefault()
navigator.clipboard.writeText(text).then(() => {
can.user.toast(can, text, "复制成功")
}).catch(err => {
var input = can.page.Append(can, event.target, [{type: "input", value: text}]).first
input.setSelectionRange(0,-1), input.focus()
document.execCommand("Copy"), can.page.Remove(can, input)
can.user.toast(can, text, "复制成功")
event.stopPropagation(), event.preventDefault()
})
},
camera: function(can, msg, cb) {
@ -106,6 +100,8 @@ Volcanos("user", {help: "用户模块", agent: {
})
}
})
can.run(can.request({}, {text: meta.text})._event, ["search", "Footer.onimport.toast"], function() {}, true)
return ui
},
share: function(can, msg, cmd) {

View File

@ -1,29 +1,35 @@
body.mobile.landscape fieldset.Header.head {
position:unset;
}
body.mobile.landscape fieldset.Footer.foot {
position:unset;
}
body.mobile.landscape fieldset.Action.main {
margin-top:0; margin-bottom:0;
}
body.mobile fieldset.Header.head {
position:fixed;
position:fixed; top:0;
width:-webkit-fill-available;
height:48px; font-size:24px;
background-color:#000000b8;
z-index:10;
}
body.mobile fieldset.Header.head>div.output {
height:48px;
}
body.mobile fieldset.Footer.foot {
position:fixed; bottom:0px;
position:fixed; bottom:0;
width:-webkit-fill-available;
height:64px; font-size:24px;
background-color:#000000b8;
display:none;
z-index:10;
}
body.mobile fieldset.River {
background-color:#243950bf;
body.mobile fieldset.River.left {
position:fixed; top:48px;
min-width:240px;
font-size:24px;
background-color:#243950bf;
min-width:240px; font-size:24px;
z-index:10;
}
body.mobile fieldset.Action {
padding-top:48px;
body.mobile fieldset.Action.main {
margin-top:48px; margin-bottom:64px;
}
body.mobile select {
font-size:18px;

View File

@ -42,7 +42,7 @@ fieldset.Action div.output.grid fieldset.plugin>div.output {
width:480px; height:320px; overflow:auto;
}
fieldset.Action div.output.tabs fieldset.plugin {
display:none; position:absolute;
display:none;
}
fieldset.Action div.output.tabs fieldset.plugin.select {
display:block;

View File

@ -9,7 +9,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
can.onappend.plugin(can, item, function(sub, meta) {
can.onimport._plugin(can, river, storm, sub, meta), next()
sub._option.dataset = sub._option.dataset || {}
sub._option.dataset.id = item.id
item.id && (sub._option.dataset.id = item.id)
})
})
},
@ -23,7 +23,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
can.page.Modify(can, sub._output, {style: {"max-width": item.width-40}})
can.onengine.listen(can, "action.resize", function(width, height) {
can.page.Modify(can, sub._output, {style: {"max-width": item.width = width-40}})
can.page.Modify(can, sub._output, {style: {"max-width": width-40}})
item.width = width
})
can.page.Append(can, can._action, [{view: ["item", "div", item.name], onclick: function(event) {

View File

@ -18,6 +18,9 @@ fieldset.Footer>div.output>div:hover {
fieldset.Footer>div.output div.title {
float:left;
}
fieldset.Footer>div.output div.toast {
float:right;
}
fieldset.Footer>div.output div.state {
float:right;
}

View File

@ -14,7 +14,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onimport._title(can, msg, target)
can.onimport._state(can, msg, target)
can.onimport._search(can, msg, target)
// can.onengine._daemon(can, can.user.title())
can.onimport._background(can, msg, target)
can.onimport._agent(can, msg, target)
can.onimport._menu(can, msg, target)
@ -29,8 +28,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})
},
_state: function(can, msg, target) {
can.core.List(can.Conf("state")||["time", "username"], function(item) {
can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)], onclick: function(event) {
can.core.List(can.user.isMobile? ["username"]: can.Conf("state")||["time", "username"], function(item) {
can.page.Append(can, target, [{view: ["state "+item, "div", (can.Conf(item)||"").slice(0, 8)], onclick: function(event) {
can.core.CallFunc([can.onaction, item], [event, can, item])
}, _init: function(target) {
item == "time" && can.onimport._time(can, target)
@ -76,7 +75,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
_weixin: function(can, msg) { can.run({}, ["action", "wx"], function(msg) {
can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) {
can.user.agent = { __proto__: can.user.agent,
wx.config({debug: msg.Option("debug") == "true", jsApiList: can.core.Item({
scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) {
typeof cb == "function" && cb(res.resultStr)
} }) },
getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) {
typeof cb == "function" && cb({latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) })
} }) },
@ -86,14 +88,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
name: msg.Option("name"), address: msg.Option("text"),
scale: msg.Option("scale")||14, infoUrl: msg.Option("link"),
}) },
scanQRCode: function(cb) { wx.scanQRCode({ needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) {
typeof cb == "function" && cb(can.user.scan(res.resultStr))
} }) },
chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) {
typeof cb == "function" && cb(res.localIds)
} }) },
}
wx.config({debug: msg.Option("debug") == "true", jsApiList: can.core.Item(can.user.agent),
}, function(key, value) { return can.user.agent[key] = value, key }),
nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"),
appId: msg.Option("appid"), signature: msg.Option("signature"),
})

View File

@ -1,3 +1,6 @@
fieldset.word a {
word-break:break-word;
}
fieldset.word h1.story {
clear:both;
}

View File

@ -7,7 +7,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.page.Select(can, target, ".story", function(item) { var data = item.dataset||{}
can.core.CallFunc([can.onimport, data.type], [can, data, item])
can.page.Modify(can, item, {style: can.base.Obj(data.style)})
// delete(data.meta)
delete(data.meta)
})
},
@ -40,12 +40,19 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}
})
},
field: function(can, data, target) { var meta = can.base.Obj(data.meta)
meta.width = can.Conf("width"), meta.height = can.Conf("height")
can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) {
field: function(can, data, target) { var item = can.base.Obj(data.meta)
item.width = parseInt(can.Conf("width"))-20, item.height = parseInt(can.Conf("height"))
item.type = "story"
can.onappend._init(can, item, ["/plugin/state.js"], function(sub) {
sub.run = function(event, cmds, cb, silent) {
can.run(event, (cmds[0] == "search"? []: ["action", "story", data.type, data.name, data.text]).concat(cmds), cb, true)
can.run(event, (cmds && cmds[0] == "search"? []: ["action", "story", data.type, data.name, data.text]).concat(cmds), cb, true)
}
can.page.Modify(can, sub._output, {style: {"max-width": item.width-40}})
can.onengine.listen(can, "action.resize", function(width, height) {
can.page.Modify(can, sub._output, {style: {"max-width": width-60}})
sub.Conf("width", item.width = width-20)
})
}, can._output, target)
},

View File

@ -56,73 +56,31 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
},
upload: function(event, can) { can.user.upload(event, can) },
scanQRCode: function(event, can, cmd) {
can.user.agent.scanQRCode(function(text) { var cmds = ["action", cmd]
can.core.Item(can.base.parseJSON(text), function(key, value) { cmds.push(key, value) })
can.run(event, cmds, function(msg) { can.user.toast(can, "添加成功"), can.run() }, true)
})
},
scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
getClipboardData: function(event, can, cmd) {
navigator.clipboard.readText().then(text => { var cmds = ["action", cmd]
can.core.Item(can.base.parseJSON(text), function(key, value) { cmds.push(key, value) })
can.run(event, cmds, function(msg) { can.user.toast(can, text, "添加成功"), can.run() }, true)
}).catch((err) => { can.base.Log(err) })
},
getLocation: function(event, can, cmd) { var msg = can.request(can)
can.user.agent.getLocation(function(res) {
var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) })
can.run(event, ["action", cmd].concat(arg))
})
},
openLocation: function(event, can) { var msg = can.request(can)
can.user.agent.openLocation(msg)
},
scanQRCode0: function(event, can) { var msg = can.request(can)
can.user.agent.scanQRCode()
},
scanQRCode: function(event, can, cmd) { var msg = can.request(can)
can.user.agent.scanQRCode(function(res) {
var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) })
can.run(event, ["action", cmd].concat(arg))
can.run(event, ["action", cmd].concat(arg), function(msg) {
can.user.toast(can, "添加成功")
}, true)
})
},
openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) },
"参数": function(event, can) { can.page.Toggle(can, can._action) },
"清空": function(event, can, name) { can._output.innerHTML = "" },
"结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) {
can.run({})
}, true) },
"关闭": function(event, can) {
can.page.Remove(can, can._target)
},
"复制": function(event, can) {
can.onaction._show(can, args, {
position: "fixed",
left: layout.left+100, top: layout.top+100,
width: layout.width, height: layout.height,
})
},
"分屏": function(event, can) {
if (event.ctrlKey) {
layout.height = layout.height/2
can.onaction._resize(sub, layout)
can.onaction._show(can, args, {
position: "fixed",
left: layout.left, top: layout.top+layout.height+10,
width: layout.width, height: layout.height,
})
return
}
layout.width = layout.width/2
can.onaction._resize(sub, layout)
can.onaction._show(can, args, {
position: "fixed",
left: layout.left+layout.width+10, top: layout.top,
width: layout.width, height: layout.height,
})
},
"最大": function(event, can) {
can.page.Modify(can, can._target, {style: { margin: 0,
left: 0, top: 0, width: window.innerWidth, height: window.innerHeight
}})
var sub = can.core.Value(can, "_outputs.-1")
var cb = can.core.Value(can, "_outputs.-1.onimport.resize")
sub && cb && can.core.CallFunc(cb, {can: sub,
width: window.innerWidth, height: window.innerHeight,
})
},
"关闭": function(event, can) { can.page.Remove(can, can._target) },
"清空": function(event, can, name) { can.onmotion.clear(can, can._output) },
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -10,9 +10,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.core.Timer(100, function() { can.sub = sub._outputs[0]
can.sub.onmotion.hidden(can.sub, can.sub.ui.project)
can.onaction[can.Action("view")](event, can)
can.onlayout.resize(can, "action.resize", function(event) {
can.onaction[can.Action("view")](event, can)
})
})
}
})
@ -65,14 +62,14 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view",
var space = 10
var view = parseInt(can.Action("height"))
var max = parseInt(can.Conf("width"))-40
var step = parseInt(max / can.list.length)||2
var max = parseInt(can.Conf("width"))
var step = parseInt(max / (can.list.length+1))||2
can.onmotion.clear(can, sub.svg)
var width = can.list.length * step + space * 2
var height = view + space * 2
sub.svg.Val("height", height)
sub.svg.Val("width", width)
sub.svg.Val("width", width-space*2+5)
function compute(y) { return (y - can.min)/(can.max - can.min)*view }
can.core.Next(can.list, function(line, next, index) {

View File

@ -3,15 +3,14 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
if (can.onimport._process(can, msg)) { return typeof cb == "function" && cb(can, msg) }
can.onmotion.clear(can)
can.ui = can.onlayout.display(can)
typeof cb == "function" && cb(msg)
can.page.Append(can, can.ui.content, [can.onimport._control(can, msg)])
can.page.Append(can, target, [can.onimport._control(can, msg)])
can.onappend.table(can, msg, function(value, key, index, line, array) {
return can.onimport._table(can, value, key, index, line, array)
}, can.ui.content)
})
can.onappend.board(can, msg.Result(), can.ui.display)
can.onappend.board(can, msg.Result())
can.onimport._board(can, msg)
},
_table: function(can, value, key, index, line, array) {
@ -57,9 +56,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
_follow: function(can, msg) {
if (msg.Option("cache.status") == "stop") { return can.user.toast(can, msg.Option("cache.action")+" done!")}
can.page.Modify(can, can.ui.display, {className: "code", style: {"max-height": 400, "display": "block"}})
can.page.Append(can, can.ui.display, [{text: msg.Result()}])
can.ui.display.scrollBy(0, 1000)
can.page.Modify(can, can._output, {className: "code", style: {"max-height": 400, "display": "block"}})
can.page.Append(can, can._output, [{text: msg.Result()}])
can._output.scrollBy(0, 1000)
can.core.Timer(100, function() { var sub = can.request({})
sub.Option("cache.hash", msg.Option("cache.hash"))
@ -74,11 +73,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
_inner: function(can, msg) {
can.onappend.table(can, msg, function(value, key, index, line, array) {
return can.onimport._table(can, value, key, index, line, array)
}, can.ui.display)
}, can._output)
can.onappend.board(can, msg.Result(), can.ui.display)
can.onappend.board(can, msg.Result(), can._output)
can.onimport._board(can, msg)
can.page.Modify(can, can.ui.display, {style: {display: "block"}})
can.page.Modify(can, can._output, {style: {display: "block"}})
return true
},
@ -122,7 +121,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
{input: ["cache.value", function(event) {
if (event.key == "Enter") {
can.page.Select(can, can.ui.content, "tr", function(tr, index) {
can.page.Select(can, can._output, "tr", function(tr, index) {
if (event.target.value == "") { can.page.Modify(can, tr, {style: {"display": ""}}); return }
index > 0 && can.page.Modify(can, tr, {style: {"display": "none"}})
can.page.Select(can, tr, "td", function(td, index) {