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

opt panel

This commit is contained in:
shaoying 2021-05-23 21:48:47 +08:00
parent 654153ebd6
commit 680189e78d
13 changed files with 318 additions and 398 deletions

131
frame.js
View File

@ -1,5 +1,9 @@
var _can_name = "/frame.js"
Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, list, cb, target) {
can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds || []
return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb)
}
can.core.Next(list, function(item, next) { item.type = "panel"
can.onappend._init(can, item, item.list, function(panel) {
panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds || []
@ -41,6 +45,10 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta,
return can.base.isFunc(cb) && cb(msg)
}
can.search(can.request({}, {
time: can.base.Time(null, "%H:%M:%S"), follow: panel._follow, msg: msg, commands: cmds,
})._event, ["Footer.onimport.ncmd"])
can.misc.Run(event, can, {names: (can.Conf("iceberg")||"/chat/")+panel._name, daemon: can.ondaemon._list[0]+"."+msg._daemon}, cmds, function(msg) {
Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast)
can.base.isFunc(cb) && cb(msg)
@ -148,36 +156,24 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"")
sub.page.ClassList.add(sub, field, meta.index? meta.index.split(".").pop(): meta.name)
can.base.isFunc(cb) && cb(sub)
meta.option = can.base.Obj(meta.option||"{}", {})
meta.inputs && sub.onappend._option(sub, meta, sub._option)
sub.page.Modify(sub, sub._legend, {
onmouseenter: function(event) { sub.user.carte(event, sub, sub.onaction, sub.onaction.list) },
})
meta.inputs && sub.onappend._option(sub, meta, sub._option)
can.base.isFunc(cb) && cb(sub)
}); return sub
},
_option: function(can, meta, option) { var index = -1, args = can.base.Obj(meta.args||meta.arg, [])
function add(item, next) { item._input != "button" && item.type != "button" && index++
Volcanos(item.name, {_follow: can._follow+"."+item.name,
Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name), _target: can.onappend.input(can, item, args[index], option),
_option: can._option, _action: can._action, _output: can._output, _status: can._status,
// _target: can.onappend.input(can, item, args[index]||meta.option[item.name], option),
_target: can.onappend.input(can, item, args[index], option),
Option: can.Option, Action: can.Action, Status: can.Status,
CloneInput: function() { add(item)._target.focus() },
CloneField: function() { can.Clone() },
CloneInput: function() { add(item)._target.focus() }, CloneField: function() { can.Clone() },
}, [item.display||"/plugin/input.js"].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(input) {
input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) {
var msg = can.request(event)
var sub = can.core.Value(can, "_outputs.-1")
if (msg.Option("_handle") != "true" && sub && cmds && cmds[0] == "action" && sub.onaction && sub.onaction[cmds[1]]) {
msg.Option("_handle", "true")
return sub.onaction[cmds[1]](event, sub)
}
input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) { var msg = can.request(event)
if (msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && input.onaction[cmds[1]]) {
msg.Option("_handle", "true")
return input.onaction[cmds[1]](event, input)
return msg.Option("_handle", "true"), can.core.CallFunc(input.onaction[cmds[1]], {event: event, can: input, msg: msg})
}
return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent)
@ -217,28 +213,18 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
return can.onaction[cmds[1]](event, can, cmds[1])
}
can._daemon == undefined && (can._daemon = can.ondaemon._list.push(can)-1)
msg._daemon = msg._daemon||can._daemon
var feature = can.Conf("feature")
var input = msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && feature && feature[cmds[1]]; if (input) {
can.user.input(event, can, input, function(ev, button, data, list) {
cmds = cmds.slice(0, 2), can.core.Item(data, function(key, value) {
key && value && cmds.push(key, value)
})
var msg = can.request(event, can.Option()); msg.Option("_handle", "true")
can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")
if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return }
if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return }
can.base.isFunc(cb) && cb(msg)
})
can.user.input(event, can, input, function(ev, button, data, list, args) {
var msg = can.request(event, {_handle: "true"}, can.Option())
can.onappend._output(can, meta, event, cmds.slice(0, 2).concat(args), cb, true)
})
return
}
return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")
can._msg = msg
can._daemon == undefined && (can._daemon = can.ondaemon._list.push(can)-1), msg._daemon = msg._daemon||can._daemon
return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg
if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return }
if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return }
if (can.base.isFunc(cb) && can.core.CallFunc(cb, {can: can, msg: msg})) { return }
@ -246,16 +232,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
var display = msg.Option("_display") || meta.display || meta.feature.display || "/plugin/table.js"
Volcanos(display, {_follow: can._follow+"."+display,
Volcanos(display, {_follow: can._follow+"."+display, _target: can._output, _fields: can._target,
_option: can._option, _action: can._action, _output: can._output, _status: can._status,
_target: can._output, _fields: can._target,
Option: can.Option, Action: can.Action, Status: can.Status,
}, [display].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(table) {
table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) {
var msg = can.request(event)
table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) { var msg = can.request(event)
if (msg.Option("_handle") != "true" && cmds && cmds[0] == "action" && table.onaction[cmds[1]]) {
msg.Option("_handle", "true")
return table.onaction[cmds[1]](event, table)
return msg.Option("_handle", "true"), can.core.CallFunc(table.onaction[cmds[1]], {event: event, can: table, msg: msg})
}
return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent)
@ -264,19 +247,11 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) {
can.page.Modify(can, can._action, ""), can.page.Modify(can, can._status, "")
table.onaction && table.onappend._action(table, can.base.Obj(msg.Option("_action"), meta._action||table.onaction.list))
table.ondetail && table.onappend._detail(table, can.base.Obj(msg.Option("_detail"), meta._detail||table.ondetail.list))
table.onexport && table.onappend._status(table, can.base.Obj(msg.Option("_status"), meta._export||table.onexport.list))
}, can._output)
})
})
},
_detail: function(can, list, target) { target = target || can._output
list.length > 0 && (target.oncontextmenu = function(event) {
can.user.carte(event, can, can.ondetail||can.onaction||{}, list, function(ev, item, meta) {
(can.ondetail[item]||can.onaction[item])(event, can, item)
})
})
},
_status: function(can, list, status) { status = status || can._status
can.core.List(list, function(item) { item = typeof item == "object"? item: {name: item}
can.page.Append(can, status, [{view: "item "+item.name, title: item.name, list: [
@ -419,18 +394,18 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
meta.name = meta.name||value.name||"story"
meta.help = meta.help||value.help||"story"
meta.width = meta.width||can.Conf("width")
meta.height = meta.height||can.Conf("height")
meta.type = meta.type||"story"
meta.width = meta.width||can.Conf("width")
meta.height = meta.height||can.Conf("height")
can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) {
meta.type == "story" && sub.page.Remove(sub, sub._legend)
sub.base.isFunc(cb) && cb(sub, meta)
}, target||can._output)
},
plugin: function(can, meta, cb, target) { meta = meta || {}
meta.inputs && meta.inputs.length > 0? can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cb, target):
can.run({}, ["action", "command", meta.index||meta.ctx+"."+meta.cmd], function(msg) { msg.Table(function(value) {
can.run({}, ["action", "command", meta.index||can.core.Keys(meta.ctx, meta.cmd)], function(msg) { msg.Table(function(value) {
can.onappend._plugin(can, value, meta, cb, target)
}) }, true)
},
@ -443,39 +418,60 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.base.isFunc(cb) && cb(sub)
}, target)
},
float: function(can, msg, cb) {
var ui = can.onappend.field(can, "story toast float", {}, document.body)
can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) {
can.page.Modify(can, ui.output, {style: {"max-width": width, "max-height": height-28}})
can.page.Modify(can, ui.first, {style: {top: top, left: left}})
})
can.onappend._action(can, ["关闭", "刷新"], ui.action, {
"关闭": function(event) { can.page.Remove(can, ui.first) },
"刷新": function(event) { can.page.Remove(can, ui.first), can.toast.click() },
})
can.onappend.table(can, msg, function(value, key, index, line, list) {
return {text: [value, "td"], onclick: function(event) {
can.base.isFunc(cb) && cb(value, key, index, line, list)
}}
}, ui.output)
return ui
},
}, [], function(can) {})
Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = document.body
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 width = window.innerWidth, height = window.innerHeight
can.user.isMobile && can.page.ClassList.add(can, target, "mobile")
can.user.isMobile && can.page.ClassList.set(can, target, "landscape", width > height)
document.body.onresize = function() { can.onlayout._init(can, target) }
can.page.Select(can, target, ["fieldset.head", "fieldset.foot"], function(field) {
height -= field.offsetHeight
})
can.page.Select(can, target, "fieldset.left", function(field, index) {
can.page.Modify(can, field, {style: {height: height}})
can.user.isMobile || (width -= field.offsetWidth)
})
can.page.Modify(can, field, {style: {height: height}})
can.page.Select(can, target, "fieldset.left>div.output", function(output) {
can.page.Modify(can, output, {style: {height: height-32}})
})
})
can.page.Select(can, target, "fieldset.main", function(field, index) {
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": ""}})
})
can.page.Modify(can, field, {style: {"padding-top": can.user.isLandscape? "0px": ""}})
} else {
can.page.Select(can, target, "fieldset.main", function(field, index) {
height -= can.page.Select(can, field, "div.action")[0].offsetHeight
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}))
})
can.onengine.signal(can, "onresize", can.request({}, {width: width, height: height}))
},
topic: function(can, topic) { topic && (can._topic = topic)
can.user.topic(can, can._topic || can.user.Search(can, "topic") || ((can.user.Search(can, "pod")||can.base.isNight())? "black": "white"))
@ -693,6 +689,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
layout.left = begin.left + event.x - begin.x
can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}})
}
event.stopPropagation(), event.preventDefault()
}
},
show: function(can, time, cb, target) { target = target || can._target

View File

@ -138,7 +138,13 @@ Volcanos("core", {help: "数据结构",
}, i, list): typeof cbs == "function" && cbs(list)
}
list = typeof list == "object"? list: [list]
switch (typeof list) {
case "undefined": list = []; break
case "object": break
default: list = [list]
}
list && list.length > 0 && typeof cb == "function"? next(0): typeof cbs == "function" && cbs(list)
}),
Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) {

View File

@ -100,9 +100,10 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg
try { xhr.send(data) } catch(e) { can.misc.Log(e) }
},
Run: function(event, can, dataset, cmds, cb) {
var skip = {_handle: true}
var msg = can.request(event||{})
var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) {
msg[item] && (form[item] = msg[item])
!skip[item] && msg[item] && (form[item] = msg[item])
})
can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(),

