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

opt action.js

This commit is contained in:
harveyshao 2022-01-12 18:13:27 +08:00
parent a0ab9b8020
commit 02fcf73f17
17 changed files with 215 additions and 215 deletions

View File

@ -5,14 +5,14 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta,
}
if (can.user.isExtension) { Volcanos.meta.args = JSON.parse(localStorage.getItem(ctx.ARGS))||{} }
can.core.Next(list, function(item, next) { item.type = chat.PANEL
can.onappend._init(can, item, item.list, function(panel) {
can.onappend._init(can, item, item.list, function(panel) { panel.Conf(item)
panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds||[]
return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb)
}, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction && panel.onaction._trans||{}
can.core.ItemCB(panel.onaction, function(key, cb) {
can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) })
}), panel.onaction._init(panel, item, item.list, next, panel._target)
}), can.core.CallFunc([panel.onaction, "_init"], {can: panel, cb: next, target: panel._target})
}, target)
}, function() { can.misc.Log(can.user.title(), ice.RUN, can)
can.require([can.volcano], null, function(can, name, sub) { can[name] = sub })
@ -165,7 +165,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.base.isFunc(cb) && cb(sub)
}); return sub
},
_option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {})
_option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg||meta.opt, []), opts = can.base.Obj(meta.opts, {})
function add(item, next) { item.type != html.BUTTON && index++
return Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name),
_target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option),
@ -425,10 +425,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
},
}, [], function(can) {})
Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = target||document.body
var list = []; document.body.onresize = function() {
can.core.Delay(list, 1000, function() { can.onlayout._init(can, target) })
}
// var list = []; document.body.onresize = function() {
// can.core.Delay(list, 1000, function() { can.onlayout._init(can, target) })
// }
//
var width = window.innerWidth, height = window.innerHeight
can.page.Select(can, target, [can.core.Keys(html.FIELDSET, chat.HEAD), can.core.Keys(html.FIELDSET, chat.FOOT)], function(field) {
height -= field.offsetHeight
@ -447,10 +447,9 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
if (can.user.isMobile) {
can.page.Modify(can, field, {style: {"padding-top": can.user.isLandscape()? "0px": ""}})
} else {
height -= can.page.Select(can, field, can.core.Keys(html.DIV, html.ACTION))[0].offsetHeight
can.page.Modify(can, field, {style: {height: height}})
can.page.Select(can, target, "fieldset.main>div.output", function(output) {
height -= can.page.Select(can, field, can.core.Keys(html.DIV, html.ACTION))[0].offsetHeight
can.page.Modify(can, output, {style: {height: height}})
})
}
@ -537,6 +536,11 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
clear: function(can, target) {
return can.page.Modify(can, target||can._output, ""), true
},
share: function(event, can, input, args) {
return can.user.input(event, can, input, function(ev, button, data, list, _args) {
can.search(can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(args||[], _args||[])})._event, ["Header.onaction.share"])
})
},
story: {
_hash: {
spark: function(can, meta, target) {
@ -661,6 +665,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
}
},
move: function(can, target, layout, cb) { var begin
can.page.Modify(can, target, {style: layout})
target.onmousedown = function(event) {
layout.height = target.offsetHeight, layout.width = target.offsetWidth
layout.left = target.offsetLeft, layout.top = target.offsetTop

View File

@ -63,7 +63,7 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg
},
Push: function(key, value, detail) {
if (can.base.isObject(key)) {
value = value || can.core.Item(key), can.core.List(value, function(item) {
value = value||can.core.Item(key), can.core.List(value, function(item) {
detail? msg.Push(mdb.KEY, item).Push(mdb.VALUE, key[item]||""):
msg.Push(item, key[item]||"")
})

View File

@ -337,7 +337,7 @@ Volcanos("page", {help: "用户界面", ClassList: {
if (item.password) { return item }
item.autocomplete = "off"
item.value = value||item.value||""
item.className || can.page.ClassList.add(can, item, "args")
item.className || can.page.ClassList.add(can, item, ctx.ARGS)
break
case html.SELECT: input.type = html.SELECT
item.values = can.base.isString(item.values)? can.core.Split(item.values): item.values
@ -345,7 +345,7 @@ Volcanos("page", {help: "用户界面", ClassList: {
item.value = value||item.value, input.list = item.values.map(function(value) {
return {type: html.OPTION, value: value, inner: value}
}), item.className || can.page.ClassList.add(can, item, "args")
}), item.className || can.page.ClassList.add(can, item, ctx.ARGS)
break
case html.BUTTON: item.value = item.value||item.name||"list"; break
case "upfile": item.type = html.FILE; break
@ -354,5 +354,17 @@ Volcanos("page", {help: "用户界面", ClassList: {
}
return input
},
style: function(can, target, style) { var value = {}
for (var i = 2; i < arguments.length; i += 2) {
if (typeof arguments[i] == lang.OBJECT) {
can.base.Copy(value, arguments[i--])
} else {
value[arguments[i]] = arguments[i+1]
}
}
can.page.Modify(can, target, {style: value})
return value
},
})

View File

@ -56,14 +56,13 @@ Volcanos("user", {help: "用户操作", agent: {
language: function(can) {
return can.misc.Search(can, "language")
},
trans: function(can, text) {
if (can.user.language(can) == "en") { return text }
if (can.base.isObject(text)) {
trans: function(can, text, list) { if (can.base.isObject(text)) {
return can.core.Item(text, function(k, v) { can.core.Value(can._trans, k, v) })
}
if (can.user.language(can) == "en") { return text }
if (can.base.isFunction(text)) { text = text.name||"" }
return can._trans&&can._trans[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || {
return list&&list[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || can._trans&&can._trans[text] || {
"create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑",
"inputs": "补全", "prunes": "清理", "export": "导出", "import": "导入",
"list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享",
@ -78,8 +77,8 @@ Volcanos("user", {help: "用户操作", agent: {
"label": "标签", "exec": "执行",
}[text]||text
},
toastSuccess: function(can) {
can.user.toast(can, ice.SUCCESS)
toastSuccess: function(can, title) {
can.user.toast(can, ice.SUCCESS, title)
},
toast: function(can, content, title, duration, progress) {
var meta = can.base.isObject(content)? content: {content: content, title: title||can._help, duration: duration, progress: progress}
@ -233,6 +232,7 @@ Volcanos("user", {help: "用户操作", agent: {
},
input: function(event, can, form, cb, button) { // form [ string, array, object, {type: "select", values: []}
if (!form || form.length == 0) { return cb()}
var msg = can.request(event)
var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [
{view: [chat.OPTION, html.TABLE], list: can.core.List(form, function(item) {

View File

@ -1,73 +1,69 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) {
var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM)
can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN
item.height = parseInt(can.Conf(html.HEIGHT))-240, item.width = parseInt(can.Conf(html.WIDTH))-40
item.feature = can.base.Obj(item.feature||item.meta), item.inputs = can.base.Obj(item.inputs||item.list)
item.height = parseInt(can.Conf(html.HEIGHT))-can.Conf(html.MARGIN_Y)
item.width = parseInt(can.Conf(html.WIDTH))-can.Conf(html.MARGIN_X)
item.feature = can.base.Obj(item.feature||item.meta)
item.inputs = can.base.Obj(item.inputs||item.list)
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.onimport._plugin(can, river, storm, sub, meta), skip || next()
})
}, function() {
}, function() { can.onimport._menu(can, msg), can.onkeypop._init(can)
can.onaction.layout(can, can.misc.Search(can, chat.LAYOUT)||can.Conf(chat.LAYOUT))
!can.user.isMobile && can.onimport._menu(can, msg)
})
},
_plugin: function(can, river, storm, sub, meta) {
sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[]
var toast = msg.Option("_toast") && can.user.toast(can, msg.Option("_toast"), "", -1)
return can.run(event, can.misc.concat([river, storm, meta.id||meta.index||can.core.Keys(meta.key, meta.name)], cmds), function(msg) {
toast && toast.close(), can.base.isFunc(cb) && cb(msg)
})
_plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
return can.run(event, can.misc.concat([river, storm, meta.id||meta.index||can.core.Keys(meta.key, meta.name)], cmds||[]), cb)
}, can._plugins = (can._plugins||[]).concat([sub])
can.page.Modify(can, sub._output, {style: {"max-width": meta.width}})
can.page.Append(can, can._action, [{view: [html.ITEM, html.DIV, meta.name], onclick: function(event) {
can.onmotion.select(can, can._output, "fieldset.plugin", sub._target)
can.onmotion.select(can, can._action, "div.item", event.target)
}}])
meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id)
sub._option.dataset = sub._option.dataset||{}
meta.id && (sub._option.dataset.id = meta.id)
sub._target.Meta = meta
can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_WIDTH, meta.width)})
can.page.Append(can, can._action, [{view: [html.ITEM, html.DIV, meta.name], onclick: function(event) {
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target)
can.onmotion.select(can, can._action, html.DIV_ITEM, event.target)
}}])
},
_menu: function(can, msg) { if (can.user.mod.isPod||can.user.isMobile) { return }
can._menu && can.page.Remove(can, can._menu)
can._menu = can.search({}, ["Header.onimport.menu", ctx.ACTION].concat(
can.base.Obj(msg.Option("menus"), [
["help", "tutor", "manual", "service", "devops", "refer"],
])
), function(event, button, list) {
list[0] == "help"? can.user.open("/help/"+button+".shy"): can.onaction.layout(can, button)
})
can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), [
[chat.LAYOUT, "auto", "flow", "grid", "tabs", "free"],
[ice.HELP, "tutor", "manual", "service", "devops", "refer"],
]), function(event, button, list) { can.core.CallFunc([can.onaction, list[0]], [can, button]) })
},
_share: function(can, share) { if (!share) { return }
can.run({}, ["_share", share], function(msg) {
can.user.topic(can, can.misc.Search(can, chat.TOPIC)||msg.Option(chat.TOPIC))
can.user.title(can.misc.Search(can, chat.TITLE)||msg.Option(chat.TITLE))
can.onaction.layout(can, "auto")
if (msg[mdb.INDEX].length == 1) {
can.user.mod.isCmd = true, can.page.ClassList.add(can, can._target, "cmd")
can.page.Select(can, document.body, "fieldset.panel", function(item) {
item != can._target && can.onmotion.hidden(can, item)
})
can.Conf({height: window.innerHeight, width: window.innerWidth+40})
} else {
can.Conf({height: window.innerHeight, width: window.innerWidth})
}
can.Conf(chat.RIVER, "_share"), can.Conf(chat.STORM, share)
can.onimport._init(can, msg)
_share: function(can, share) { share && can.run({}, ["_share", share], function(msg) {
can.user.topic(can, can.misc.Search(can, chat.TOPIC)||msg.Option(chat.TOPIC))
can.user.title(can.misc.Search(can, chat.TITLE)||msg.Option(chat.TITLE))
can.page.Select(can, document.body, html.FIELDSET_PANEL, function(item) {
item != can._target && can.onmotion.hidden(can, item)
})
can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT)
can.page.ClassList.add(can, can._target, ice.CMD)
can.onlayout._init(can)
can.Conf(chat.RIVER, "_share", chat.STORM, share)
can.onimport._init(can, msg)
}) },
_cmd: function(can, item, next) {
can.base.Copy(item, {
height: can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y),
width: can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X),
opts: can.misc.Search(can),
})
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.user.title(meta.name), skip || next()
})
},
})
Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, msg, can, cmds, cb) {
if (!can._root.river) { return false }
var list = can._root.river; var river = list[cmds[0]]
var storm = river && river.storm[cmds[1]]
var storm = can.core.Value(can._root, can.core.Keys(chat.RIVER, cmds[0], chat.STORM, cmds[1]))
if (!storm || cmds.length != 2) { return false }
if (storm.index) { cmds = [ctx.ACTION, ctx.COMMAND].concat(storm.index)
can.run(event, cmds, cb) // 命令详情
if (storm.index) { // 命令索引
can.run(event, [ctx.ACTION, ctx.COMMAND].concat(storm.index), cb)
} else { // 命令列表
can.core.List(storm.list, function(value) {
msg.Push(mdb.NAME, value.name||"")
@ -76,86 +72,86 @@ Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, p
msg.Push(ctx.FEATURE, JSON.stringify(value.feature))
msg.Push(ctx.INDEX, value.index||"")
msg.Push(ctx.ARGS, value.args||"[]")
msg.Push("_action", value._action||"")
msg.Push(ice.MSG_ACTION, value._action||"")
}), can.base.isFunc(cb) && cb(msg)
}
return true
},
})
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
can._target.ontouchstart = function(event) {
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, target) {
can.Conf(html.MARGIN_Y, 4*html.PLUGIN_MARGIN+2*html.ACTION_HEIGHT+html.ACTION_MARGIN)
can.Conf(html.MARGIN_X, 4*html.PLUGIN_MARGIN)
target.ontouchstart = function(event) {
can.onengine.signal(can, "onaction_touch", can.request(event))
}
can.base.isFunc(cb) && cb()
}, can.base.isFunc(cb) && cb()
},
onmain: function(can, msg) {
_trans: {
"layout": "布局",
"auto": "默认布局",
"flow": "流动布局",
"grid": "网格布局",
"tabs": "标签布局",
"free": "自由布局",
"help": "帮助",
"tutor": "入门简介",
"manual": "使用手册",
"service": "服务手册",
"devops": "编程手册",
"refer": "参考手册",
},
onmain: function(can) {
can.onimport._share(can, can.misc.Search(can, web.SHARE))
can.onkeypop._init(can)
},
onlogin: function(can) { if (!can.user.mod.isCmd) { return }
can.page.ClassList.add(can, can._target, "cmd")
can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT)
can.page.ClassList.add(can, can._target, ice.CMD)
can.onlayout._init(can)
can._names = location.pathname
can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) {
can.core.Timer(500, function() { can.onaction._plugin(can, item, next) })
can.onimport._cmd(can, item, next)
}): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) {
can.core.Next(msg.Table(), function(item, next) {
can.onaction._plugin(can, item, next)
can.onimport._cmd(can, item, next)
})
})
},
_plugin: function(can, item, next) {
can.base.Copy(item, {height: window.innerHeight, width: window.innerWidth, opts: can.misc.Search(can)})
can.onappend.plugin(can, item, function(sub, meta) { can.user.title(meta.name), next() })
},
onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can)
function key(name) { return can.core.Keys(can.Conf(chat.RIVER), can.Conf(chat.STORM), name) }
can.page.Cache(key(html.ACTION), can._action, can._output.scrollTop+1)
can.page.Cache(key(html.OUTPUT), can._output, can._output.scrollTop+1)
can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm) // 转场
can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)
var position = can.page.Cache(key(html.ACTION), can._action)
var position = can.page.Cache(key(html.OUTPUT), can._output)
if (position) { can._output.scrollTo(0, position-1); return }
can.run({}, [river, storm], function(msg) {
if (msg.Length() == 0) { // 添加工具
can.onengine.signal(can, "onaction_nostorm", can.request({}, {river: river, storm: storm}))
} else {
can.onimport._init(can, msg)
}
can.run({}, [river, storm], function(msg) { if (msg.Length() > 0) { return can.onimport._init(can, msg) }
can.onengine.signal(can, "onaction_notool", can.request({}, {river: river, storm: storm}))
})
},
onsearch: function(can, msg, word) {
if (word[0] == "*" || word[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, word) }
},
onsize: function(can, msg, width, height) { can.Conf({width: width, height: height}) },
onsize: function(can, msg, height, width) { can.Conf({height: height, width: width}) },
layout: function(can, layout) { if (!layout) { return }
var trans = {
"默认布局": "auto",
"流动布局": "flow",
"网格布局": "grid",
"标签布局": "tabs",
"自由布局": "free",
help: function(can, button) { can.user.open("/help/"+button+".shy") },
layout: function(can, button) { can.Conf(chat.LAYOUT, button)
can.page.Modify(can, can._action, {className: chat.ACTION+ice.SP+button})
can.page.Modify(can, can._output, {className: chat.OUTPUT+ice.SP+button})
if (button == "tabs" && !can.tabs) { can.tabs = true
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0)
can.onmotion.select(can, can._action, html.DIV_ITEM, 0)
}
layout = trans[layout]||layout, can.Conf(chat.LAYOUT, layout)
can.page.Modify(can, can._action, {className: "action "+layout})
can.page.Modify(can, can._output, {className: "output "+layout})
if (layout == "tabs" && !can.tabs) {
can.onmotion.select(can, can._output, "fieldset.plugin", 0)
can.onmotion.select(can, can._action, "div.item", 0)
can.tabs = true
if (button == "free" && !can.free) { can.free = true
can.page.Select(can, can._target, html.DIV_OUTPUT+ice.GT+html.FIELDSET_PLUGIN, function(item, index) {
can.page.Modify(can, item, {style: {left: 40*index, top: 40*index}})
can.onmotion.move(can, item, {left: 40*index, top: 40*index})
})
}
if (layout == "free" && !can.free) {
can.page.Select(can, can._target, "div.output>fieldset.plugin", function(item, index) {
can.page.Modify(can, item, {style: {left: 20*index, top: 20*index}})
can.onmotion.move(can, item, {left: 20*index, top: 20*index})
}), can.free = true
}
can.onlayout._init(can)
},
})
@ -196,31 +192,32 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
}, _engine: {},
})
Volcanos("onexport", {help: "导出数据", list: [],
args: function(can, msg, list, cb, target) {
can.core.Next(can.page.Select(can, target, "fieldset.plugin>form.option"), function(item, next, index, array) {
var list = can.page.Select(can, item, '.args', function(item) { return item.value||"" })
item.dataset.args = JSON.stringify(list), cb(item, next, index, array)
args: function(can, cb, target) {
can.core.Next(can.page.Select(can, target, html.FIELDSET_PLUGIN+ice.GT+html.FORM_OPTION), function(item, next, index, array) {
item.dataset.args = JSON.stringify(can.page.Select(can, item, html.OPTION_ARGS, function(item) { return item.value||"" }))
cb(item, next, index, array)
})
},
size: function(can, msg) {
msg.Option(chat.TOP, can._target.offsetTop)
msg.Option(chat.LEFT, can._target.offsetLeft)
msg.Option(html.TOP, can._target.offsetTop)
msg.Option(html.LEFT, can._target.offsetLeft)
msg.Option(html.WIDTH, can._target.offsetWidth)
msg.Option(html.HEIGHT, can._target.offsetHeight)
msg.Option(chat.SCROLL, can.user.isMobile? can._target.parentNode.parentNode.scrollTop: can._output.scrollTop)
msg.Option(html.HEIGHT, can._target.offsetHeight-can._action.offsetHeight)
msg.Option(html.SCROLL, can.user.isMobile? can._target.parentNode.parentNode.scrollTop: can._output.scrollTop)
msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X))
msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y))
},
layout: function(can, msg) { return can.Conf(chat.LAYOUT) },
plugin: function(can, msg, word) {
var fields = msg.Option(ice.MSG_FIELDS).split(ice.FS)
can.page.Select(can, can._output, "fieldset.plugin>legend", function(item) {
plugin: function(can, msg, word) { var fields = can.core.Split(msg.Option(ice.MSG_FIELDS))
can.page.Select(can, can._output, html.FIELDSET_PLUGIN+ice.GT+html.LEGEND, function(item) {
if (item.innerHTML.indexOf(word[1]) == -1) { return }
var meta = item.parentNode.Meta
var list = can.page.Select(can, item.nextSibling, '.args', function(item) { return item.value||"" })
var meta = item.parentNode._meta
var list = can.page.Select(can, item.nextSibling, html.OPTION_ARGS, function(item) { return item.value||"" })
var data = {ctx: "web.chat", cmd: ctx.ACTION,
type: mdb.PLUGIN, name: item.innerHTML, text: shy("跳转", function(event) {
var input = can.page.Select(can, item.parentNode, "input.args")[0]
var input = can.page.Select(can, item.parentNode, html.INPUT_ARGS)[0]
input && input.focus()
}), argument: JSON.stringify(list),
}
@ -231,7 +228,7 @@ Volcanos("onexport", {help: "导出数据", list: [],
} else {
return
}
can.core.List(fields, function(key) { msg.Push(key, data[key]||"") })
msg.Push(data, fields)
})
},
})

View File

@ -55,8 +55,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})
},
})
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) {
can.base.isFunc(cb) && cb(msg)
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) {
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) },
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.toast, {can: can, msg: msg}) },

