1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 08:48:06 +08:00
This commit is contained in:
harveyshao 2022-12-23 20:18:31 +08:00
parent 15b9683bb7
commit c3f5e3d659
15 changed files with 98 additions and 72 deletions

View File

@ -140,11 +140,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
sub._trans = can.base.Copy(sub._trans||{}, can.core.Value(sub, [chat.ONACTION, chat._TRANS]))
can.core.Item(meta.feature, function(key, cb) { cb.help && sub.user.trans(sub, kit.Dict(key, cb.help)) })
meta.inputs && sub.onappend._option(sub, meta, sub._option, meta.msg)
if (meta.msg) {
can.onmotion.delay(can, function() {
var msg = sub.request(); msg.Copy(can.base.Obj(meta.msg)), sub.onappend._output(sub, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display)
})
}
if (meta.msg) { can.onmotion.delay(can, function() { var msg = sub.request(); msg.Copy(can.base.Obj(meta.msg))
sub.onappend._output(sub, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display)
}) }
if (can._root && can._root.name == "popup") { can.onmotion.hidden(can, sub._action) }
can.core.Value(sub._legend, chat.ONMOUSEENTER, function(event) {
@ -175,7 +173,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
sub._target.value = value, can.onmotion.focus(can, sub._target), can.onmotion.delay(can, function() { can.Update() })
})
})
}; can.core.Next(([{type: html.BUTTON, name: cli.CLOSE}]).concat(can.base.getValid(can.core.Value(can, [chat.ONIMPORT, mdb.LIST]), can.base.Obj(meta.inputs, []))||[]), add)
}
can.core.Next(([{type: html.BUTTON, name: cli.CLOSE}]).concat(can.base.getValid(can.core.Value(can, [chat.ONIMPORT, mdb.LIST]), can.base.Obj(meta.inputs, []))||[]), add)
},
_action: function(can, list, action, meta) { meta = meta||can.onaction||{}, action = action||can._action, can.onmotion.clear(can, action)
return can.core.List(can.page.inputs(can, can.base.getValid(can.base.Obj(list), can.core.Value(can, [chat.ONACTION, mdb.LIST]), meta != can.onaction? can.core.Item(meta): [])||[]), function(item) {
@ -185,7 +184,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
}, onkeydown: function(event) { if (event.key == lang.ENTER) { target.click() }}}:
item.length > 0? /* 列表 */ {type: html.SELECT, name: item[0], values: item.slice(1), onchange: function(event) { var button = item[event.target.selectedIndex+1]
meta[item[0]]? can.core.CallFunc(meta[item[0]], [event, can, item[0], button]): meta[button] && can.core.CallFunc(meta[button], [event, can, button])
}}: /* 其它 */ item, "", action)
}}: /* 其它 */ (item.onclick = item.onclick||function(event) {
var cb = meta[item.name]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: item.name}): can.run(event, [ctx.ACTION, item.name].concat(can.sup.Input()))
}, (item.type == html.BUTTON && (item.value = item.value||can.user.trans(can, item.name, meta._trans))), item), "", action)
}), meta
},
_output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); if (msg.RunAction(event, can, cmds)) { return }
@ -211,7 +212,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
sub._index = can._index, sub._msg = msg, sub.Conf(sub._args = can.base.ParseURL(display))
sub._trans = can.base.Copy(can.base.Copy(sub._trans||{}, can._trans), can.core.Value(sub, [chat.ONACTION, chat._TRANS]))
if (sub.onimport && can.base.isArray(sub.onimport.list) && sub.onimport.list.length > 0) {
can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list) })
can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) })
}
can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) {
can.onmotion.clear(can, can._action), can.user.isMobile && can.ConfHeight() > can.ConfWidth() && can.onmotion.hidden(can, can._action)
@ -319,7 +320,6 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
can.core.CallFunc(on, {event: event, can: can, meta: meta, cb: _cb, target: target, sub: target._can, last: last, cbs: function(cb) {
function show() { var sub = target._can
can.base.isFunc(cb) && cb(target._can, _cb), can.onlayout.figure(event, can, target._can._target), can.onmotion.toggle(can, target._can._target, true)
can.page.style(can, sub._output, html.MAX_HEIGHT, can.base.Max(can.page.height()-sub._target.offsetTop-2*html.ACTION_HEIGHT, can.page.height()/2))
} if (target._can) { return show() }
can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT, mode: meta.mode}, [path], function(sub) { sub.Conf(meta)
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
@ -439,7 +439,9 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro
var rect = event.target == document.body? {left: can.page.width()/2, top: can.page.height()/2, right: can.page.width()/2, bottom: can.page.height()/2}: event.target.getBoundingClientRect()
var layout = right? {left: rect.right, top: rect.top}: {left: rect.left, top: rect.bottom}
can.getActionSize(function(left, top, width, height) { left = left||0, top = top||0, height = can.base.Max(height, can.page.height()-top)
if (target.offsetHeight > height) {
if (top+height-layout.top > 200) {
layout[html.MAX_HEIGHT] = can.base.Max(top+height-layout.top, can.page.height()/2), layout[html.OVERFLOW] = ice.AUTO
} else if (target.offsetHeight > height) {
layout.top = top, layout[html.MAX_HEIGHT] = height, layout[html.OVERFLOW] = ice.AUTO
} else if (layout.top+target.offsetHeight > top+height) {
layout.top = top+height-target.offsetHeight
@ -554,6 +556,18 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
tableFilter: function(can, target, value) { can.page.Select(can, target, html.TR, function(tr, index) {
index > 0 && can.page.ClassList.set(can, tr, html.HIDDEN, can.page.Select(can, tr, html.TD, function(td) { if (td.innerText.indexOf(value) > -1) { return td } }) == 0)
}) },
highlight: function(can, value, target) {
can.page.Select(can, target||can._output, [html.TBODY, html.TR], function(tr) {
can.page.ClassList.set(can, tr, html.HIDDEN, can.page.Select(can, tr, html.TD, function(td) { td._text = td._text||td.innerText
if (td.innerText.indexOf(value) > -1) {
td.innerHTML = td._text.replaceAll(value, "<span style='background-color:yellow;color:red;'>"+value+"</span>")
return td
} else {
td.innerText = td._text
}
}).length == 0)
})
},
delayResize: function(can, target, key) {
can.onmotion.delay(can, function() { can.page.Select(can, target, key, function(_target) {

View File

@ -23,6 +23,13 @@ Volcanos("base", {
return true
} return to === from
},
Dir: function(path) {
if (path.endsWith(ice.PS)) {
return path
} else {
return path.slice(0, path.lastIndexOf(ice.PS)+1)
}
},
Ext: function(path) { return path.split(ice.PS).pop().split(ice.PT).pop().toLowerCase() },
Path: function(path) { var res = ""
for (var i = 0; i < arguments.length; i++) { if (!arguments[i]) { continue }

View File

@ -197,9 +197,9 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
if (value != undefined) { localStorage.setItem(key, value) }
return localStorage.getItem(key)
},
_signal: function(can, args) {
_signal: function(can, args) { this._list.push(args)
if (can && can.onengine) { can.onengine.signal(can, chat.ONDEBUG, can.request({}, {time: this._time(), fileline: this.FileLine(-4), _args: args})) }
},
}, _list: [],
Log: function() { var args = [this._time(), this.FileLine(2, 3), ""]
for (var i in arguments) { arguments[i] != undefined && args.push(arguments[i]) }
console.log.apply(console, args), this._signal(arguments[0], args)

View File

@ -125,7 +125,7 @@ Volcanos("page", {ClassList: {
var tbody = list[i].parentElement; list[i].parentElement && tbody.removeChild(list[i]), tbody.appendChild(list[i])
}
},
inputs: function(can, list) {
inputs: function(can, list, type) {
var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) {
case "": _list.push(""); break
case ice.AUTO:
@ -138,10 +138,12 @@ Volcanos("page", {ClassList: {
_list.push(mdb.NEXT, mdb.PREV)
break
default:
(function() { var item = can.core.SplitInput(list[i], html.BUTTON)
(function() { var item = can.core.SplitInput(list[i], type||html.BUTTON)
if (item.type == html.SELECT) { item._init = function(target) { target.value = item.value||item.values[0], target.onchange = function(event) { can.run(event) } } }
item.action && (function() { item._init = function(target) { can.onappend.figure(can, item, target) } })()
item.type == html.BUTTON? _list.push(list[i]): _list.push(item)
// item.type == html.BUTTON? _list.push(item.name): _list.push(item)
_list.push(item)
type = item.type
})()
} } return _list
},

View File

@ -71,8 +71,8 @@ Volcanos("user", {info: {}, agent: {
{text: [meta.title||"", html.DIV, html.TITLE], title: "点击复制", onclick: function(event) { can.user.copy(event, can, meta.title) }},
{view: "duration", title: "点击关闭", onclick: function() { action.close() }},
can.base.isObject(meta.content)? meta.content: {text: [meta.content||"", html.DIV, nfs.CONTENT]},
html.ACTION, !can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width}, list: [
{view: "current", style: {width: (meta.progress||0)*width/100}},
html.ACTION, !can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width-10}, list: [
{view: "current", style: {width: (meta.progress||0)*(width-14)/100}},
]},
] }]); can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content, fileline: can.misc.FileLine(-3)}))
var action = can.onappend._action(can, meta.action && meta.action.list? meta.action.list: meta.action||[""], ui.action, {

View File

@ -102,7 +102,7 @@ body>div.toast div.title { color:yellow; float:left; }
body>div.toast div.duration { color:gray; float:right; }
body>div.toast div.content { text-align:center; color:yellow; }
body>div.toast div.progress { border:solid 2px green; margin-left:-2px; height:10px; clear:both; }
body>div.toast div.progress div.current { background-color:red; height:10px; }
body>div.toast div.progress div.current { background-color:red; height:6px; }
body>div.toast div.action { display:block; }
body>div.toast div.action>div.item.space { height:unset; }
body>div.carte { padding:0; }

View File

@ -219,6 +219,7 @@ Volcanos(chat.ONENGINE, {_engine: function(event, sup, msg, can, cmds, cb) {
}), can.base.isFunc(cb) && cb(msg) } return true
}})
Volcanos(chat.ONPLUGIN, {
_plugin: shy("默认插件", [mdb.NAME, ice.LIST, ice.BACK]),
plugin: shy("默认插件", [mdb.NAME, ice.LIST, ice.BACK]),
layout: shy("界面布局", {
_init: function(can) {

View File

@ -1,5 +1,5 @@
Volcanos(chat.ONACTION, {
_init: function(can, meta, target) { meta.type == html.BUTTON && meta.action == ice.AUTO && !can.sup._delay_init && target.click() },
_init: function(can, meta, target) { meta.type == html.BUTTON && meta.action == ice.AUTO && can.sup._delay_init == undefined && target.click() },
run: function(event, can) { can.run(event) },
list: function(event, can) { can.sup.isSimpleMode() || can.run(event) },
back: function(event, can) { can.sup.onimport._back(can.sup) },

View File

@ -19,7 +19,7 @@ fieldset.inner>div.output div.content td.text span.function { color:lightgreen;
fieldset.inner>div.output div.content td.text span.constant { color:magenta; }
fieldset.inner>div.output div.content td.text span.string { color:magenta; }
fieldset.inner>div.output div.content td.text span.object { color:cyan; }
fieldset.inner>div.output div.find.float { position:absolute; }
fieldset.inner>div.output div.find.float { position:absolute; z-index:10; }
fieldset.inner.cmd>div.output>div.layout.flow>div.tabs { background-color:#70809096; height:28px; overflow:auto; display:block; }
fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div { background-color:teal; font-family:monospace; padding:5px 15px; float:left; }
fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div:hover { background-color:#1d3349; }

View File

@ -154,15 +154,15 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
return can.onmotion.toggle(can, target, false), can.onimport.layout(can), can.user.toastFailure(can, "nothing to display")
} return can.onmotion.toggle(can, target, true), can.onimport.layout(can), can.user.toastSuccess(can)
},
toolkit: function(can, meta, cb) { meta._delay_init = true
can.onimport.plug(can, meta, function(sub) {
toolkit: function(can, meta, cb) {
can.onimport.plug(can, meta, function(sub) { sub._delay_init = true
can._status.appendChild(sub._legend), sub._legend.onclick = function(event) {
if (can.page.SelectOne(can, can._status, ice.PT+html.SELECT) == event.target) {
can.page.ClassList.del(can, event.target, html.SELECT), can.onmotion.hidden(can, sub._target)
} else {
can.page.SelectChild(can, can._output, can.core.Keys(html.FIELDSET, chat.PLUG), function(target) { can.onmotion.toggle(can, target, target == sub._target) })
can.onmotion.select(can, can._status, html.LEGEND, event.target), can.onmotion.select(can, can._output, can.core.Keys(html.FIELDSET, chat.PLUG), sub._target)
if (meta._delay_init == true) { meta._delay_init = false, sub.Update() }
if (sub._delay_init == true) { sub._delay_init = false, can.onmotion.delay(can, function() { sub._output.innerHTML == "" && sub.Update() }) }
}
}, sub._legend.onmouseenter = null
sub.onexport.record = function(sub, line) { if (!line.file && !line.line) { return }
@ -183,9 +183,18 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
var sub = can.ui.content._plugin; sub && sub.onimport.size(sub, can.ui.content.offsetHeight-2*html.ACTION_HEIGHT, can.ui.content.offsetWidth, true)
},
exts: function(can, url, cb) {
can.require([url], function() {}, function(can, name, sub) { sub._init(can, sub, function(sub) {
can.onimport.toolkit(can, {index: "can._plugin", display: (url[0] == ice.PS || url.indexOf(ice.HTTP) == 0? "": can.base.Dir(can._path))+url}, function(sub) {
sub.run = function(event, cmds, cb) {
if (cmds.length > 0 && cmds[0] == ctx.ACTION) {
can.run(can.request(event, can.Option()), cmds, cb||function(msg) {
can.onappend._output(sub, msg, sub.Conf("display"))
}, true)
} else {
can.onappend._output(sub, can.request(event), sub.Conf("display"))
}
}
can.db.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb)? cb(sub): sub.select()
}) })
})
},
}, [""])
Volcanos(chat.ONFIGURE, {
@ -374,10 +383,11 @@ Volcanos(chat.ONACTION, {
}
var meta = can.onappend._action(can, [
{type: html.TEXT, name: nfs.FROM, style: {width: 200}, _init: function(target) { from = target, complete(target, nfs.FIND), can.onmotion.delay(can, function() { target.focus() }) }},
nfs.FIND, nfs.GREP, {type: html.TEXT, name: nfs.TO, _init: function(target) { to = target, complete(target, nfs.REPLACE) }}, nfs.REPLACE, cli.CLOSE,
{type: html.BUTTON, name: nfs.FIND}, {type: html.BUTTON, name: nfs.GREP}, {type: html.TEXT, name: nfs.TO, _init: function(target) { to = target, complete(target, nfs.REPLACE) }},
{type: html.BUTTON, name: nfs.REPLACE}, {type: html.BUTTON, name: cli.CLOSE},
], ui.action, {_trans: {find: "查找", grep: "搜索", replace: "替换"},
find: function() { find(last+1, from.value) },
grep: function() { can.onimport.exts(can, "inner/search.js", function(sub) { meta.close(), sub.runAction(event, nfs.GREP, [from.value]) }) },
grep: function() { can.onimport.exts(can, "inner/search.js", function(sub) { sub.select(), meta.close(), sub.runAction(event, nfs.GREP, [from.value, can.Option(nfs.PATH)]) }) },
replace: function() { var text = can.current.text(), line = can.onaction._getLineno(can, can.current.line)
can.db.undo.push(function() { can.onaction.selectLine(can, line), can.onaction.modifyLine(can, line, text) })
can.current.text(text.replace(from.value, to.value)), can.current.text().indexOf(from.value) == -1 && meta.find()

View File

@ -0,0 +1,13 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
can.core.List(can.misc._list, function(item) {
msg.Push(mdb.TIME, item[0])
msg.Push(nfs.FILE, item[1].split(ice.DF)[0])
msg.Push(nfs.LINE, item[1].split(ice.DF)[1])
msg.Push(mdb.TYPE, item[2])
msg.Push(mdb.NAME, item[3])
msg.Push(mdb.TEXT, item.slice(4).join(ice.SP)||"")
}), msg.StatusTimeCount(), can.onmotion.clear(can), can.onappend.table(can, msg)
can.page.Select(can, can._option, "input[name=name]", function(target) {
target.onkeyup = function(event) { can.onmotion.highlight(can, target.value) }
})
}})

View File

@ -1,36 +1,13 @@
Volcanos(chat.ONPLUGIN, {_init: function(can, _sub, cb) { const SEARCH = "can.code.inner.search"; var history = []
function highlight(value) { var sub = can.ui.search
can.page.Select(can, sub._output, html.TR, function(tr) {
can.page.ClassList.set(can, tr, html.HIDDEN, can.page.Select(can, tr, html.TD, function(td) { td._text = td._text||td.innerText
if (td.innerText.indexOf(value) > -1) {
td.innerHTML = td._text.replaceAll(value, "<span style='background-color:yellow;color:red;'>"+value+"</span>")
return td
} else {
td.innerText = td._text
}
}).length == 0)
Volcanos(chat.ONIMPORT, {list: ["main", "filter", "grep:button", "history", "last"], _init: function(can, msg) {
can.onmotion.clear(can), can.onappend.table(can, msg)
can.onmotion.delay(can, function() {
can.page.Select(can, can._option, "input[name=filter]", function(target) {
target.onkeyup = function(event) { can.onmotion.highlight(can, target.value) }
})
}
function show(msg, word) { if (!msg) { return } history.push(msg); var sub = can.ui.search; sub.Option("main", word)
sub.onimport.size(sub, can.ConfHeight()/4, can.ConfWidth()-can.ui.project.offsetWidth, true)
sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) {
return {text: ["", html.TD], list: [{text: [can.base.trimPrefix(value, nfs.PWD), html.DIV]}], onclick: function(event) { if (!line.line) { return }
can.onimport.tabview(can, line.path||can.Option(nfs.PATH), can.base.trimPrefix(line.file, nfs.PWD)||can.Option(nfs.FILE), parseInt(line.line)), can.current.scroll(can.current.scroll()-4)
}}
}, sub._output), sub.onappend.board(sub, msg.Result()), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS))
!sub.page.ClassList.has(sub, sub._legend, html.SELECT) && sub.select(), sub.Focus(), sub.Option("word", word||msg._word||"")
can.onmotion.delay(can, function() { word && highlight(word) })
}
can.onengine.plugin(can, SEARCH, shy("搜索", {}, [
"main", {name: "filter", _init: function(target) { target.onkeyup = function(event) { highlight(event.target.value) } }},
"grep:button", "history", "last",
], function(can, msg, cmds, cb) { can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.GREP, function(cmds) { can.runAction(msg, nfs.GREP, [cmds[0]], function(msg) { show(msg, cmds[0]) }) },
"history", function(cmds) { can.core.List(can.history, function(item) { msg.PushRecord(item) }), show(msg) },
"last", function(cmds) { history.pop(), show(history.pop()) },
)) }))
can.onimport.toolkit(can, {index: SEARCH}, function(sub) {
can.ui.search = sub, sub._show = show, can.base.isFunc(cb) && cb(sub)
can.page.style(can, sub._output, html.MIN_WIDTH, 600)
})
}})
Volcanos(chat.ONACTION, {
"grep": function(event, can, button) {
can.runAction(event, nfs.GREP, [can.Option("main")], function(msg) { can.onimport._init(can, msg) })
},
})

View File

@ -120,7 +120,9 @@ Volcanos(chat.ONACTION, {
},
compile: function(event, can, button) { var _toast = can.user.toastProcess(can, "编译中...")
can.runAction(can.request(event), button, [], function(msg) { _toast.close(), can.ui.search && can.onmotion.hidden(can, can.ui.search._target)
if (msg.Length() > 0 || msg.Result()) { return can.onimport.exts(can, "inner/search.js", function(sub) { sub._show(msg) }) }
if (msg.Length() > 0 || msg.Result()) { return can.onimport.exts(can, "inner/search.js", function(sub) {
can.onappend._output(sub, msg, sub.Conf("display")), sub.select()
}) }
var toast = can.user.toastProcess(can, "重启中..."); can.onmotion.delay(can, function() { toast.close(), can.user.toastSuccess(can) }, 3000)
})
},
@ -139,11 +141,11 @@ Volcanos(chat.ONACTION, {
"文档": function(event, can) { can.onaction._open(can, "https://developer.mozilla.org/") },
"百度": function(event, can) { can.onaction._open(can, "https://baidu.com") },
"命令": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0], ctx.INDEX) }) },
"插件": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { var sub = can.toolkit[list[0]]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, {index: list[0]}, function(sub) { can.toolkit[list[0]] = sub.select() })
"插件": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { var sub = can.db.toolkit[list[0]]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, {index: list[0]}, function(sub) { can.db.toolkit[list[0]] = sub.select() })
}) },
"扩展": function(event, can) { can.user.input(can.request(event, {action: "extension"}), can, ["url"], function(list) {
var sub = can.extentions[list[0]]; sub? sub.select(): can.onimport.exts(can, list[0])
var sub = can.db.extentions[list[0]]; sub? sub.select(): can.onimport.exts(can, list[0])
}) },
"录屏": function(event, can) { window.openapp("QuickTime Player") },
"日志": function(event, can) { window.opencmd("cd ~/contexts; tail -f var/log/bench.log") },

View File

@ -106,13 +106,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
if (zone._delay_show) { zone._delay_show(zone._target), delete(zone._delay_show) }
can.onmotion.toggle(can, zone._action), can.onmotion.toggle(can, zone._target)
}, onmouseenter: function(event) {
zone._menu? can.user.carteRight(event, can, zone._menu.meta, zone._menu.list||can.core.Item(zone._menu.meta), function(event, button, meta) {
zone._menu && can.user.carteRight(event, can, zone._menu.meta, zone._menu.list||can.core.Item(zone._menu.meta), function(event, button, meta) {
(meta[button]||can.onaction[button])(event, can, button)
}): can.user.carteRight(event, can, {
"refresh": function() { zone.refresh() },
"fold": function() { can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, false) }) },
"expand": function() { can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) }) },
}, ["refresh", "fold", "expand"])
})
}},
{view: html.ACTION, _init: function(target) { zone._action = target
can.onappend._action(can, [{input: html.TEXT, placeholder: "search", onkeyup: function(event) {

View File

@ -154,7 +154,7 @@ var chat = {
STATE: "state", MENUS: "menus", SSO: "sso", LOCATION: "location",
SIMPLE: "simple", OUTPUT: "output", FLOAT: "float", FULL: "full", CMD: "cmd",
HEADER: "Header", ACTION: "Action",
HEADER: "Header", ACTION: "Action", FOOTER: "Footer",
libs: ["/lib/base.js", "/lib/core.js", "/lib/date.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"],
panel_list: [
{name: "Header", pos: "head"}, {name: "River", pos: "left"}, {name: "Action", pos: "main"}, {name: "Search", pos: "auto"}, {name: "Footer", pos: "foot"},
@ -258,7 +258,11 @@ function shy(help, meta, list, cb) { var args = arguments, i = 0; function next(
}; var _can_name = "", _can_path = ""
var Volcanos = shy({version: window._version||"", iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {}}, function(name, can, libs, cb) {
var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == lang.OBJECT) {
if (name.length > 0) { return Volcanos({panels: [{name: chat.HEADER, pos: html.HIDE, state: [aaa.USERNICK]}, {name: chat.ACTION, pos: html.MAIN, tool: name}]}) }
if (name.length > 0) { return Volcanos({panels: [
{name: chat.HEADER, pos: html.HIDE, state: [aaa.USERNICK]},
{name: chat.ACTION, pos: html.MAIN, tool: name},
{name: chat.FOOTER, pos: html.HIDE}
]}) }
var Config = name; name = Config.name||ice.CAN, _can_name = "", _can_path = ""
meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = Config.libs||chat.libs, panels = Config.panels||chat.panel_list
libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+nfs._JS, "/panel/"+p.name+nfs._CSS])) }), libs = libs.concat(Config.plugin||chat.plugin_list)