View File

@ -145,6 +145,7 @@ Volcanos("user", {help: "用户操作", agent: {
return typeof item == "string"? {view: "item", list: [{text: can.user.trans(can, item), click: function(event) {
can.user.isMobile && can.page.Remove(can, ui._target)
can.base.isFunc(cb) && cb(event, item, meta)
// can.onmotion.float.del(can, "carte")
}, onmouseenter: function(event) {
carte._float && can.page.Remove(can, carte._float._target)
} }] }: {view: "item", list: [{text: can.user.trans(can, item[0])}], onmouseenter: function(event) {
@ -162,7 +163,7 @@ Volcanos("user", {help: "用户操作", agent: {
var msg = can.request(event, can.Option())
var ui = can.page.Append(can, document.body, [{view: ["input"], style: {left: 0, top: 0}, list: [
{view: ["option", "table"], list: can.core.List(form, function(item) {
item._input == "select" && (item = {select: [[item.name].concat(item.values)], data: item, name: item.name})
(item._input == "select"||item.values) && (item = {select: [[item.name].concat(item.values)], data: item, name: item.name})
item = typeof item == "string"? {input: item, name: item}: item.length > 0? {select: [item], name: item[0]}: item
item.type = item.type||"input", item.type == "input" && (item.data=item.data||{}, item.data.type = item.data.type||"text")
@ -176,7 +177,7 @@ Volcanos("user", {help: "用户操作", agent: {
}
can.onappend.figure(can, item, item.value, function() {}, target)
target.value = target.value || msg.Option(item.name)
target.value = target.value || msg.Option(item.name) || item.value
}
return {type: "tr", list: [{type: "td", list: [{text: item.name||""}]}, {type: "td", list: [item]} ]}

View File

@ -285,6 +285,12 @@ div.input {
background-color:#0d4142a6;
z-index:50;
}
div.input textarea {
width:145px;
padding:4px;
margin:2px;
height:45px;
}
div.input div.item {
float:left;
}
@ -443,6 +449,9 @@ fieldset>div.output div.project div.list {
margin-left:10px;
}
body>fieldset.float table {
color:white;
}
body>fieldset.input table {
color:white;
}

View File

@ -2,7 +2,7 @@ Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js",
libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panels: [
{name: "Header", help: "标题栏", pos: "head", state: ["time", "username", "avatar"]},
{name: "Search", help: "搜索框", pos: "auto"},
{name: "River", help: "群聊组", pos: "left", action: ["创建", "刷新"]},
{name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]},
{name: "Action", help: "工作台", pos: "main"},
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
], main: {name: "Header", list: ["/publish/order.js"]}, plugin: [

View File

@ -1,70 +1,62 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) {
var river = can.Conf(can._RIVER), storm = can.Conf(can._STORM)
can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) {
item.width = parseInt(can.Conf(can._WIDTH)), item.height = parseInt(can.Conf(can._HEIGHT))
item.width = parseInt(can.Conf(can._WIDTH))-40, item.height = parseInt(can.Conf(can._HEIGHT))-40
item.feature = can.base.Obj(item.feature||item.meta)
item.inputs = can.base.Obj(item.inputs||item.list)
item.type = can._PLUGIN
can.onappend.plugin(can, item, function(sub, meta) {
can.onimport._plugin(can, river, storm, sub, meta), next()
sub._option.dataset = sub._option.dataset || {}
item.id && (sub._option.dataset.id = item.id)
sub._target.Meta = item
})
}, function() {
can.onaction._layout(can, can.Conf(can._LAYOUT)||can.user.Search(can, can._LAYOUT))
can.onaction.layout(can, can.user.Search(can, can._LAYOUT)||can.Conf(can._LAYOUT))
!can.user.isMobile && can.onimport._menu(can)
})
can.onmotion.float.auto(can, can._output, "carte")
},
_plugin: function(can, river, storm, sub, item) {
_plugin: function(can, river, storm, sub, meta) {
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
var toast = msg.Option("_toast") && can.user.toast(can, msg.Option("_toast"), "", 1000000)
return can.run(event, (can.onengine[cmds[0]]? []: [river, storm, item.id||item.index||item.key+"."+item.name]).concat(cmds), function(msg) {
var toast = msg.Option("_toast") && can.user.toast(can, msg.Option("_toast"), "", -1)
return can.run(event, (can.onengine[cmds[0]]? []: [river, storm, meta.id||meta.index||can.core.Keys(meta.key, meta.name)]).concat(cmds), function(msg) {
toast && toast.close(), can.base.isFunc(cb) && cb(msg)
})
}, can._plugins = (can._plugins||[]).concat([sub])
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-40}})
item.width = width
})
can.page.Append(can, can._action, [{view: ["item", "div", item.name], onclick: function(event) {
can.page.Append(can, can._action, [{view: ["item", "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)
}}])
},
_share: function(can, msg, share) {
can.Conf(can._WIDTH, window.innerWidth)
can.Conf(can._HEIGHT, window.innerHeight)
can.user.topic(can, can.user.Search(can, can._TOPIC)||msg.Option(can._TOPIC)||"white")
can.user.title(can.user.Search(can, can._TITLE)||msg.Option(can._TITLE))
can.Conf(can._RIVER, "_share"), can.Conf(can._STORM, share)
can.onimport._init(can, msg)
can.onaction._layout(can, "flow")
can.page.Modify(can, sub._output, {style: {"max-width": meta.width}})
can.onengine.listen(can, "onaction_resize", function(width, height) {
can.page.Modify(can, sub._output, {style: {"max-width": meta.width = width-40}})
})
sub._option.dataset = sub._option.dataset || {}
meta.id && (sub._option.dataset.id = meta.id)
sub._target.Meta = meta
},
_menu: function(can) {
if (can.user.isMobile) { return }
can._menu && can.page.Remove(can, can._menu)
can._menu = can.search({}, ["Header.onimport.menu", can._ACTION,
["布局", "默认布局", "流动布局", "网格布局", "标签布局", "自由布局"],
], function(event, key) { can.onaction._layout(can, key) })
], function(event, layout) { can.onaction.layout(can, layout) })
},
_share: function(can, share) {
share && can.run({}, ["_share", share], function(msg) {
can.user.topic(can, can.user.Search(can, can._TOPIC)||msg.Option(can._TOPIC)||"white")
can.user.title(can.user.Search(can, can._TITLE)||msg.Option(can._TITLE))
can.onaction.layout(can, "auto")
height: function(can, height) {
can.page.Modify(can, can._target, {style: {
height: can.Conf(can._HEIGHT, height),
}})
can.page.Modify(can, can._output, {style: {
height: can.Conf(can._HEIGHT, height-(can.Conf(can._LAYOUT)=="tabs"? 28: 10)),
}})
can.Conf({width: window.innerWidth, height: window.innerHeight})
can.Conf(can._RIVER, "_share"), can.Conf(can._STORM, share)
can.onimport._init(can, msg)
})
},
})
Volcanos("onengine", {help: "解析引擎", list: [],
_engine: function(event, page, msg, can, cmds, cb) {
Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, msg, can, cmds, cb) {
var river = can.onengine.river[cmds[0]]
var storm = river && river.storm[cmds[1]]
if (!storm || cmds.length != 2) { return false }
@ -85,27 +77,9 @@ Volcanos("onengine", {help: "解析引擎", list: [],
},
})
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
var share = can.user.Search(can, can._SHARE); if (share) {
can.run({}, ["_share", share], function(msg) { msg.Length()>0? can.onimport._share(can, msg, share):
can.onengine._engine({}, can, msg, can, [msg.Option("sess.river"), msg.Option("sess.storm")], function(msg) {
can.onimport._share(can, msg, share)
})
})
}
var list = []; can.onengine.listen(can, "resize", function(width, height) {
can.Conf({width: width, height: height}), can.core.Delay(list, 1000, function() {
can.onengine.signal(can, "action.resize", can.request({}, {
width: can.Conf(can._WIDTH), height: can.Conf(can._HEIGHT),
}))
})
})
can._target.ontouchstart = function(event) {
can.onengine.signal(can, "onaction_touch", can.request(event))
can.onmotion.float.del(can, "carte")
}
can.base.isFunc(cb) && cb()
},
_const: [
@ -114,15 +88,35 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
"title", "topic", "layout", "width", "height", "top", "left", "scroll",
"plugin",
],
onmain: function(can, msg) {
can.onimport._share(can, can.user.Search(can, can._SHARE))
},
onresize: function(can, msg, width, height) { var args = {width: width, height: height}
can.Conf(args), can.onengine.signal(can, "onaction_resize", can.request({}, args))
},
onsearch: function(can, msg, word) {
if (word[0] == "*" || word[0] == can._PLUGIN) { can.onexport.plugin(can, msg, word) }
},
onstorm_select: function(can, msg, river, storm) {
can.onaction._select(can, msg, river, storm)
can.onimport._menu(can)
onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can)
function key(name) { return can.core.Keys(can.Conf(can._RIVER), can.Conf(can._STORM), name) }
can.page.Cache(key(can._ACTION), can._action, can._output.scrollTop+1)
can.page.Cache(key(can._OUTPUT), can._output, can._output.scrollTop+1)
can.Conf(can._RIVER, river), can.Conf(can._STORM, storm) // 转场
var position = can.page.Cache(key(can._ACTION), can._action)
var position = can.page.Cache(key(can._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_notool", can.request({}, {river: river, storm: storm}))
} else {
can.onimport._init(can, msg)
}
})
},
_layout: function(can, key) { if (!key) { return }
layout: function(can, layout) { if (!layout) { return }
var trans = {
"默认布局": "auto",
"流动布局": "flow",
@ -131,42 +125,23 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
"自由布局": "free",
}
key = trans[key]||key, can.Conf(can._LAYOUT, key)
can.page.Modify(can, can._action, {className: "action "+key})
can.page.Modify(can, can._output, {className: "output "+key})
layout = trans[layout]||layout, can.Conf(can._LAYOUT, layout)
can.page.Modify(can, can._action, {className: "action "+layout})
can.page.Modify(can, can._output, {className: "output "+layout})
if (key == "tabs") {
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 (key == "free") {
if (layout == "free" && !can.free) {
can.page.Select(can, can._target, "div.output>fieldset.plugin", function(item, index) {
can.onmotion.move(can, item, {left: 10*index, top: 10*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
}
var header = can.get("Header", "height")
var footer = can.get("Footer", "height")
can.set("Action", "height", window.innerHeight-header-footer)
},
_select: function(can, msg, river, storm) {
function key(name) { return can.Conf(can._RIVER)+"."+can.Conf(can._STORM)+"."+name}
can.page.Cache(key(can._ACTION), can._action, can._output.scrollTop+1)
can.page.Cache(key(can._OUTPUT), can._output, can._output.scrollTop+1)
can.Conf(can._RIVER, river), can.Conf(can._STORM, storm) // 转场
var position = can.page.Cache(key(can._OUTPUT), can._output)
var position = can.page.Cache(key(can._ACTION), can._action)
if (position) { can._output.scrollTo(0, position-1); return }
can.run({}, [river, storm], function(msg) {
if (msg.Length() > 0) {
can.onimport._init(can, msg)
} else {
var msg = can.request({}, {river: river, storm: storm})
can.search(msg._event, ["River.ondetail.添加工具"])
}
})
can.onlayout._init(can)
},
})
Volcanos("onexport", {help: "导出数据", list: [],
@ -190,30 +165,15 @@ Volcanos("onexport", {help: "导出数据", list: [],
if (item.innerHTML.indexOf(word[1]) == -1) { return }
var meta = item.parentNode.Meta
can.core.List(fields, function(key) {
switch (key) {
case "context":
msg.Push(key, meta.ctx||meta.key||"")
break
case "command":
msg.Push(key, meta.index||meta.cmd||meta.name)
break
case "argument":
var list = can.page.Select(can, item.nextSibling, '.args', function(item) { return item.value||"" })
msg.Push(key, JSON.stringify(list))
break
case "ctx": msg.Push(key, "web.chat"); break
case "cmd": msg.Push(key, can._ACTION); break
case "type": msg.Push(key, can._PLUGIN); break
case "name": msg.Push(key, item.innerHTML); break
case "text":
msg.Push(key, shy("跳转", function() {
var data = {ctx: "web.chat", cmd: can._ACTION,
type: can._PLUGIN, name: item.innerHTML, text: shy("跳转", function(event) {
var input = can.page.Select(can, item.parentNode, "input.args")[0]
input && input.focus()
})); break
default: msg.Push(key, "")
}
})
}),
context: meta.ctx||meta.key||"", command: meta.index||meta.cmd||meta.name, argument: JSON.stringify(list),
}; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") })
})
},
})

View File

@ -1,56 +1,66 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can)
can.onimport._title(can, msg, target)
can.onimport._toast(can, msg, target)
can.onimport._state(can, msg, target)
can.onimport._toast(can, msg, target)
can.onmotion.float.auto(can, can._output, "carte", "input")
can.base.isFunc(cb) && cb(msg)
},
_title: function(can, msg, target) {
can.user.isMobile || can.core.List(msg.result, function(title) {
can.page.Append(can, target, [{view: ["title", "div", title]}])
_title: function(can, msg, target) { const TITLE = "title"
!can.user.isMobile && can.core.List(msg.result, function(item) {
can.page.Append(can, target, [{view: [TITLE, "div", item], title: "联系站长"}])
})
},
_state: function(can, msg, target) { const STATE = "state"
can.core.List(can.base.Obj(msg.Option(STATE), can.Conf(STATE)||["ncmd"]), function(item) {
can.page.Append(can, target, [{view: [STATE+" "+item, "div", can.Conf(item)], list: [
{text: [item, "label"]}, {text: [": ", "label"]}, {text: [can.Conf(item)||"", "span", item]},
], onclick: function(event) {
can.show = can.show? (can.page.Remove(can, can.show), null): can.onimport._cmd(can)
}}])
})
},
_cmd: function(can) {
return can.onappend.float(can, can._cmds, function(value, key, index, line, list) {
var commands = can.base.Obj(line.commands)
commands.length > 2 && can.onappend.plugin(can, {index: commands[2]}, function(sub) {
sub.run = function(event, cmds, cb) {
can.run(event, ["action", "command", "run", commands[2]].concat(cmds), cb)
}
can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) {
can.page.Modify(can, sub._output, {style: {"max-width": width, "max-height": height-28}})
can.page.Modify(can, sub._target, {style: {top: top+100, left: left}})
can.page.Modify(can, sub._legend, {style: {display: "block"}})
can.page.ClassList.add(can, sub._target, "float")
})
}, document.body)
}).first
},
_toast: function(can, msg, target) {
can.toast = can.page.Append(can, target, [{view: "toast", onclick: function(event) {
var ui = can.onappend.field(can, "story toast float", {}, document.body)
can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) {
can.page.Modify(can, ui.output, {style: {"max-width": width, "max-height": height-28}})
can.page.Modify(can, ui.first, {style: {top: top, left: left}})
} )
can.onappend._action(can, ["关闭", "刷新"], ui.action, {
"关闭": function(event) { can.page.Remove(can, ui.first) },
"刷新": function(event) { can.page.Remove(can, ui.first), can.toast.click() },
})
can.onappend.table(can, can._toast, function(value) {
return {text: [value, "td"], onclick: function(event) {
}}
}, ui.output)
can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first
}}]).first
},
_state: function(can, msg, target) {
can.core.List(can.Conf("state")|["ncmd"], function(item) {
can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)], list: [
{text: [item, "label"]}, {text: [": ", "label"]}, {text: [can.Conf(item)||"", "span", item]},
]}])
})
},
toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast || can.request()
can.page.Modify(can, can.toast, [time.split(" ").pop(), title, content].join(" "))
can._toast.Push({time: time, fileline: fileline, title: title, content: content})
},
ncmd: function(can, target) {
can.page.Select(can, target, "span.ncmd", function(item) {
item.innerHTML = can.Conf("ncmd", parseInt(can.Conf("ncmd")||"0")+1+"")+""
ncmd: function(can, msg, time, follow, commands) { const NCMD = "ncmd"; can._cmds = can._cmds || can.request()
can._cmds.Push({time: time, follow: follow, commands: commands})
can.page.Select(can, can._output, can.core.Keys("span", NCMD), function(item) {
item.innerHTML = can.Conf(NCMD, parseInt(can.Conf(NCMD)||"0")+1+"")+""
})
},
})
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) {
can.base.isFunc(cb) && cb(msg)
},
onlogin: function(can, msg) {
onmain: function(can, msg) {
can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) })
},
})

View File

@ -27,18 +27,18 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}
can.user.isWeiXin && can.onimport._weixin(can)
},
_grant: function(can, msg, target) { const GRANT = "grant"
_grant: function(can, msg, target) { const GRANT = "grant", SPACE = "space"
if (can.user.Search(can, GRANT)) {
if (can.user.confirm(GRANT+" "+can.user.Search(can, GRANT))) {
can.run(event, [can._ACTION, GRANT, "space", can.user.Search(can, GRANT)])
can.run(event, [can._ACTION, GRANT, SPACE, can.user.Search(can, GRANT)])
}
can.user.Search(can, GRANT, "")
}
},
_title: function(can, msg, target) {
can.user.title(can.user.Search(can, can._TITLE)||can.user.Search(can, "pod"))
_title: function(can, msg, target) { const TITLE = "title"
can.user.title(can.user.Search(can, TITLE)||can.user.Search(can, "pod"))
!can.user.isMobile && can.core.List(msg.result||["github.com/shylinux/contexts"], function(item) {
can.page.Append(can, target, [{view: [can._TITLE, "div", item], title: "返回主页", onclick: function(event) {
can.page.Append(can, target, [{view: [TITLE, "div", item], title: "返回主页", onclick: function(event) {
can.onaction.title(event, can)
}}])
})
@ -200,19 +200,11 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, meta,
river: function(event, can) { can.onaction.River(can) },
black: function(event, can, button) {
can.onlayout.topic(can, button)
var header = can.get("Header", "height")
var footer = can.get("Footer", "height")
can.set("River", "height", window.innerHeight-header-footer)
can.set("Action", "height", window.innerHeight-header-footer)
can.onlayout._init(can)
},
white: function(event, can, button) {
can.onlayout.topic(can, button)
var header = can.get("Header", "height")
var footer = can.get("Footer", "height")
can.set("River", "height", window.innerHeight-header-footer)
can.set("Action", "height", window.innerHeight-header-footer)
can.onlayout._init(can)
},
print: function(event, can, button) {
can.onlayout.topic(can, "white print")

View File

@ -1,20 +1,15 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.base.isFunc(cb) && cb(msg)
can.onmotion.clear(can), can.sublist = {}
if (msg.Option("sess.river") == "_share") { return can.onmotion.hide(can) }
if (msg.Option("sess.river") == "_share") { return can.onmotion.hidden(can) }
can.onmotion.clear(can), can.river_list = {}, can.storm_list = {}
can.onimport._main(can, msg)
can.onimport._menu(can, msg)
var select; msg.Table(function(value, index, array) {
var item = can.onimport._river(can, value)
if (index == 0 || [value.hash, value.name].indexOf(can._main_river) > -1) { select = item }
can.onimport._main(can, msg), can.onimport._menu(can, msg)
var select; can.page.Append(can, can._output, msg.Table(function(item, index) {
return can.onimport._river(can, item, function(target) {
(index == 0 || item.hash == can._main_river) && (select = target)
})
})), select && select.click()
select && select.click()
can.onlayout._init(can)
can.onmotion.float.auto(can, can._output, "carte", "input")
can.onmotion.float.auto(can, target, "carte", "input")
},
_main: function(can, msg) {
can._main_river = "project", can._main_storm = "studio"
@ -34,76 +29,52 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
], function(event, item) {
can.core.CallFunc([can.ondetail, item], [event, can, item, can.Conf(can._RIVER), can.Conf(can._STORM)])
})
can.page.Modify(can, can._output, {onmouseover: function(event) {
can.menu && can.page.Remove(can, can.menu.first)
}})
},
_river: function(can, meta) {
var item = can.onappend.item(can, "item", meta, function(event) {
// 左键选中
_river: function(can, meta, cb) {
return {text: [meta.name, "div", "item"], onclick: function(event) {
can.onaction.storm(event, can, meta.hash)
}, function(event) {
// 右键菜单
}, onmouseenter: function(event) {
can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) {
module[button](event, can, button, meta.hash)
})
})
!can.user.isMobile && can.page.Modify(can, item, {onmouseenter: function(event) {
can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) {
module[button](event, can, item, meta.hash)
})
}})
return item
}, _init: function(target) { cb(target)
can.river_list[meta.hash] = target
}}
},
_storm: function(can, meta, river) {
return {text: [meta.name, "div", "item"], onclick: function(event) {
// 左键点击
can.onaction.action(event, can, river, meta.hash)
can.user.title(can._main_title || meta.name)
can.onmotion.select(can, event.target.parentNode, "div.item", event.target)
}, onmouseenter: function(event) {
can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) {
module[button](event, can, button, river, meta.hash)
})
}, oncontextmenu: function(event) {
can.onaction.action(event, can, river, meta.hash)
can.user.title(can._main_title || meta.name)
// 右键点击
can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) {
module[button](event, can, button, river, meta.hash)
})
}, _init: function(target) {
can.storm_list[can.core.Keys(river, meta.hash)] = target
}}
},
height: function(can, height) {
can.page.Modify(can, can._target, {style: {
height: can.Conf(can._HEIGHT, height),
}})
can.page.Modify(can, can._output, {style: {
height: can.Conf(can._HEIGHT, height-10),
}})
},
})
Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, can, msg, panel, cmds, cb) {
cmds.length == 0 && can.core.Item(can.onengine.river, function(key, value) {
msg.Push({hash: key, name: value.name})
msg.Push({hash: key, name: value.name}) // 群组列表
}); if (cmds.length != 1 && cmds[1] != "tool") { return false }
var river = can.onengine.river[cmds[0]]; if (!river) { return false }
can.core.Item(river.storm, function(key, value) {
msg.Push({hash: key, name: value.name})
msg.Push({hash: key, name: value.name}) // 应用列表
}), can.base.isFunc(cb) && cb(msg); return true
},
})
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, list, cb, target) {
can.base.isFunc(cb) && cb()
},
_const: ["title", "river", "storm"],
_const: ["title", "river", "storm", "action"],
_trans: {
create: "创建", refresh: "刷新",
"public": "公开群", "protected": "内部群", "private": "私有群",
},
onlogin: function(can, msg) {
can.onappend._action(can, can.Conf("action")||can.onaction.list)
can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) })
@ -112,43 +83,13 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
if (word[0] == "*" || word[0] == can._STORM) { can.onexport.storm(can, msg, word) }
},
onaction_touch: function(can, msg) {
can.onmotion.float.del(can, "carte")
can.user.isMobile && can.onmotion.hidden(can)
},
storm: function(event, can, river) {
var list = can.sublist[river]; if (list) { return can.onmotion.Toggle(can, list) }
can.run({}, [river, "tool"], function(msg) {
var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(meta, index) {
river == can._main_river && meta.hash == can._main_storm && (select = index)
return can.onimport._storm(can, meta, river)
}) }]).first, list.children.length > 0 && list.children[select].click()
event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling)
can.sublist[river] = list
})
onaction_notool: function(can, msg, river, storm) {
can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm)
},
action: function(event, can, river, storm) {
// can.onlayout._init(can)
can.onengine.signal(can, "onstorm_select", can.request(event, {
river: can.Conf(can._RIVER, river), storm: can.Conf(can._STORM, storm),
}))
can.page.Select(can, can._output, "div.item.select", function(item) {
can.page.ClassList.del(can, item, "select")
}), can.page.ClassList.add(can, event.target, "select")
},
create: function(event, can) {
can.user.input(event, can, [
["类型", "public", "protected", "private"],
{name: "群名", value: "hi"},
{name: "简介", value: "hello"},
], function(event, button, meta, list) {
can.run(event, ["action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) {
can.user.Search(can, {river: msg.Result()})
})
})
},
carte: function(event, can, list, cb) {
var carte = can.user.carte(event, can, can.ondetail, list, cb)
can.page.Modify(can, carte._target, {style: {
@ -156,9 +97,41 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
top: carte._target.offsetTop-event.target.offsetHeight,
}})
},
storm: function(event, can, river) { can.sublist = can.sublist||{}
can.onmotion.select(can, can._output, "div.item", can.river_list[river])
var list = can.sublist[river]; if (list) { return can.onmotion.Toggle(can, list) }
"创建": function(event, can) { can.onaction.create(event, can) },
"刷新": function(event, can) {
can.run({}, [river, "tool"], function(msg) {
var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(item, index) {
river == can._main_river && item.hash == can._main_storm && (select = index)
return can.onimport._storm(can, item, river)
}) }]).first, list.children.length > 0 && list.children[select].click()
event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling)
can.sublist[river] = list
})
},
action: function(event, can, river, storm) {
can.page.Modify(can, can.sublist[river], {style: {display: "block"}})
can.onmotion.select(can, can._output, "div.item", can.river_list[river])
can.onmotion.select(can, can._output, "div.list div.item", can.storm_list[can.core.Keys(river, storm)])
can.onengine.signal(can, "onstorm_select", can.request(event, {
river: can.Conf(can._RIVER, river), storm: can.Conf(can._STORM, storm),
}))
},
create: function(event, can) {
can.user.input(event, can, [
{name: "type", values: ["public", "protected", "private"]},
{name: "name", value: "hi"}, {type: "textarea", name: "text", value: "hello"},
], function(event, button, meta, list, args) {
can.run(event, [can._ACTION, "create"].concat(args), function(msg) {
can.user.Search(can, {river: msg.Result()})
})
})
},
refresh: function(event, can) {
can.user.Search(can, {
river: can.Conf(can._RIVER), storm: can.Conf(can._STORM),
topic: can.search(event, ["Header.onexport.topic"]),
@ -173,19 +146,19 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
can.user.input(event, can, [
{name: "name", value: river},
], function(event, button, meta, list) {
can.user.share(can, can.request(event), [river, "action", "share", "type", can._RIVER, "name", meta.name])
can.user.share(can, can.request(event), [river, can._ACTION, "share", "type", can._RIVER, "name", meta.name])
})
},
"添加用户": function(event, can, button, river) {
can.user.select(event, can, "user", "usernick,username", function(item, next) {
can.run({}, [river, "user", "action", "insert", "username", item[0]], function(msg) {
can.run({}, [river, "user", can._ACTION, "insert", "username", item[0]], function(msg) {
next()
})
})
},
"添加设备": function(event, can, button, river) {
can.user.select(event, can, "space", "type,name,text", function(item, next) {
can.run({}, [river, "node", "action", "insert", "type", item[0], "name", item[1]], function(msg) {
can.run({}, [river, "node", can._ACTION, "insert", "type", item[0], "name", item[1]], function(msg) {
next()
})
})
@ -196,7 +169,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
{name: "名称", value: "hi"},
{name: "简介", value: "hello"},
], function(event, button, meta, list) {
can.run({}, [river, "tool", "action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) {
can.run({}, [river, "tool", can._ACTION, "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) {
can.user.Search(can, {river: river, storm: msg.Result()})
})
})
@ -204,7 +177,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
"重命名群组": function(event, can, button, river) {
can.user.input(event, can, ["name"], function(event, button, meta, list) {
var msg = can.request(event, {hash: river})
can.run(event, ["action", "modify", "name", meta.name], function(msg) {
can.run(event, [can._ACTION, "modify", "name", meta.name], function(msg) {
can.user.Search(can, {river: river})
})
})
@ -220,14 +193,14 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
{name: "name", value: storm},
], function(event, button, meta, list) {
var msg = can.request(event)
can.user.share(can, msg, [river, "action", "share", "type", can._STORM, "name", meta.name,
can.user.share(can, msg, [river, can._ACTION, "share", "type", can._STORM, "name", meta.name,
can._STORM, storm, can._RIVER, river,
])
})
},
"添加工具": function(event, can, button, river, storm) {
can.user.select(event, can, "command", "context,command", function(item, next) {
can.run({}, [river, "tool", "action", "insert", "hash", storm].concat(["pod", "", "ctx", item[0], "cmd", item[1]]), function(msg) {
can.run({}, [river, "tool", can._ACTION, "insert", "hash", storm].concat(["pod", "", "ctx", item[0], "cmd", item[1]]), function(msg) {
next()
})
}, function() {
@ -237,7 +210,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
"保存参数": 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})
can.run(msg._event, [river, "tool", "action", "modify", "arg", item.dataset.args], function(msg) {
can.run(msg._event, [river, "tool", can._ACTION, "modify", "arg", item.dataset.args], function(msg) {
can.user.toast(can, (index+1)+"/"+array.length, "保存参数", 10000, (index+1)/array.length)
next()
})
@ -246,14 +219,14 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
"重命名应用": function(event, can, button, river, storm) {
var msg = can.request(event, {hash: storm})
can.user.input(event, can, ["name"], function(ev, button, meta, list, args) {
can.run(event, [river, "tool", "action", "modify"].concat(args), function(msg) {
can.run(event, [river, "tool", can._ACTION, "modify"].concat(args), function(msg) {
can.user.Search(can, {river: river, storm: storm})
})
})
},
"删除应用": function(event, can, button, river, storm) {
var msg = can.request(event, {hash: storm})
can.run(event, [river, "tool", "action", "remove"], function(msg) {
can.run(event, [river, "tool", can._ACTION, "remove"], function(msg) {
can.user.Search(can, {river: river})
})
},
@ -281,7 +254,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
},
"共享主机": function(event, can, button, river, storm) {
can.run(event, ["action", "invite"], function(msg) {
can.run(event, [can._ACTION, "invite"], function(msg) {
can.user.toast(can, {
title: "共享主机", duration: -1, width: -100,
content: msg.Result(), action: ["close"],
@ -290,7 +263,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
},
"共享工具": function(event, can, button, river, storm) {
can.user.select(event, can, "plugin", "name,context,command,argument", function(item, next) {
can.user.share(can, can.request(event), [river, "action", "share", "type", "field",
can.user.share(can, can.request(event), [river, can._ACTION, "share", "type", "field",
can._RIVER, item[1], can._STORM, item[2],
"name", item[0], "text", item[3],
])
@ -306,7 +279,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
{name: "repos", value: "@key"},
{name: "template", value: "@key"},
], function(event, button, data, list, args) {
can.run(event, ["action", "start"].concat(args), function(msg) {
can.run(event, [can._ACTION, "start"].concat(args), function(msg) {
can.user.open(can.user.MergeURL(can, {pod: can.core.Keys(can.user.Search(can, "pod"), msg.Option("name"))}))
can.user.toast(can, can.user.MergeURL(can, {pod: msg.Option("name")}))
})
@ -315,28 +288,17 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
})
Volcanos("onexport", {help: "导出数据", list: [],
width: function(can) { return can._target.offsetWidth },
height: function(can) { return can._target.offsetHeight },
storm: function(can, msg, word) {
var fields = (msg.Option("fields")||"ctx,cmd,type,name,text").split(",")
can.core.Item(can.onengine.river, function(river, value) {
can.core.Item(value.storm, function(storm, item) {
if (word[1] != "" && word[1] != storm && word[1] != item.name) { return }
can.core.List(fields, function(key) {
switch (key) {
case "ctx": msg.Push(key, "web.chat"); break
case "cmd": msg.Push(key, can._STORM); break
case "type": msg.Push(key, river); break
case "name": msg.Push(key, storm); break
case "text":
// msg.Push(key, can.user.MergeURL(can, {river: river, storm: storm}))
// break
msg.Push(key, shy("跳转", function(event) {
var data = {ctx: "web.chat", cmd: can._STORM,
type: river, name: storm, text: shy("跳转", function(event) {
can.onaction.action(event, can, river, storm)
})); break
default: msg.Push(key, "")
}
})
}),
}; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") })
})
})
},

View File

@ -9,11 +9,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})); table && can.page.Modify(can, can.ui.display, {style: {width: table.offsetWidth}})
},
_word: function(can, msg, cmds, fields) { can.type = cmds[0]
var sub = can.request({}, {word: cmds, fields: fields.join(","), sort: msg.Option("sort"), index: msg.Option("index")})
can.onengine.signal(can, "onsearch", sub)
var res = can.request({}, {word: cmds, fields: fields.join(","), sort: msg.Option("sort"), index: msg.Option("index")})
can.onengine.signal(can, "onsearch", res)
can.run(sub._event, cmds, function(sub) { can.list = sub.Table()
can.onimport._init(can, sub, fields)
can.run(res._event, cmds, function(res) { can.list = res.Table()
can.onimport._init(can, res, fields)
}), can.ui.word.setSelectionRange(0, -1)
can.onmotion.show(can), can.ui.input.focus()
@ -60,50 +60,32 @@ Volcanos("onaction", {help: "交互操作", list: ["关闭", "清空", "完成"]
"清空": function(event, can) { can.onmotion.clear(can, can.ui.preview) },
"完成": function(event, can) { can.base.isFunc(can.cb) && can.cb() },
select: function(event, can, index) {
select: function(event, can, index) { var line = can.list[index]
if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) }
// if (line.ctx == "web.chat" && line.cmd == "/search") {
// return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb)
// }
if (line.ctx == "web.chat" && line.cmd == "/search") {
return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb)
}
if (can.list && can.list[index]) {
var text = can.list[index].text || ""
if (can.base.isFunc(text)) {
can.list[index].text(event)
} else { var line = can.list[index]
var fields = can.page.Select(can, can.ui.display, "th", function(item) { return item.innerText })
can.page.Append(can, can.ui.display, [{td: can.core.List(fields, function(item) {
return line[item]
}), data: {index: index}, onclick: function(event) {
can.page.Remove(can, event.target.parentNode)
}), data: {index: index}, onclick: function(event) { can.page.Remove(can, event.target.parentNode)
can.Status("selected", can.page.Select(can, can.ui.display, "tr").length-1)
}}]), can.Status("selected", can.page.Select(can, can.ui.display, "tr").length-1)
return false
}
can.onmotion.hide(can)
return true
}
return false
},
plugin: function(event, can, index) { var line = can.list[index]
var cmd = line.cmd == "command"? can.core.Keys(line.text, line.name): can.core.Keys(line.ctx, line.cmd)
if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) }
can.onappend.plugin(can, {type: "plugin", index: cmd||msg.Option("index"), option: line}, function(sub, meta) {
var cmd = line.cmd == "command"? can.core.Keys(line.text, line.name): can.core.Keys(line.ctx, line.cmd)
can.onappend.plugin(can, {type: "plugin", index: cmd||msg.Option("index")}, function(sub, meta) {
sub.run = function(event, cmds, cb) { var msg = can.request(event, line)
can.run(event, ["action", "command", "run", meta.index].concat(cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
})
can.run(event, ["action", "command", "run", meta.index].concat(cmds), cb)
}
}, can.ui.preview)
},
})
Volcanos("ondetail", {help: "交互操作", list: ["删除"], _init: function(can, msg, list, cb, target) {
},
"删除": function(event, sub) {
sub.page.Remove(sub, sub._target)
},
})
Volcanos("onexport", {help: "导出数据", list: ["selected", "count"],
select: function(can) {
return can.page.Select(can, can.ui.display, "tr", function(tr) {

View File

@ -6,6 +6,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.base.isFunc(cb) && cb(msg)
can.ui = can.onlayout.display(can, target)
can.onappend.table(can, can.path, null, can.ui.content)
can.dir_root = msg.Option("dir_root")
can.Action("height", msg.Option("height")||"100")
can.Action("limit", msg.Option("limit")||"6")
@ -16,7 +17,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onimport.page(can, can.list)
},
_file: function(can, path, index) { var p = location.href.indexOf("http") == 0? "": "http://localhost:9020"
return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can._msg.Option("dir_root")||"", path)
return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can.dir_root||"", path)
},
file: function(can, path, index) { path = can.onimport._file(can, path, index)
var cb = can.onfigure[can.base.Ext(path)]; can.Status("file", path)

View File

@ -41,17 +41,16 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})
},
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.width = parseInt(can.Conf("width")), 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 && cmds[0] == "_search"? []: ["action", "story", data.type, data.name, data.text]).concat(cmds), cb, true)
can.run(event, (cmds && can.onengine[cmds[0]]? []: ["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.page.Modify(can, sub._output, {style: {"max-width": item.width}})
can.onengine.listen(can, "onaction_resize", function(width, height) {
can.page.Modify(can, sub._output, {style: {"max-width": sub.Conf("width", item.width=width-60)}})
})
}, can._output, target)
},