View File

@ -100,18 +100,19 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
avatar: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return }
can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { can.onimport._avatar(can, msg) })
},
menu: function(can, cmds, cb) {
menu: function(can, cmds, cb, trans) {
return can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(cmds.slice(1), function(item) {
if (can.base.isString(item)) {
return {view: [html.MENU, html.DIV, can.user.trans(can, item)], onclick: function(event) {
return {view: [html.MENU, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) {
can.base.isFunc(cb) && cb(event, item, cmds)
}}
} else if (can.base.isArray(item)) {
return {view: [html.MENU, html.DIV, can.user.trans(can, item[0])], onmouseenter: function(event) {
can.onaction.carte(event, can, item.slice(1), function(event, button) {
can.base.isFunc(cb) && cb(event, button, item)
})
var list = can.core.List(item, function(value, index) { return can.user.trans(can, value, trans) })
return {view: [html.MENU, html.DIV, can.user.trans(can, list[0], trans)], onmouseenter: function(event) {
can.onaction.carte(event, can, list.slice(1), function(event, button, meta, index) {
can.base.isFunc(cb) && cb(event, item[index+1], item)
}, trans)
}}
} else if (can.base.isObject(item)) {
@ -120,7 +121,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}) }]).first
},
})
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta, list, cb, target) {
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) {
can.base.isFunc(cb) && cb()
},
_trans: {
@ -129,13 +130,6 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta,
"create": "创建",
"share": "共享",
"help": "帮助",
"tutor": "入门简介",
"manual": "使用手册",
"service": "服务手册",
"devops": "编程手册",
"refer": "参考手册",
"setting": "设置",
"black": "黑色主题",
"white": "白色主题",
@ -202,8 +196,11 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta,
})
},
carte: function(event, can, list, cb) { can.user.carte(event, can, can.onaction, list, cb) },
share: function(event, can, arg) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(arg||[])) },
carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb) },
share: function(event, can, args) {
can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[],
[chat.RIVER, can.Conf(chat.RIVER), chat.STORM, can.Conf(chat.STORM)]))
},
usernick: function(event, can) {
can.onaction.carte(event, can, ["shareuser", "setnick", [aaa.LANGUAGE, aaa.CHINESE, aaa.ENGLISH], cli.CLEAR, aaa.LOGOUT])

View File

@ -21,7 +21,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can._main_storm = can.misc.Search(can, chat.STORM)||msg.Option(ice.MSG_STORM)||Volcanos.meta.args.storm||can._main_storm
},
_menu: function(can, msg) { if (can.user.mod.isPod) { return }
can.search({}, ["Header.onimport.menu"].concat(can.base.Obj(msg.Option(chat.MENUS), can.ondetail.menus)), function(event, button) {
can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.ondetail.menus), function(event, button) {
can.core.CallFunc([can.ondetail, button], [event, can, button, can.Conf(chat.RIVER), can.Conf(chat.STORM)])
})
},
@ -66,7 +66,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, c
}), can.base.isFunc(cb) && cb(msg); return true
},
})
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, list, cb, target) {
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, cb, target) {
can.onengine.plugin(can, "info", shy("信息", {}, ["text", "list", "back"], function(msg, cmds) {
msg.Echo(JSON.stringify(can))
}))
@ -96,7 +96,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
can.onmotion.float.del(can, chat.CARTE)
can.user.isMobile && can.onmotion.hidden(can)
},
onaction_nostorm: function(can, msg, river, storm) {
onaction_notool: function(can, msg, river, storm) {
can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm)
},
@ -140,7 +140,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
},
refresh: function(event, can) {
var args = {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM),
topic: can.get("Header", "topic"), layout: can.get("Action", "layout"),
topic: can.getHeader(chat.TOPIC), layout: can.getAction(chat.LAYOUT),
}
if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) }
can.misc.Search(can, args)
@ -156,17 +156,11 @@ Volcanos("ondetail", {help: "菜单交互",
"创建群组": function(event, can) { can.onaction.create(event, can) },
"共享群组": function(event, can, button, river) {
can.user.input(event, can, [{name: chat.TILTE, value: river, _trans: "标题"}], function(event, button, meta, list) {
can.user.share(can, can.request(event), [river, ctx.ACTION, chat.SHARE, mdb.TYPE, chat.RIVER, mdb.NAME, list[0]])
})
can.onmotion.share(event, can, [{name: chat.TITLE, value: river}], [mdb.TYPE, chat.RIVER])
},
"添加应用": function(event, can, button, river) { can.ondetail.create(event, can, button, river) },
"共享应用": function(event, can, button, river, storm) {
can.user.input(event, can, [{name: chat.TILTE, value: storm, _trans: "标题"}], function(event, button, meta, list) {
can.user.share(can, can.request(event), [river, ctx.ACTION, chat.SHARE, mdb.TYPE, chat.STORM, mdb.NAME, list[0],
chat.STORM, storm, chat.RIVER, river,
])
})
can.onmotion.share(event, can, [{name: chat.TITLE, value: storm}], [mdb.TYPE, chat.STORM])
},
"添加工具": function(event, can, button, river, storm) {
can.user.select(event, can, ctx.COMMAND, "context,command", function(item, next) {
@ -232,11 +226,12 @@ Volcanos("ondetail", {help: "菜单交互",
},
"保存参数": function(event, can, button, river, storm) {
can.search(event, ["Action.onexport.args"], function(item, next, index, array) {
var msg = can.request({}, {hash: storm, id: item.dataset.id})
var toast = can.user.toast(can, (index+1)+ice.PS+array.length, "保存参数", 10000, (index+1)/array.length)
can.getAction(ctx.ARGS, function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id})
var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length)
can.run(msg._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY, ice.ARG, item.dataset.args], function(msg) {
toast.close(), next()
can.core.Timer(200, function() {
toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can, button)
})
})
})
},

View File

@ -43,7 +43,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})
},
})
Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DONE], _init: function(can, meta, list, cb, target) {
Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DONE], _init: function(can, cb, target) {
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) {

View File

@ -78,7 +78,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}, ["/plugin/local/chat/div.css"])
Volcanos("onaction", {help: "操作数据", list: [],
"添加": function(event, can) {
can.user.input(event, can, ["name", "index", "args", "style", "width", "height"], function(event, button, data, list, args) {
can.user.input(event, can, [mdb.NAME, ctx.INDEX, ctx.ARGS, ctx.STYLE, html.HEIGHT, html.WIDTH], function(event, button, data, list, args) {
can.current._add({meta: data, list: []})
})
},
@ -88,8 +88,7 @@ Volcanos("onaction", {help: "操作数据", list: [],
}, true)
},
"预览": function(event, can) {
can.request(event, {link: can.misc.MergeURL(can, {_path: "/chat/div/"+can.Option("hash")})})
can.search(event, ["Header.onaction.share"])
can.onmotion.share(event, can, [], [mdb.LINK, can.misc.MergeURL(can, {_path: "/chat/div/"+can.Option("hash")})])
},
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -14,8 +14,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
can.onimport.project(can, msg.Option(nfs.PATH))
can.base.isFunc(cb) && cb(msg)
},
_content: function(can, target) {
var height = can.Conf(html.HEIGHT)-(can.user.mod.isCmd? 54: 320); height < 240 && (height = 240)
_content: function(can, target) { var height = can.Conf(html.HEIGHT)
can.page.Modify(can, can.ui.project, {style: {"max-height": height}})
can.page.Modify(can, can.ui.content, {style: {"max-height": height}})
can.page.Modify(can, can.ui.display, {style: {display: chat.NONE}})

View File

@ -12,7 +12,6 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
nav = nav||can.page.Append(can, can._fields, [{view: wiki.NAVMENU}]).first
can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output)
can.page.Modify(can, nav, {style: {height: can.Conf(html.HEIGHT)}})
can.onappend.list(can, can.base.Obj(data.data), function(event, item) {
var link = item.meta.link, list = can.core.Split(item.meta.link)
if (can.core.Value(can, list[0])) { return can.core.CallFunc([can, list[0]], list.slice(1)) }
@ -27,11 +26,14 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
return true
}, nav), can.sup._navmenu = nav
can.Conf(html.WIDTH, can.Conf(html.WIDTH)-nav.offsetWidth-(can.user.mod.isCmd? 10: 20))
can.page.Modify(can, can._output, {style: kit.Dict(
html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.Conf(html.WIDTH),
html.FLOAT, html.LEFT, html.CLEAR, html.NONE
)})
can.getActionSize(function(msg) {
can.page.Modify(can, nav, {style: {height: can.Conf(html.HEIGHT)+(can.user.mod.isCmd? msg.Option(html.MARGIN_Y): 0)}})
can.Conf(html.WIDTH, can.Conf(html.WIDTH)-nav.offsetWidth-(can.user.mod.isCmd? 10: 20))
can.page.Modify(can, can._output, {style: kit.Dict(
html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.Conf(html.WIDTH),
html.FLOAT, html.LEFT, html.CLEAR, html.NONE
)})
})
},
premenu: function(can, data, target) {
can.page.Select(can, can._output, "h2.story, h3.story", function(item) {
@ -64,7 +66,9 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
can.onappend._init(can, item, ["/plugin/state.js"], function(sub) {
sub.run = function(event, cmds, cb, silent) {
can.run(event, can.misc.concat([ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true)
}, sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20)
}
sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT))
sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20)
can.core.Value(item, "auto.cmd") && can.core.Timer300ms(function() {
var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option("_handle", ice.TRUE)

View File

@ -72,7 +72,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf,
},
})
Volcanos("onaction", {help: "交互操作", list: [
"共享工具", "生成链接", "生成脚本", "保存参数", "清空参数", "刷新数据", [
"共享工具", "生成链接", "生成脚本", "清空参数", "刷新数据", [
"其它 ->", "复制数据", "下载数据", "清空数据", "删除工具", "摄像头", "生成图片",
],
], _init: function(can, msg, list, cb, target) {},
@ -80,21 +80,16 @@ Volcanos("onaction", {help: "交互操作", list: [
can.Update(event, [ctx.ACTION, button].concat(can.Input([], true)))
},
"共享工具": function(event, can) { var meta = can.Conf()
var ui = can.user.input(event, can, [{name: chat.TITLE, value: meta.name}], function(ev, button, data, list) {
var msg = can.request(event, {arg: [mdb.TYPE, chat.FIELD,
mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)),
chat.TITLE, list[0], chat.RIVER, can.Conf(chat.RIVER), chat.STORM, can.Conf(chat.STORM),
]})
can.search(event, ["Header.onaction.share"])
}); can.onlayout.figure(event, can, ui._target, true)
can.onmotion.share(event, can, [{name: chat.TITLE, value: meta.name}], [
mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)),
])
},
"生成链接": function(event, can) { var meta = can.Conf()
var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" }
var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd))
args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path})
var msg = can.request(event, {link: can.misc.MergeURL(can, args)})
can.search(event, ["Header.onaction.share"])
can.onmotion.share(event, can, [], [mdb.LINK, can.misc.MergeURL(can, args)])
},
"生成脚本": function(event, can, button) { var conf = can.Conf()
var args = can.Input("", true).join(ice.SP); var list = [
@ -109,10 +104,7 @@ Volcanos("onaction", {help: "交互操作", list: [
can.onmotion.story.auto(can, ui._target)
can.user.copy(event, can, list[0])
},
"保存参数": function(event, can) { var meta = can.Conf()
var msg = can.request(event, {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), id: meta.id})
can.search(event, ["River.ondetail.保存参数"], function(msg) { can.user.toastSuccess(can) }, true)
},
"保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) },
"清空参数": function(event, can) {
can.page.SelectArgs(can, can._option, "", function(item) { return item.value = "" })
},

View File

@ -178,25 +178,13 @@ Volcanos("ondetail", {help: "用户交互", list: [],
})
},
figure: function(can, sub, msg, cb) {
can.get("Action", "size", function(left, top, width, height) { left = left||0
if (height > window.innerHeight) { height = window.innerHeight }
can.getActionSize(function(left, top, width, height) { left = left||0
var top = 120, margin = 20; if (can.user.isMobile) { margin = 0
if (can.user.isLandscape()) {
height += (can.user.mod.isCmd? -20: 200)
top = 24, sub.Conf(html.HEIGHT, height-top)
} else {
height += (can.user.mod.isCmd? -80: 200)
top = 48, sub.Conf(html.HEIGHT, height-top)
}
} else {
height += (can.user.mod.isCmd? 0: 300)
sub.Conf(html.HEIGHT, height-top)
top = can.user.isLandscape()? 24: 48
}
var layout = {position: "fixed", left: left+margin, top: top}
can.onmotion.move(can, sub._target, layout)
can.page.Modify(can, sub._target, {style: layout})
can.page.Modify(can, sub._output, {style: {"max-width": width-margin*2}})
can.onmotion.move(can, sub._target, {position: html.FIXED, left: left+margin, top: top})
can.page.style(can, sub._output, html.MAX_WIDTH, width-margin*2)
sub.Conf(html.HEIGHT, height-top-2*html.ACTION_HEIGHT)
can.base.isFunc(cb) && cb(msg)
})
},

View File

@ -46,7 +46,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
can.onmotion.toggle(can, can._status)
},
"趋势图": function(event, can) { var height = can.Action(html.HEIGHT)
if (height == "max") { height = can.Conf(html.HEIGHT) - chat.CMD_MARGIN }
if (height == "max") { height = can.Conf(html.HEIGHT) }
height = parseInt(height)
var space = 10, width = parseInt(can.Conf(html.WIDTH))

View File

@ -6,7 +6,7 @@ var kit = {
}
}
var ice = {
SP: " ", PS: "/", PT: ".", FS: ",", NL: "\n",
SP: " ", PS: "/", PT: ".", FS: ",", NL: "\n", LT: "<", GT: ">",
POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg", OPT: "opt",
RUN: "run", RES: "res", ERR: "err",
@ -52,8 +52,8 @@ var ice = {
var ctx = {
CONTEXT: "context", COMMAND: "command", ACTION: "action", CONFIG: "config",
INDEX: "index", ARGS: "args", STYLE: "style",
INPUTS: "inputs", FEATURE: "feature",
INDEX: "index", ARGS: "args",
}
var cli = {
CODE: "code", COST: "cost", FROM: "from", BACK: "back",
@ -133,7 +133,7 @@ var chat = {
SCROLL: "scroll", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
HEADER: "header", FOOTER: "footer",
SSO: "sso", CMD_MARGIN: 53,
SSO: "sso",
libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"],
panel_list: [
@ -175,6 +175,9 @@ var svg = {
var html = {
FIELDSET: "fieldset", LEGEND: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
FORM_OPTION: "form.option", DIV_ACTION: "div.action", DIV_OUTPUT: "div.output", DIV_STATUS: "div.status",
FIELDSET_PANEL: "fieldset.panel", FIELDSET_PLUGIN: "fieldset.plugin", FIELDSET_STORY: "fieldset.story",
OPTION_ARGS: "select.args,input.args,textarea.args",
INPUT_ARGS: "input.args,textarea.args",
UPLOAD: "upload", USERNAME: "username", PASSWORD: "password",
INPUT: "input", INPUT_ARGS: ".args", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button",
@ -186,8 +189,10 @@ var html = {
CLASS: "class", BLOCK: "block", NONE: "none", FLOAT: "float", CLEAR: "clear",
STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace",
SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width",
MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MARGIN_X: "margin-x", MARGIN_Y: "margin-y",
PLUGIN_MARGIN: 10, ACTION_HEIGHT: 26, ACTION_MARGIN: 200,
HIDDEN: "hidden", SELECT: "select",
FIXED: "fixed",
WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome",
LIST: "list", ITEM: "item", MENU: "menu", NODE: "node",
@ -267,20 +272,27 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args:
}); return msg
},
setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu)
var msg = can.request({}, {trans: can.onaction._trans})
return can._menu = can.search(msg._event, ["Header.onimport.menu", can._name].concat(list), cb)
},
set: function(name, key, value) { var msg = can.request({}); msg.Option(key, value)
return can.search(msg._event, [can.core.Keys(name, "onimport", key)])
},
get: function(name, key, cb) {
if (can.user.mod.isCmd && name == "Action" && key == "size") {
var msg = can.request({}, {left: 0, top: 0, width: window.innerWidth, height: window.innerHeight})
return can.core.CallFunc(cb, {msg: msg})
}
return can.search({}, [can.core.Keys(name, "onexport", key)], cb)
},
getActionSize: function(cb) { can.get("Action", "size", cb) },
getHeader: function(key, cb) { return can.get("Header", key, cb) },
getAction: function(key, cb) { return can.get("Action", key, cb) },
getActionSize: function(cb) { return can.get("Action", "size", cb) },
search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) },
Conf: function(key, value) { return can.core.Value(can._conf, key, value) }, _conf: {},
Conf: function(key, value) { var res = can._conf
for (var i = 0; i < arguments.length; i += 2) {
res = can.core.Value(can._conf, arguments[i], arguments[i+1])
}
return res
}, _conf: {},
}
if (navigator.userAgent.indexOf("MSIE") > -1) {

View File

@ -84,7 +84,7 @@ setTimeout(function() { Volcanos({Option: function() { return [] },
can.request(event, {zone: location.host, id: msg.Option(mdb.ID)})
can.run(event, [chat.FIELD, mdb.MODIFY, chat.TOP, sub._target.offsetTop])
can.run(event, [chat.FIELD, mdb.MODIFY, chat.LEFT, sub._target.offsetLeft])
can.run(event, [chat.FIELD, mdb.MODIFY, "args", JSON.stringify(sub.Input([], true))])
can.run(event, [chat.FIELD, mdb.MODIFY, ctx.ARGS, JSON.stringify(sub.Input([], true))])
can.user.toastSuccess(can)
}
}, document.body)