mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 08:48:06 +08:00
opt river.js
This commit is contained in:
parent
6b2d9a1793
commit
89e5630ea3
31
frame.js
31
frame.js
@ -42,7 +42,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.requ
|
||||
_engine: function(event, can, msg, panel, cmds, cb) { return false },
|
||||
_plugin: function(event, can, msg, panel, cmds, cb) {
|
||||
if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN) { var p = can.onengine.plugin(can, cmds[2])
|
||||
if (p) { return can.core.CallFunc(p, {can: p.can||panel, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb}), true }
|
||||
if (p) { return can.core.CallFunc(p, {can: p.can||panel, sub: msg._can, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb}), true }
|
||||
}
|
||||
var p = can.onengine.plugin(can, cmds[0]), n = 1; if (!p) { return false }
|
||||
var func = p, _can = p.can||panel, _sup = _can
|
||||
@ -312,7 +312,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
},
|
||||
field: function(can, type, item, target) { type = type||html.STORY, item = item||{}
|
||||
var name = can.core.Split(item.nick||item.name||"").pop()||"", title = !item.help || item.help == name || can.user.language(can) == "en"? name: name+"("+can.core.Split(item.help)[0]+")"
|
||||
return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{text: [title, html.LEGEND]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}])
|
||||
return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [
|
||||
{type: html.LEGEND, list: [{text: title}
|
||||
]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}])
|
||||
},
|
||||
input: function(can, item, value, target, style) { if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) }
|
||||
var icon = []
|
||||
@ -378,26 +380,26 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
} else if (can.base.isObject(item)) {
|
||||
if (item.index) { item._index = count++, ui.size[item._index] = item.height||item.width
|
||||
can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub])
|
||||
item.layout = function(width, height) { sub.onimport.size(sub, height, width) }
|
||||
item.layout = function(height, width) { sub.onimport.size(sub, height, width) }
|
||||
}, target, ui[item._index] = can.onappend.field(can, item.type, {name: item.index.split(ice.PT).pop(), help: item.help}, target)._target)
|
||||
} else { can.page.Append(can, target, [item]) }
|
||||
}
|
||||
}); return list } ui.list = append(target, type, list||[html.PROJECT, [[html.CONTENT, html.PROFILE], html.DISPLAY]])
|
||||
function calc(item, size, total) { return !ui.size[item]? size: ui.size[item] < 1? total*ui.size[item]: ui.size[item] }
|
||||
var defer = [], content_height, content_width; function layout(type, list, width, height) { var _width = width, _height = height; can.core.List(list, function(item) {
|
||||
var defer = [], content_height, content_width; function layout(type, list, height, width) { var _width = width, _height = height; can.core.List(list, function(item) {
|
||||
if (item == html.CONTENT) { content_height = height, content_width = width
|
||||
return defer.push(function() { can.page.style(can, ui[item], html.HEIGHT, height, html.WIDTH, width) })
|
||||
}
|
||||
if (!can.page.isDisplay(ui[item])) { return } if (can.base.isObject(item)) { var meta = item; item = item._index }
|
||||
if (type == FLOW) { var h = calc(item, ui[item].offsetHeight, height)
|
||||
if (can.base.isObject(meta)) { meta.layout(width, h) }
|
||||
if (can.base.isObject(meta)) { meta.layout(h, width) }
|
||||
can.page.style(can, ui[item], html.WIDTH, width), height -= h
|
||||
} else { var w = calc(item, ui[item].offsetWidth||_width/list.length, _width), h = height
|
||||
if (can.base.isObject(meta)) { meta.layout(w = _width/list.length, h) }
|
||||
if (can.base.isObject(meta)) { meta.layout(h, w = _width/list.length) }
|
||||
can.page.style(can, ui[item], html.HEIGHT, h, html.WIDTH, w), width -= w
|
||||
}
|
||||
}), can.core.List(list, function(item) { if (can.base.isArray(item)) { layout(type == FLOW? FLEX: FLOW, item, width, height) } }) }
|
||||
ui.layout = function(width, height, delay, cb) { can.onmotion.delay(can, function() { defer = [], layout(type, ui.list, width, height), defer.forEach(function(cb) { cb() }), cb && cb(content_height, content_width) }, delay||0) }
|
||||
}), can.core.List(list, function(item) { if (can.base.isArray(item)) { layout(type == FLOW? FLEX: FLOW, item, height, width) } }) }
|
||||
ui.layout = function(height, width, delay, cb) { can.onmotion.delay(can, function() { defer = [], layout(type, ui.list, height, width), defer.forEach(function(cb) { cb() }), cb && cb(content_height, content_width) }, delay||0) }
|
||||
return ui
|
||||
},
|
||||
tabview: function(can, meta, list, target) { var ui = can.page.Append(can, target, [html.ACTION, html.OUTPUT])
|
||||
@ -436,7 +438,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
var input = meta.action||mdb.KEY, path = chat.PLUGIN_INPUT+input+nfs._JS; can.require([path], function(can) {
|
||||
function _cb(sub, value, old) { if (value == old) { return } can.base.isFunc(cb)? cb(sub, value, old): target.value = value }
|
||||
can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]||function(){}; target[key] = function(event) { can.misc.Event(event, can, function(msg) {
|
||||
function show(sub, cb) { can.base.isFunc(cb) && cb(sub, _cb), can.onlayout.figure(event, can, sub._target, false, 0.75), can.onmotion.toggle(can, sub._target, true) }
|
||||
function show(sub, cb) { can.base.isFunc(cb) && cb(sub, _cb), can.onlayout.figure(event, can, sub._target, false), can.onmotion.toggle(can, sub._target, true) }
|
||||
can.core.CallFunc(on, {event: event, can: can, meta: meta, cb: _cb, target: target, sub: target._can, last: last, cbs: function(cb) {
|
||||
target._can? show(target._can, cb): can.onappend._init(can, {type: html.INPUT, name: input, style: meta.name, mode: chat.FLOAT}, [path], function(sub) { sub.Conf(meta)
|
||||
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
|
||||
@ -444,8 +446,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
(meta.run||can.run)(sub.request(event, can.Option()), cmds, cb, true)
|
||||
}, target._can = sub, can.base.Copy(sub, can.onfigure[input], true), sub._name = sub._path = path
|
||||
sub.hidden = function() { return !can.page.isDisplay(sub._target) }, sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) }
|
||||
meta.mode && can.onappend.style(sub, meta.mode)
|
||||
can.page.style(sub, sub._target, meta.style), can.base.isFunc(meta._init) && meta._init(sub, sub._target), show(sub, cb)
|
||||
meta.mode && can.onappend.style(sub, meta.mode), can.page.style(sub, sub._target, meta.style)
|
||||
can.base.isFunc(meta._init) && meta._init(sub, sub._target), show(sub, cb)
|
||||
}, can._root._target)
|
||||
}})
|
||||
}) } }), can.onfigure[input]._init && can.onfigure[input]._init(can, meta, target, _cb)
|
||||
@ -466,7 +468,9 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro
|
||||
},
|
||||
background: function(can, url, target) { can.page.style(can, target||can._root._target, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') },
|
||||
figure: function(event, can, target, right, max) { if (!event || !event.target) { return {} } target = target||can._fields||can._target
|
||||
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 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.currentTarget||event.target).getBoundingClientRect()
|
||||
// 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)
|
||||
can.page.style(can, target, html.MAX_HEIGHT, can.base.Max(max > 0.5 || layout.top > (top+height)*0.5? height: top+height-layout.top, height*(max||0.5)))
|
||||
@ -523,6 +527,9 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
})
|
||||
},
|
||||
},
|
||||
scrollHold: function(can, cb, target) { target = target || can._output
|
||||
var top = target.scrollTop, left = target.scrollLeft; cb(), target.scrollTop = top, target.scrollLeft = left
|
||||
},
|
||||
clearFloat: function(can) { can.page.SelectChild(can, document.body, "div.float", function(target) { can.page.Remove(can, target) }) },
|
||||
clearCarte: function(can) { can.page.SelectChild(can, document.body, "div.carte.float", function(target) { can.page.Remove(can, target) }) },
|
||||
clearInput: function(can) { can.page.SelectChild(can, document.body, "div.input.float", function(target) { can.page.Remove(can, target) }) },
|
||||
|
@ -89,7 +89,8 @@ body>div.toast div.duration { color:gray; float:right; }
|
||||
body>div.toast div.content { color:blue; text-align:center; }
|
||||
body>div.toast div.progress { border:green solid 1px; margin-left:0px; height:20px; clear:both; }
|
||||
body>div.toast div.progress div.current { background-color:red; height:18px; }
|
||||
body>div.toast div.action { display:block; }
|
||||
body>div.toast div.action { width:100%; display:block; }
|
||||
body>div.toast div.action>div.item { float:right; }
|
||||
body>div.carte { padding:0; }
|
||||
body>div.carte input[name=filter] { margin:5px; width:calc(100% - 10px); position:sticky; top:5px; }
|
||||
body>div.carte div.item { padding:5px 10px; }
|
||||
@ -110,7 +111,9 @@ body>div.upload div.status div.show { float:right; }
|
||||
body>div.upload div.status div.size { text-align:center; }
|
||||
body>div.upload input[type=file] { width:320px; }
|
||||
/* font */
|
||||
legend { font-size:1.2rem; height:31px; }
|
||||
legend { font-size:1.2rem; line-height:31px; height:31px; }
|
||||
legend>span.delete { font-size:1rem; margin-left:5px; margin-right:-15px; visibility:hidden; }
|
||||
// legend:hover>span.delete { visibility:visible; }
|
||||
select, input { font-size:1rem; height:31px; } textarea { tab-size:2; height:93px; } input::placeholder { font-style:italic; }
|
||||
table.content, div.project, div.item, div.code, div.story[data-type=spark], svg { font-family:monospace; white-space:pre; text-align:left; }
|
||||
div.action>div.tabs { padding:5px; height:31px; }
|
||||
|
@ -99,7 +99,8 @@ Volcanos("base", {
|
||||
isNumber: function(val) { return typeof val == code.NUMBER },
|
||||
isString: function(val) { return typeof val == code.STRING },
|
||||
isObject: function(val) { return typeof val == code.OBJECT },
|
||||
isArray: function(val) { return typeof val == code.OBJECT && val.length != undefined },
|
||||
isArray: function(val) { return Array.isArray(val) },
|
||||
// isArray: function(val) { return typeof val == code.OBJECT && val.length != undefined },
|
||||
isFunc: function(val) { return typeof val == code.FUNCTION },
|
||||
isUndefined: function(val) { return val == undefined },
|
||||
isNull: function(val) { return val == null },
|
||||
@ -115,9 +116,9 @@ Volcanos("base", {
|
||||
} return str },
|
||||
contains: function(str) { var arg = arguments; for (var i = 1; i < arg.length; i++) { if (!arg[i] || str.indexOf(arg[i]) > -1) { return true } } },
|
||||
beginWith: function(str) { for (var i = 1; i < arguments.length; i++) { if (typeof str == code.STRING && str.trim().indexOf(arguments[i]) == 0) { return true } } },
|
||||
endWith: function(str) { for (var i = 1; i < arguments.length; i++) { if (typeof str == code.STRING && str.lastIndexOf(arguments[i]) + arguments[i].length == str.length) { return true } } },
|
||||
trimPrefix: function(str, pre) { if (typeof str != code.STRING) { return str } var callee = arguments.callee
|
||||
if (arguments.length > 2) { for (var i = 1; i < arguments.length; i++) { str = callee(str, arguments[i]) } return str }
|
||||
endWith: function(str) { var arg = arguments; for (var i = 1; i < arg.length; i++) { if (typeof str == code.STRING && str.lastIndexOf(arg[i]) + arg[i].length == str.length) { return true } } },
|
||||
trimPrefix: function(str, pre) { if (typeof str != code.STRING) { return str } var arg = arguments, callee = arg.callee
|
||||
if (arg.length > 2) { for (var i = 1; i < arg.length; i++) { str = callee(str, arg[i]) } return str }
|
||||
if (str.indexOf(pre) == -1) { return str } return str.slice(pre.length)
|
||||
},
|
||||
trimSuffix: function(str, end) { while (str) { var index = str.lastIndexOf(end)
|
||||
|
@ -117,6 +117,7 @@ Volcanos("misc", {
|
||||
return can.base.MergeURL(_location.origin+(args.length == 1? path: ice.PS+args.join(ice.PS))+(clear? "": _location.search), obj)
|
||||
},
|
||||
ParseURL: function(can, url) { var args = can.base.ParseURL(url), _location = new URL(url)
|
||||
delete(args.link), delete(args.origin), delete(args._origin)
|
||||
var ls = can.core.Split(_location.pathname, ice.PS); if (ls[0] == chat.SHARE) { args[chat.SHARE] = ls[1] }
|
||||
for (var i = 1; i < ls.length; i += 2) { if (can.base.isIn(ls[i], [ice.POD, ice.CMD, web.WEBSITE])) { args[ls[i]] = ls[i+1] } }
|
||||
return args
|
||||
|
@ -53,6 +53,8 @@ Volcanos("page", {
|
||||
list[0] && can.page.ClassList.add(can, data, list[0]), type = list[1]||type, data.innerHTML = list[2]||data.innerHTML||"", name = list[3]||name
|
||||
} else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(ice.SP) }
|
||||
data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2])
|
||||
} else if (item.icon) { var list = can.core.List(item.icon)
|
||||
type = html.SPAN, name = list[0], data.className = list[0], data.innerText = can.page.unicode[list[0]]
|
||||
} else if (item.button) { var list = can.core.List(item.button); type = html.BUTTON, name = list[0]||name, data.innerText = can.user.trans(can, name)
|
||||
data.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, name), can.onkeymap.prevent(event) }) }
|
||||
} else if (item.select) { var list = item.select; type = html.SELECT, name = list[0][0], data.className = data.className||list[0][0]
|
||||
@ -232,6 +234,7 @@ Volcanos("page", {
|
||||
tagis: function(target) { if (!target || !target.tagName) { return }
|
||||
var type = target.tagName.toLowerCase(); for (var i = 1; i < arguments.length; i++) { if (type == arguments[i]) { return true } }
|
||||
},
|
||||
tagClass: function(target) { return target.tagName.toLowerCase()+(target.className? ice.PT+target.className.replaceAll(ice.SP, ice.PT): "") },
|
||||
isDisplay: function(target) { return target && target.style.display != html.NONE && target.className.indexOf(html.HIDE) == -1 },
|
||||
editable: function(can, item, ok) { item.setAttribute("contenteditable", ok) },
|
||||
draggable: function(can, item, ok) { item.setAttribute("draggable", ok) },
|
||||
|
26
lib/user.js
26
lib/user.js
@ -55,19 +55,24 @@ Volcanos("user", {
|
||||
code.INNER, "源码", chat.IFRAME, "浏览", chat.LOCATION, "地图",
|
||||
html.PLUGIN, "插件", html.LABEL, "标签", html.HEIGHT, "高度", html.WIDTH, "宽度", ice.SHOW, "显示", ice.HIDE, "隐藏", chat.PROJECT, "项目", chat.PROFILE, "详情", chat.ACTIONS, "参数",
|
||||
"full", "全屏", "Close", "关闭", "Close Other", "关闭其它",
|
||||
"confirm", "确定",
|
||||
)[text]||text
|
||||
},
|
||||
time: function(can, time, fmt) { var now = can.base.Date(time)
|
||||
var list = can.user.language(can) == "en"? ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
|
||||
return fmt == "%W"? list: can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))
|
||||
},
|
||||
toastConfirm: function(can, content, title, action) { return can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1}) },
|
||||
toastConfirm: function(can, content, title, action) {
|
||||
if (!action.list || action.list.length == 0) { action = shy({confirm: action}, ["confirm", "cancel"], function() {}) }
|
||||
var carte = can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1})
|
||||
can.page.style(can, carte._target, html.TOP, 200, html.BOTTOM, ""); return carte
|
||||
},
|
||||
toastProcess: function(can, content, title) { return can.user.toast(can, {content: content||ice.PROCESS, title: title||can._name, duration: -1, caller: 2}) },
|
||||
toastSuccess: function(can, content, title) { return can.user.toast(can, {content: "\u2705 "+(content||ice.SUCCESS), title: title||can._name, caller: 2}) },
|
||||
toastFailure: function(can, content, title) { return can.user.toast(can, {content: "\u274C "+(content||ice.FAILURE), title: title||can._name, duration: 10000, caller: 2}) },
|
||||
toast: function(can, content, title, duration, progress, caller) {
|
||||
var meta = can.base.isObject(content)? content: {content: content, title: title||can._name.split(ice.PS).slice(-2).join(ice.PS), duration: duration, progress: progress, caller: caller}
|
||||
var width = meta.width||400; if (width < 0) { width = window.innerWidth + width }
|
||||
var width = meta.width||400; if (width < 0) { width = window.innerWidth + width } meta.action = meta.action||[""]
|
||||
var ui = can.page.Append(can, document.body, [{view: [[chat.TOAST, chat.FLOAT]], style: {left: (window.innerWidth-width)/2, width: width, bottom: 100}, list: [
|
||||
{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() }},
|
||||
@ -76,10 +81,13 @@ Volcanos("user", {
|
||||
{view: "current", style: {width: (meta.progress||0)*(width-12)/100}},
|
||||
]},
|
||||
] }]); can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content})._caller(meta.caller||1))
|
||||
var action = can.onappend._action(can, meta.action && meta.action.list? meta.action.list: meta.action||[""], ui.action, {
|
||||
_engine: function(event, button) { can.core.CallFunc(meta.action[button]||meta.action, [event, button]) },
|
||||
meta.action.meta && can.core.Item(meta.action.meta, function(key, cb) { cb.help && can.core.Value(meta.action.meta, ["_trans", key], cb.help) })
|
||||
var action = can.onappend._action(can, meta.action.list? meta.action.list: meta.action, ui.action, {
|
||||
_trans: meta.action.meta? meta.action.meta._trans: {},
|
||||
_engine: function(event, button) { can.core.CallFunc(meta.action.meta? meta.action.meta[button]: meta.action, [event, button]) },
|
||||
open: function(event) { meta.content.indexOf(ice.HTTP) == 0 && can.user.open(meta.content), meta.title.indexOf(ice.HTTP) == 0 && can.user.open(meta.title) },
|
||||
close: function(event) { can.page.Remove(can, ui._target), action.timer.stop = true },
|
||||
cancel: function(event) { can.page.Remove(can, ui._target), action.timer.stop = true },
|
||||
timer: can.core.Timer({interval: 100, length: (meta.duration||1000)/100}, function(event, interval, index) {
|
||||
if (index > 30) { ui.duration.innerHTML = index/10+"s..." }
|
||||
}, function() { action.close() }), _target: ui._target,
|
||||
@ -98,9 +106,11 @@ Volcanos("user", {
|
||||
return can.user.toastSuccess(can, text, "copy success"), can.misc.Log(nfs.COPY, text), text
|
||||
},
|
||||
carte: function(event, can, meta, list, cb, parent, trans) { parent || can.onmotion.clearCarte(can)
|
||||
var msg = can.request(event)
|
||||
trans = trans||meta._trans
|
||||
meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)); if (!list || list.length == 0) { return }
|
||||
function click(event, button) { can.misc.Event(event, can, function(msg) { can.onkeymap.prevent(event)
|
||||
meta[button]? can.core.CallFunc([meta, button], [event, can, button]): can.base.isFunc(cb)? cb(event, button, meta, carte):
|
||||
function click(event, button) { can.misc.Event(event, can, function() { can.onkeymap.prevent(event)
|
||||
meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.base.isFunc(cb)? cb(event, button, meta, carte):
|
||||
can.onaction && can.onaction[button] && can.core.CallFunc([can.onaction, button], [event, can, button])
|
||||
can.onmotion.clearCarte(can)
|
||||
}) } function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) }
|
||||
@ -216,7 +226,7 @@ Volcanos("user", {
|
||||
}, can.base.Obj(method, can.user.isMobile? ["密码登录"]: ["扫码授权"]), can.page.Append(can, document.body, [{view: "input login float"}])._target)
|
||||
can.onmotion.delay(can, function() { layout() })
|
||||
},
|
||||
logout: function(can, force) { if (force||can.user.confirm("logout?")) { can.runAction({}, aaa.LOGOUT, [], function(msg) {
|
||||
logout: function(can) { can.user.toastConfirm(can, "logout", "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) {
|
||||
can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true)
|
||||
}) } },
|
||||
}) }) },
|
||||
})
|
||||
|
@ -1,9 +1,9 @@
|
||||
(function() { const TABS = "tabs", TABVIEW = "tabview", HORIZON = "horizon", VERTICAL = "vertical", GRID = "grid", FREE = "free", FLOW = "flow", PAGE = "page", CAN_LAYOUT = "can.layout"
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can)
|
||||
var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM); can.core.Next(msg.Table(), function(item, next) { item.type = chat.PLUGIN, item.mode = can.Mode()
|
||||
Volcanos(chat.ONIMPORT, {_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.mode = can.Mode()
|
||||
can.onappend.plugin(can, item, function(sub, meta, skip) { can._plugins = (can._plugins||[]).concat([sub]), can.onimport._tabs(can, sub, meta), skip || next()
|
||||
sub.run = function(event, cmds, cb) { return can.run(event, (river == web.SHARE? [ctx.ACTION]: []).concat([river, storm, meta.id||meta.index], cmds), cb) }
|
||||
sub._target.onclick = function(event) { event.target == sub._target && sub._tabs.click() }
|
||||
sub._target.onclick = function(event) { event.target == sub._target && can.onmotion.scrollHold(can, function() { sub._tabs.click() }) }
|
||||
})
|
||||
}, function() { can.isCmdMode() || can.onmotion.delay(can, function() { can.onaction.layout(can) }) })
|
||||
},
|
||||
@ -12,7 +12,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can)
|
||||
can.Conf(chat.RIVER, web.SHARE, chat.STORM, share), can.onimport._init(can, msg)
|
||||
}) },
|
||||
_tabs: function(can, sub, meta) {
|
||||
var tabs = [{view: [html.TABS, html.DIV, meta.name], onclick: function(event) { can.onmotion.select(can, can._header_tabs, html.DIV_TABS, sub._header_tabs)
|
||||
var tabs = [{view: [html.TABS, "", meta.name], onclick: function(event) { can.onmotion.select(can, can._header_tabs, html.DIV_TABS, sub._header_tabs)
|
||||
can.onmotion.select(can, can._action, html.DIV_TABS, sub._tabs), can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target)
|
||||
if (sub._delay_refresh) { sub._delay_refresh = false, sub.onimport.size(sub, can.ConfHeight(), can.ConfWidth(), can.onexport.isauto(can)) }
|
||||
can.onexport.layout(can) == FREE || (can._output.scrollTop = sub._target.offsetTop-html.PLUGIN_MARGIN)
|
||||
@ -30,20 +30,20 @@ Volcanos(chat.ONACTION, {_init: function(can, target) {
|
||||
onsize: function(can, msg, height, width) { can.Conf({height: height-can.Conf(html.MARGIN_Y), width: width-can.Conf(html.MARGIN_X)}) },
|
||||
onmain: function(can, msg) { can.onimport._share(can, can.misc.Search(can, web.SHARE)) },
|
||||
onlogin: function(can, msg) { can.ondaemon._init(can), can.onimport._menu(can, msg), can.onkeymap._build(can)
|
||||
can._root.River && can.onmotion.delay(can, function() { var gt = can.page.unicode.gt, lt = can.page.unicode.lt, river = can._root.River._target; if (can.Mode()) { return }
|
||||
var target = can.page.Append(can, can._target, [{view: [[html.TOGGLE, chat.PROJECT], html.DIV, can.page.isDisplay(river)? lt: gt], onclick: function(event) {
|
||||
can._root.River && can.onmotion.delay(can, function() { if (can.Mode()) { return } var gt = can.page.unicode.gt, lt = can.page.unicode.lt, river = can._root.River._target
|
||||
var target = can.page.Append(can, can._target, [{view: [[html.TOGGLE, chat.PROJECT], "", can.page.isDisplay(river)? lt: gt], onclick: function(event) {
|
||||
can.page.Modify(can, target, (can._river_show = can.onmotion.toggle(can, river))? lt: gt), can.onaction.layout(can)
|
||||
}}])._target; can._toggle = target
|
||||
}); if (!can.Conf(chat.TOOL) && !can.user.mod.isCmd) { return } can._names = location.pathname
|
||||
can.Conf(chat.TOOL)? can.onappend.layout(can, can._output, FLOW, can.core.List(can.Conf(chat.TOOL), function(item, index, list) { item.type = chat.PLUGIN
|
||||
if (list.length == 1) { can.onaction._onaction_cmd(can), item.mode = chat.CMD, item.opts = can.misc.Search(can) } return item
|
||||
})).layout(window.innerWidth, window.innerHeight): can.runAction(can.request(), ctx.COMMAND, [], function(msg) {
|
||||
})).layout(window.innerHeight, window.innerWidth): can.runAction(can.request(), ctx.COMMAND, [], function(msg) {
|
||||
if (msg.Length() == 1) { can.onaction._onaction_cmd(can) } can.onimport._init(can, msg)
|
||||
})
|
||||
},
|
||||
onstorm_select: function(can, msg, river, storm) {
|
||||
if (can.onmotion.cache(can, function(cache, old) { var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm))
|
||||
return cache[old] = can._plugins, can._plugins = cache[key]||[], key
|
||||
if (can.onmotion.cache(can, function(cache, old) { old && (cache[old] = can._plugins)
|
||||
var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)); return can._plugins = cache[key]||[], key
|
||||
}, can._output, can._action, can._header_tabs)) { return can.onaction.layout(can) }
|
||||
can.run({}, [river, storm], function(msg) {
|
||||
if (msg.Length() == 0) { return can.user.isLocalFile? can.user.toastFailure(can, "miss data"): can.onengine.signal(can, chat.ONACTION_NOTOOL, can.request({}, {river: river, storm: storm})) }
|
||||
@ -60,7 +60,9 @@ Volcanos(chat.ONACTION, {_init: function(can, target) {
|
||||
if (can.onkeymap.selectCtrlN(msg._event, can, can._action, html.DIV_TABS)) { return }
|
||||
can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output)
|
||||
},
|
||||
onresize: function(can, height, width) { can.onaction.layout(can), window.setsize && window.setsize(can.page.width(), can.page.height()) },
|
||||
onresize: function(can) { can.onaction.layout(can), window.setsize && window.setsize(can.page.width(), can.page.height()) },
|
||||
ontitle: function(can, msg) { can.misc.localStorage(can, CAN_LAYOUT, "") },
|
||||
|
||||
layout: function(can, button) { can.page.ClassList.del(can, can._target, can._layout||can.misc.localStorage(can, CAN_LAYOUT)), can._header_tabs && can.onmotion.hidden(can, can._header_tabs)
|
||||
button = (can.misc.localStorage(can, CAN_LAYOUT, can._layout = button == ice.AUTO? "": button))||can.misc.SearchOrConf(can, html.LAYOUT), can.page.ClassList.add(can, can._target, button)
|
||||
can.onengine.signal(can, chat.ONLAYOUT, can.request({}, {layout: button})), can._root.River && can._river_show === false && can.onmotion.hidden(can, can._root.River._target), can.onlayout._init(can)
|
||||
@ -98,8 +100,8 @@ Volcanos(chat.ONEXPORT, {
|
||||
},
|
||||
layout: function(can) { return can._layout||can.misc.SearchOrConf(can, html.LAYOUT)||"" },
|
||||
isauto: function(can) { return ["", FLOW, PAGE].indexOf(can.onexport.layout(can)) > -1 },
|
||||
args: function(can, msg, cb) { can.core.Next(can._plugins, function(sub, next, index, array) {
|
||||
cb(can.base.trim(can.page.SelectArgs(can, sub._option, "", function(item) { return item.value })), sub, next, index, array)
|
||||
args: function(can, msg, cb) { can.core.Next(can._plugins, function(sub, next, index, list) {
|
||||
cb(can.base.trim(can.page.SelectArgs(can, sub._option, "", function(item) { return item.value })), sub, next, index, list)
|
||||
}) },
|
||||
plugin: function(can, msg, arg, fields) { can.core.List(can._plugins, function(sub) { var meta = sub.Conf(); if (!can.base.contains(meta.index, arg[1])) { return }
|
||||
var data = {ctx: ice.CAN, cmd: can._name, type: chat.PLUGIN, name: sub._index, text: shy(sub._legend.innerHTML, function(event) { sub._target.click() })}
|
||||
@ -117,8 +119,6 @@ Volcanos(chat.ONENGINE, {_engine: function(event, sup, msg, can, cmds, cb) {
|
||||
}), can.base.isFunc(cb) && cb(msg) } return true
|
||||
}})
|
||||
Volcanos(chat.ONKEYMAP, {
|
||||
toggleLayout: function(can, layout) { can.onaction.layout(can, can.onexport.layout(can) == layout? ice.AUTO: layout) },
|
||||
toggleTheme: function(can, theme) { can.setHeader(chat.THEME, can.getHeaderTheme() == theme? ice.AUTO: theme) },
|
||||
_mode: {
|
||||
webview: {
|
||||
"[": function(event, can, target) { history.back() },
|
||||
@ -126,7 +126,6 @@ Volcanos(chat.ONKEYMAP, {
|
||||
r: function(event, can, target) { can.user.reload(true) },
|
||||
w: function(event, can, target) { can.user.close() },
|
||||
q: function(event, can, target) { window.terminate() },
|
||||
|
||||
o: function(event, can, target) { window.openurl(location.href) },
|
||||
p: function(event, can, target) { window.openapp("QuickTime Player") },
|
||||
t: function(event, can, target) { window.opencmd("cd contexts; pwd") },
|
||||
@ -151,6 +150,8 @@ Volcanos(chat.ONKEYMAP, {
|
||||
Escape: function(event, can) { can.onmotion.clearFloat(can), can._root.Search && can.onmotion.hidden(can, can._root.Search._target) },
|
||||
},
|
||||
}, _engine: {},
|
||||
toggleTheme: function(can, theme) { can.setHeader(chat.THEME, can.getHeaderTheme() == theme? ice.AUTO: theme) },
|
||||
toggleLayout: function(can, layout) { can.onaction.layout(can, can.onexport.layout(can) == layout? ice.AUTO: layout) },
|
||||
})
|
||||
Volcanos(chat.ONPLUGIN, {_plugin: shy("默认插件", [mdb.NAME, ice.LIST, ice.BACK]),
|
||||
layout: shy("界面布局", {_init: function(can) { can.Option(chat.LAYOUT, can.getAction(chat.LAYOUT)) }}, ["layout:select=auto,tabs,tabview,horizon,vertical,grid,free,flow,page", ice.RUN], function(can, msg, arg) {
|
||||
|
@ -1,4 +1,4 @@
|
||||
fieldset.Footer>div.output { font-size:1.1rem; padding:0 5px; }
|
||||
fieldset.Footer>div.output { font-size:1.1rem; padding:0 5px; height:31px; }
|
||||
fieldset.Footer>div.output div { padding:5px; height:31px; cursor:pointer; }
|
||||
fieldset.Footer>div.output div:hover { background-color:#2e515f; }
|
||||
fieldset.Footer>div.output div.title { float:left; }
|
||||
|
@ -1,38 +1,35 @@
|
||||
(function() { var NTIP = "ntip", NCMD = "ncmd", NLOG = "nlog", NKEY = "nkey"
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.ui = {}, can.db = {}
|
||||
can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length)
|
||||
(function() { var NTIP = "ntip", NLOG = "nlog", NCMD = "ncmd", NKEY = "nkey"
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length)
|
||||
can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._toast(can, msg, target), can.onimport._command(can, msg, target)
|
||||
},
|
||||
_title: function(can, msg, target) { can.user.isMobile || can.core.List(can.Conf(chat.TITLE)||msg.result, function(item) {
|
||||
can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "联系站长"}])
|
||||
can.page.Append(can, target, [{view: [chat.TITLE, "", item], title: "联系站长"}])
|
||||
}) },
|
||||
_state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [NTIP, NLOG, NKEY, NCMD]).reverse(), function(item) {
|
||||
can.page.Append(can, target, [{view: [chat.STATE, html.DIV], list: [
|
||||
{text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", html.SPAN, item]},
|
||||
_state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [NTIP, NLOG, NCMD, NKEY]).reverse(), function(item) {
|
||||
can.page.Append(can, target, [{view: chat.STATE, list: [
|
||||
{text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", "", item]},
|
||||
], onclick: function(event) { can.onexport[item](can) }}])
|
||||
}) },
|
||||
_toast: function(can, msg, target) { can.toast = can.page.Append(can, target, [{view: chat.TOAST, onclick: function(event) { can.onexport[NTIP](can) }}])._target },
|
||||
_toast: function(can, msg, target) { can.ui.toast = can.page.Append(can, target, [{view: chat.TOAST, onclick: function(event) { can.onexport[NTIP](can) }}])._target },
|
||||
_command: function(can, msg, target) { can.onappend.input(can, {type: html.TEXT, name: ice.CMD, onkeydown: function(event) { can.onkeymap.input(event, can)
|
||||
function close() { can.ui.cli && can.ui.cli.close() } if (event.key == lang.ESCAPE) { return close() } if (event.key != lang.ENTER) { return }
|
||||
switch (event.target.value) {
|
||||
function close() { can.ui.cli && can.ui.cli.onaction.close() } if (event.key == lang.ESCAPE) { return close() } if (event.key != lang.ENTER) { return }
|
||||
close(); switch (event.target.value) {
|
||||
case cli.CLEAR:
|
||||
case cli.CLOSE: close(); break
|
||||
default: close(); var list = can.core.Split(event.target.value, ice.SP)
|
||||
can.onexport._float(can, "cli", list[0], list.slice(1), function(sub) { can.ui.cli.close = function() { can.page.Remove(can, sub._target), delete(can.ui.cli) }
|
||||
can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+10, html.RIGHT, "") })
|
||||
})
|
||||
case cli.CLOSE: break
|
||||
default: var list = can.core.Split(event.target.value, ice.SP)
|
||||
can.onexport._float(can, "cli", list[0], list.slice(1), function(sub) { can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+10, html.RIGHT, "") }) })
|
||||
}
|
||||
}}, "", target, [chat.TITLE]) },
|
||||
_data: function(can, name, item) { can[name] = can[name]||can.request(), can[name].Push(item), can.onimport.count(can, name) },
|
||||
_data: function(can, name, item) { can.db[name] = can.db[name]||can.request(), can.db[name].Push(item), can.onimport.count(can, name) },
|
||||
count: function(can, name) { can.page.Select(can, can._output, can.core.Keys(html.SPAN, name), function(item) { item.innerHTML = can.Conf(name, parseInt(can.Conf(name)||"0")+1+"")+"" }) },
|
||||
toast: function(can, msg, title, content, fileline, time) { can.onimport._data(can, NTIP, {time: time, fileline: can.base.trimPrefix(msg.Option("log.caller"), location.origin+ice.PS), title: title, content: content}), can.page.Modify(can, can.toast, [time, title, content].join(ice.SP)) },
|
||||
ntip: function(can, msg, time, title, content) { can.onimport._data(can, NTIP, {time: time, fileline: can.base.trimPrefix(msg.Option("log.caller"), location.origin+ice.PS), title: title, content: content}), can.page.Modify(can, can.ui.toast, [time, title, content].join(ice.SP)) },
|
||||
ncmd: function(can, msg, _follow, _cmds) { can.onimport._data(can, NCMD, {time: can.base.Time(), follow: _follow, cmds: _cmds}), can.onimport.nlog(can, NLOG) },
|
||||
nlog: function(can, name) { can.onimport.count(can, name) },
|
||||
})
|
||||
Volcanos(chat.ONACTION, {_init: function(can) { can.user.isExtension || can.onmotion.hidden(can) },
|
||||
Volcanos(chat.ONACTION, {_init: function(can) { can.ui = {}, can.db = {} },
|
||||
onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth) },
|
||||
onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onmotion.clear(can), can.onimport._init(can, msg, can._output) }) },
|
||||
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.toast, {can: can, msg: msg}) },
|
||||
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.ntip, {can: can, msg: msg}) },
|
||||
onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) },
|
||||
onlayout: function(can, layout) { can.onmotion.toggle(can, can._target, !layout || layout == html.TABS) },
|
||||
onaction_cmd: function(can) { can.onappend.style(can, html.HIDE) },
|
||||
@ -40,42 +37,42 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.user.isExtension || can.onmo
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {height: function(can) { return can._target.offsetHeight },
|
||||
ntip: function(can) { can.onexport._float(can, NTIP, "can.toast") },
|
||||
ncmd: function(can) { can.onexport._float(can, NCMD, "can.debug", [chat.ONREMOTE]) },
|
||||
nlog: function(can) { can.onexport._float(can, NLOG, "can.debug") },
|
||||
ncmd: function(can) { can.onexport._float(can, NCMD, "can.debug", [chat.ONREMOTE]) },
|
||||
nkey: function(can) { can.onexport._float(can, NLOG, "can.localStorage") },
|
||||
_float: function(can, name, index, args, cb) { can.ui[name]? (can.ui[name].onaction.close(), delete(can.ui[name])): can.onappend._float(can, index, args||[], function(sub) { can.ui[name] = sub
|
||||
_float: function(can, name, index, args, cb) { can.ui[name]? can.ui[name].onaction.close(): can.onappend._float(can, index, args||[], function(sub) { can.ui[name] = sub
|
||||
can.page.style(can, sub._target, {left: "", top: "", right: 0, bottom: can.onexport.height(can)}), can.base.isFunc(cb) && cb(sub)
|
||||
can.onmotion.delay(can, function() { sub.onaction.close = function() { can.page.Remove(can, sub._target), delete(can.ui[name]) } })
|
||||
}) },
|
||||
})
|
||||
Volcanos(chat.ONPLUGIN, {
|
||||
alert: shy("提示", [wiki.CONTENT], function(can, arg) { arg.length > 0 && can.user.alert(arg[0]) }),
|
||||
toast: shy("提示", {
|
||||
inputs: shy(function(can, sup, msg, arg) { var list = {}; can.core.List(sup[NTIP][arg[0]], function(item) {
|
||||
inputs: shy(function(can, sup, msg, arg) { var list = {}; can.core.List(sup.db[NTIP][arg[0]], function(item) {
|
||||
if (!can.base.contains(item, arg[1]) || list[item]) { return } list[item] = true; msg.Push(arg[0], item)
|
||||
}) }),
|
||||
create: shy([wiki.CONTENT, wiki.TITLE], function(can, content, title) { can.user.toast(can, content, title) }),
|
||||
}, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg) { msg.Copy(can[NTIP]), msg.StatusTimeCount() }),
|
||||
}, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg) { msg.Copy(can.db[NTIP]), msg.StatusTimeCount() }),
|
||||
debug: shy("网页日志", {
|
||||
"prune": shy("清空", function(can) { while(can.misc._list.pop()) {} can.onmotion.clear(can) }),
|
||||
"w3schools": shy("教程", function(can) { can.user.open("https://www.w3schools.com/colors/colors_names.asp") }),
|
||||
"mozilla": shy("文档", function(can) { can.user.open("https://developer.mozilla.org/en-US/") }),
|
||||
"w3": shy("标准", function(can) { can.user.open("https://www.w3.org/TR/?tag=css") }),
|
||||
}, ["type:select=log,info,warn,error,debug,wss,onremote", "filter", "list", "prune", "w3schools", "mozilla", "w3"], function(can, msg, arg, cb) { var _can = can, can = msg._can
|
||||
var stat = {}; var ui = can.page.Appends(can, can._output, [{type: html.TABLE, className: html.CONTENT, list: [{type: html.TR, list: [
|
||||
{type: html.TH, inner: mdb.TEXT},
|
||||
}, ["type:select=log,info,warn,error,debug,onremote,wss", web.FILTER, ice.LIST, "prune", "w3schools", "mozilla", "w3"], function(can, msg, arg, cb) { var _can = can, can = msg._can
|
||||
var stat = {}; var ui = can.page.Appends(can, can._output, [{view: [html.CONTENT, html.TABLE], list: [{type: html.TR, list: [
|
||||
{text: [mdb.TEXT, html.TH]},
|
||||
]}].concat(can.core.List(can.misc._list, function(list) { stat[list[2]] = ((stat[list[2]]||0)+1); return (!arg || !arg[0] || arg[0] == "log" || arg[0] == list[2]) && {type: html.TR, list: [
|
||||
{type: html.TD, list: can.core.List(list, function(item, index) { var vimer
|
||||
if (index == 1) { var _ls = /(https*:\/\/[^/]+)\/*([^:]+):([0-9]+):([0-9]+)/.exec(list[1])
|
||||
return {view: [html.ITEM, html.SPAN], list: [{text: ice.SP+can.page.unicode.close+ice.SP}, {text: [(_ls[1] == location.origin? _ls[2].split("?")[0]+ice.DF+_ls[3]: item).split("?")[0], html.SPAN, nfs.PATH], onclick: function(event) {
|
||||
if (can.onexport.record(can, list[1], mdb.LINK, {time: list[0], link: list[1], type: list[2], path: ice.USR_VOLCANOS, file: _ls[2].split("?")[0], line: _ls[3]})) { return }
|
||||
if (index == 1) { var _ls = /(https*:\/\/[^/]+)\/*([^:]+):([0-9]+):([0-9]+)/.exec(list[1]); _ls[2] = _ls[2].split(ice.QS)[0]
|
||||
return {view: [html.ITEM, html.SPAN], list: [{text: ice.SP+can.page.unicode.close+ice.SP}, {text: [(_ls[1] == location.origin? "": _ls[1])+_ls[2]+ice.DF+_ls[3], "", nfs.PATH], onclick: function(event) {
|
||||
if (can.onexport.record(can, list[1], mdb.LINK, {time: list[0], link: list[1], type: list[2], path: ice.USR_VOLCANOS, file: _ls[2], line: _ls[3]})) { return }
|
||||
if (vimer) { return can.page.Remove(can, vimer._target), vimer = null }
|
||||
vimer = can.onappend.plugin(_can, {index: web.CODE_INNER, args: [ice.USR_VOLCANOS, _ls[2], _ls[3]]}, function(sub) {}, event.target.parentNode)
|
||||
}}]}
|
||||
} if (!can.base.isObject(item)) { return {text: (index > 0? ice.SP: "")+item} }
|
||||
} if (!can.base.isObject(item)) { return item && {text: (index > 0? ice.SP: "")+item} }
|
||||
return {view: [mdb.DATA, html.SPAN], _init: function(target) {
|
||||
if (item.tagName) { var detail; var ui = can.page.Append(can, target, [{text: ice.SP},
|
||||
{text: can.page.unicode.close+ice.SP, _init: function(target) { can.onmotion.delay(can, function() { ui.toggle = target }) }},
|
||||
{view: [[html.ITEM, nfs.TARGET], html.SPAN, item.tagName.toLowerCase()+(item.className? ice.PT+item.className.replaceAll(ice.SP, ice.PT): "")], onclick: function() {
|
||||
{view: [[html.ITEM, nfs.TARGET], html.SPAN, can.page.tagClass(item)], onclick: function() {
|
||||
if (detail) { return can.page.Remove(can, detail), detail = null, can.page.Modify(can, ui.toggle, can.page.unicode.close+ice.SP) }
|
||||
detail = can.page.AppendData(can, target, "", "", item)._target, detail.click(), can.page.Modify(can, ui.toggle, can.page.unicode.open+ice.SP)
|
||||
}},
|
||||
@ -85,7 +82,7 @@ Volcanos(chat.ONPLUGIN, {
|
||||
]} })) }]); arg && arg[1] && can.page.Select(can, can._output, html.TR, function(tr) { can.page.ClassList.set(can, tr, html.HIDE, tr.innerText.indexOf(arg[1]) == -1) })
|
||||
can.onappend._status(can, [
|
||||
{name: mdb.TIME, value: can.base.Time()}, {name: mdb.COUNT, value: can.page.Select(can, can._output, html.TR+html.NOT_HIDE).length+"x1"},
|
||||
].concat(can.core.List([chat.ONREMOTE, html.WSS, log.INFO, log.WARN, log.ERROR], function(item) { return {name: item, value: stat[item]||"0"} })))
|
||||
].concat(can.core.List([log.INFO, log.WARN, log.ERROR, chat.ONREMOTE, html.WSS], function(item) { return {name: item, value: stat[item]||"0"} })))
|
||||
}),
|
||||
data: shy("网页数据", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can
|
||||
arg[0]? can.page.AppendData(can, can._output, arg[0], arg[0].split(ice.PT).pop(), can.core.Value(can._root, arg[0]), function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click():
|
||||
@ -94,7 +91,7 @@ Volcanos(chat.ONPLUGIN, {
|
||||
view: shy("网页元素", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can
|
||||
if (arg[0]) { can.page.Append(can, can._output, [can.page.AppendView(can, can.page.SelectOne(can, document.body, arg[0]||document.body))]) } else {
|
||||
var ui = can.page.Append(can, can._output, [can.page.AppendView(can, document, "html", [
|
||||
can.page.AppendView(can, document.head, "head"), can.page.AppendView(can, document.body, "body", null, false, function(target) {
|
||||
can.page.AppendView(can, document.head, html.HEAD), can.page.AppendView(can, document.body, html.BODY, null, false, function(target) {
|
||||
var list = []; for (var p = target; p && p.tagName && p != document.body; p = p.parentNode) {
|
||||
list.push(p.tagName.toLowerCase()+(p.className? ice.PT+p.className.replaceAll(ice.SP, ice.PT).replace(".picker", ""): ""))
|
||||
} can.Option(mdb.KEY, list.reverse().join(ice.GT))
|
||||
|
@ -2,13 +2,13 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
|
||||
can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._avatar(can, msg, target), can.onimport._background(can, msg, target), can.onimport._search(can, msg, target)
|
||||
},
|
||||
_title: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.getValid(can.Conf(chat.TITLE)||msg.result, ["shylinux.com/x/contexts"]), function(item) {
|
||||
can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
|
||||
can.page.Append(can, target, [{view: [chat.TITLE, "", item], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
|
||||
}) },
|
||||
_state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [aaa.USERNICK, aaa.AVATAR, mdb.TIME]).reverse(), function(item) {
|
||||
if (item == aaa.AVATAR ) { can.user.isLocalFile || can.page.Append(can, target, [{view: [[chat.STATE, item]], list: [{img: ice.SP}], onclick: function(event) {
|
||||
can.onaction.carte(event, can, [can.page.Format(html.IMG, can.onexport.avatar(can), 160)])
|
||||
can.onaction.carte(event, can, [can.page.Format(html.IMG, can.onexport.avatar(can), 320)])
|
||||
}}]); return }
|
||||
can.page.Append(can, target, [{view: [[chat.STATE, item], html.DIV, (can.Conf(item)||msg.Option(item)||"").split(ice.AT)[0].slice(0, 10)], onclick: function(event) {
|
||||
can.page.Append(can, target, [{view: [[chat.STATE, item], "", (can.Conf(item)||msg.Option(item)||"").split(ice.AT)[0].slice(0, 10)], onclick: function(event) {
|
||||
can.core.CallFunc([can.onaction, item], [event, can, item])
|
||||
}, _init: function(target) { item == mdb.TIME && can.onimport._time(can, target) }}])
|
||||
}) },
|
||||
@ -28,19 +28,21 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
|
||||
background: function(event, can, background) { can.user.isExtension || can.user.isLocalFile || can.runAction(event, aaa.BACKGROUND, [background], function(msg) {
|
||||
can.user.info.background = background, can.onimport._background(can, msg), can.user.toastSuccess(can)
|
||||
}) },
|
||||
language: function(can, language) { can.runAction(event, aaa.LANGUAGE, [language == ice.AUTO? "": language], function(msg) { can.user.reload() }) },
|
||||
theme: function(can, theme) { theme && (can.misc.localStorage(can, "can.theme", can._theme = theme == ice.AUTO? "": can.base.Obj(theme).join(ice.SP))), can.user.theme(can, can.onexport.theme(can)) },
|
||||
language: function(can, language) { can.runAction(event, aaa.LANGUAGE, [language == ice.AUTO? "": language], function(msg) {
|
||||
can.user.toastConfirm(can, "reload page for "+language, "language", function() { can.user.reload(true) })
|
||||
}) },
|
||||
theme: function(can, theme) { theme && can.misc.localStorage(can, "can.theme", can._theme = theme == ice.AUTO? "": theme), can.user.theme(can, can.onexport.theme(can)) },
|
||||
menu: function(can, cmds, cb, trans) { can.base.isString(cmds) && (cmds = [cmds])
|
||||
return can.page.Append(can, can._output, [{view: cmds[0], list: can.core.List(can.base.getValid(cmds.slice(1), [cmds[0]]), function(item) {
|
||||
if (can.base.isString(item)) { return {view: [html.MENU, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) { can.base.isFunc(cb) && cb(event, item, [item]) }} }
|
||||
if (can.base.isArray(item)) { return {view: [html.MENU, html.DIV, can.user.trans(can, item[0], trans)], onclick: function(event) { can.onkeymap.prevent(event)
|
||||
can.onaction.carte(event, can, item.slice(1), function(event, button, meta) { can.base.isFunc(cb) && cb(event, button, item) }, trans)
|
||||
}} } if (can.base.isObject(item)) { return item }
|
||||
return can.base.isString(item)? /* 1.string */ {view: [html.MENU, "", can.user.trans(can, item, trans)], onclick: function(event) { can.base.isFunc(cb) && cb(event, item, [item]) }}:
|
||||
can.base.isArray(item)? /* 2.array */ {view: [html.MENU, "", can.user.trans(can, item[0], trans)], onclick: function(event) { can.onkeymap.prevent(event)
|
||||
can.onaction.carte(event, can, item.slice(1), function(event, button, meta) { can.base.isFunc(cb) && cb(event, button, item) }, trans)
|
||||
}}: /* 3.others */ item
|
||||
}) }])._target
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMedia("(prefers-color-scheme: light)")
|
||||
can.__theme = themeMedia.matches? html.LIGHT: html.DARK, themeMedia.addListener(function(event) { can.__theme = event.matches? html.LIGHT: html.DARK
|
||||
Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)")
|
||||
can.__theme = themeMedia.matches? html.DARK: html.LIGHT, themeMedia.addListener(function(event) { can.__theme = event.matches? html.DARK: html.LIGHT
|
||||
can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme}))
|
||||
}), can.onimport.theme(can)
|
||||
},
|
||||
@ -64,7 +66,12 @@ Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMed
|
||||
}), code.WEBPACK, [], function(msg) { can.user.download(can, web.SHARE_LOCAL+msg.Result(), name, nfs.HTML), can.user.toastSuccess(can, "打包成功", code.WEBPACK) })
|
||||
}) },
|
||||
|
||||
title: function(event, can) { var args = {}; can.core.List(can.onaction._params, function(key) { var value = can.misc.Search(can, key); value && (args[key] = value) }); can.user.jumps(can.misc.MergeURL(can, args, true)) },
|
||||
title: function(event, can) { var args = {};
|
||||
can.core.List(can.onaction._params, function(key) { var value = can.misc.Search(can, key); value && (args[key] = value) })
|
||||
var msg = can.request(event); can.onengine.signal(can, "ontitle", msg)
|
||||
can.core.List(msg.Append(), function(key) { args[key] = msg.Append(key) })
|
||||
can.user.jumps(can.misc.MergeURL(can, args, true))
|
||||
},
|
||||
carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb, null, trans) },
|
||||
share: function(event, can, args) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[])) },
|
||||
usernick: function(event, can) { can.user.mod.isPod || can.user.isExtension || can.user.isLocalFile || can.onaction.carte(event, can, can.onaction._menus) },
|
||||
@ -80,7 +87,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMed
|
||||
clear: function(event, can) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, "") },
|
||||
logout: function(event, can) { can.user.logout(can) },
|
||||
|
||||
_params: [chat.TITLE, chat.THEME],
|
||||
_params: [log.DEBUG, chat.TITLE],
|
||||
_menus: ["shareuser",
|
||||
[chat.THEME, ice.AUTO, html.DARK, html.LIGHT, "print", cli.WHITE, cli.BLACK],
|
||||
[aaa.LANGUAGE, ice.AUTO, "zh", "en"],
|
||||
@ -104,7 +111,7 @@ Volcanos(chat.ONPLUGIN, {
|
||||
modify: shy(function(can, msg, arg) { if (arg[0] == mdb.VALUE) { can.misc.Cookie(can, msg.Option(mdb.NAME), arg[1]) } else {
|
||||
can.misc.Cookie(can, arg[1], msg.Option(mdb.VALUE)), can.misc.Cookie(can, msg.Option(mdb.NAME), "")
|
||||
} }),
|
||||
}, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
|
||||
}, [web.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
|
||||
can.core.Item(can.misc.Cookie(can), function(name, value) { can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value) })
|
||||
}),
|
||||
localStorage: shy("本地存储", {
|
||||
@ -113,7 +120,7 @@ Volcanos(chat.ONPLUGIN, {
|
||||
modify: shy(function(can, msg, arg) { if (arg[0] == mdb.VALUE) { can.misc.localStorage(can, msg.Option(mdb.NAME), arg[1]) } else {
|
||||
can.misc.localStorage(can, arg[1], msg.Option(mdb.VALUE)), can.misc.localStorage(can, msg.Option(mdb.NAME), "")
|
||||
} }),
|
||||
}, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
|
||||
}, [web.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
|
||||
can.core.Item(can.misc.localStorage(can), function(name, value) { can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value) })
|
||||
}),
|
||||
sessionStorage: shy("会话存储", {
|
||||
@ -122,7 +129,7 @@ Volcanos(chat.ONPLUGIN, {
|
||||
modify: shy(function(can, msg, arg) { if (arg[0] == mdb.VALUE) { can.misc.sessionStorage(can, msg.Option(mdb.NAME), arg[1]) } else {
|
||||
can.misc.sessionStorage(can, arg[1], msg.Option(mdb.VALUE)), can.misc.sessionStorage(can, msg.Option(mdb.NAME), "")
|
||||
} }),
|
||||
}, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
|
||||
}, [web.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { msg.Defer(function() { msg.PushAction(mdb.REMOVE).StatusTimeCount() })
|
||||
can.core.Item(can.misc.sessionStorage(can), function(name, value) { can.base.contains(name, arg[0]) && msg.Push(mdb.NAME, name).Push(mdb.VALUE, value) })
|
||||
}),
|
||||
location: shy("请求地址", {copy: function(can) { can.user.copy(msg._event, can, location.href) }}, [mdb.LINK, ice.LIST, ice.COPY], function(can, msg, cb) {
|
||||
@ -132,12 +139,10 @@ Volcanos(chat.ONPLUGIN, {
|
||||
}),
|
||||
avatar: shy("用户头像", function(can, sub, cb) { can.page.Append(can, sub._output, [{img: can.user.info.avatar, style: kit.Dict(html.MAX_HEIGHT, sub.ConfHeight(), html.MAX_WIDTH, sub.ConfWidth())}]) }),
|
||||
background: shy("背景图片", function(can, sub, cb) { can.page.Append(can, sub._output, [{img: can.user.info.background, style: kit.Dict(html.MAX_HEIGHT, sub.ConfHeight(), html.MAX_WIDTH, sub.ConfWidth())}]) }),
|
||||
language: shy("语言地区", {_init: function(can) { can.Option(aaa.LANGUAGE, can.user.info.language||ice.AUTO) }}, ["language:select=auto,zh,en", ice.RUN], function(can, msg, arg) {
|
||||
if (arg[0] == ice.AUTO) { arg[0] = "" } can.runAction(event, aaa.LANGUAGE, [arg[0]], function(msg) { can.user.reload() })
|
||||
}),
|
||||
language: shy("语言地区", {_init: function(can) { can.Option(aaa.LANGUAGE, can.user.info.language||ice.AUTO) }}, ["language:select=auto,zh,en", ice.RUN], function(can, msg, arg) { can.onimport.language(can, arg[0]) }),
|
||||
title: shy("网页标题", [chat.TITLE], function(can, msg, arg) { msg.Echo(can.user.title(arg[0])) }),
|
||||
theme: shy("界面主题", {_init: function(can) { can.Option(chat.THEME, can.getHeader(chat.THEME)) }}, ["theme:select=auto,dark,light,print,white,black", ice.RUN], function(can, msg, arg) {
|
||||
if (arg[0] == ice.AUTO) { arg[0] = "", can._theme = "" } can.misc.localStorage(can, "can.theme", arg[0]), can.onimport.theme(can, arg[0])
|
||||
}),
|
||||
logout: shy("退出登录", kit.Dict(aaa.LOGOUT, shy("退出", function(can) { can.user.logout(can._root.Header, true) })), [aaa.LOGOUT]),
|
||||
logout: shy("退出登录", kit.Dict(aaa.LOGOUT, shy("退出", function(can) { can.user.logout(can._root.Header) })), [aaa.LOGOUT]),
|
||||
})
|
||||
|
@ -1,6 +1,6 @@
|
||||
(function() { const CAN_RIVER = "can.river", CAN_STORM = "can.storm"
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can), can.onimport._main(can, msg)
|
||||
var select; can.page.Append(can, can._output, msg.Table(function(item, index) {
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onimport._main(can, msg)
|
||||
var select; can.page.Appends(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(), can.onimport._menu(can, msg)
|
||||
},
|
||||
@ -8,31 +8,32 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can), ca
|
||||
can._main_river = can.misc.SearchOrConf(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||"project"
|
||||
can._main_storm = can.misc.SearchOrConf(can, chat.STORM)||msg.Option(ice.MSG_STORM)||"studio"
|
||||
},
|
||||
_river: function(can, meta, cb) { return {text: [meta.name, html.DIV, html.ITEM], _init: function(target) { can.ui.river_list[meta.hash] = target, cb(target) },
|
||||
_river: function(can, meta, cb) { return {view: [html.ITEM, "", meta.name], _init: function(target) { can.ui.river_list[meta.hash] = target, cb(target) },
|
||||
onclick: function(event) { can.onaction.storm(event, can, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.onaction._menu, meta.hash) },
|
||||
} },
|
||||
_storm: function(can, meta, river) { return {text: [meta.name, html.DIV, html.ITEM], _init: function(target) { can.ui.storm_list[can.core.Keys(river, meta.hash)] = target },
|
||||
_storm: function(can, meta, river) { return {view: [html.ITEM, "", meta.name], _init: function(target) { can.ui.storm_list[can.core.Keys(river, meta.hash)] = target },
|
||||
onclick: function(event) { can.onaction.action(event, can, river, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.ondetail._menu, river, meta.hash) },
|
||||
} },
|
||||
_menu: function(can, msg) { can.user.isMobile || can.user.mod.isPod || can.onappend._action(can, can.onaction.list, can._action) },
|
||||
})
|
||||
Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.REFRESH, web.SHARE], _init: function(can) { can.onmotion.hidden(can) },
|
||||
Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: function(can) { can.onmotion.hidden(can) },
|
||||
onlogin: function(can, msg) { can.run({}, [], function(msg) { if (msg.Option(ice.MSG_RIVER)) { return can.page.Remove(can, can._target) }
|
||||
can.onimport._init(can, msg); if (can.user.isMobile || can.user.isExtension) { return }
|
||||
can.user.info.language != "zh" && can.onmotion.clear(can, can._action)
|
||||
can.onmotion.toggle(can, can._target, true), can.onlayout._init(can)
|
||||
}) },
|
||||
onaction_touch: function(can, msg) { can.user.isMobile && can.onmotion.hidden(can) },
|
||||
onaction_notool: function(can, msg, river, storm) { can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm) },
|
||||
onaction_notool: function(can, msg, river, storm) { can.ondetail["addcmd"](msg._event, can, "addcmd", river, storm) },
|
||||
onsearch: function(can, msg, arg) { if (arg[0] == mdb.FOREACH || arg[0] == chat.STORM) { can.onexport.storm(can, msg, arg) } },
|
||||
onlayout: function(can, layout) { can.user.isMobile || can._hidden || can.onmotion.toggle(can, can._target, !layout || layout == "tabs") },
|
||||
onresize: function(can, msg) { can.user.isMobile && can.onmotion.hidden(can, can._target) },
|
||||
|
||||
onlayout: function(can, layout) { can.user.isMobile || can.onmotion.toggle(can, can._target, !layout || layout == "tabs") },
|
||||
ontitle: function(can, msg) { can.misc.localStorage(can, CAN_RIVER, ""), can.misc.localStorage(can, CAN_STORM, "") },
|
||||
|
||||
create: function(event, can) { can.user.input(event, can, [{name: mdb.TYPE, values: [aaa.TECH, aaa.VOID], _trans: "类型"}, {name: mdb.NAME, value: "hi", _trans: "群名"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}], function(args) {
|
||||
can.runAction(event, mdb.CREATE, args, function(msg) { can.misc.Search(can, {river: msg.Result()}) })
|
||||
}) },
|
||||
refresh: function(event, can) { can.misc.Search(can, {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), layout: can.getAction(html.LAYOUT)}) },
|
||||
share: function(event, can) { can.onmotion.share(event, can, [{name: chat.TITLE, value: can.Conf(chat.STORM)}], [mdb.TYPE, chat.STORM, RIVER, can.Conf(RIVER), STORM, can.Conf(STORM)]) },
|
||||
share: function(event, can) { can.core.CallFunc(can.ondetail.share, {event: event, can: can}) },
|
||||
refresh: function(event, can) { can.misc.Search(can, {
|
||||
river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), theme: can.getHeaderTheme(), layout: can.getAction("layout"),
|
||||
}) },
|
||||
|
||||
storm: function(event, can, river) { can.onmotion.select(can, can._output, html.DIV_ITEM, can.ui.river_list[river])
|
||||
var list = can.ui.sublist[river]; if (list) { return can.onmotion.toggle(can, list) }
|
||||
@ -40,36 +41,52 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.REFRESH, web.SHARE], _init: func
|
||||
return river == can._main_river && item.hash == can._main_storm && (select = index), can.onimport._storm(can, item, river)
|
||||
}) }])._target, can.ui.sublist[river] = list, list.children.length > 0 && list.children[select].click(), event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) })
|
||||
},
|
||||
action: function(event, can, river, storm) { can.onmotion.select(can, can._output, html.DIV_ITEM, can.ui.river_list[river])
|
||||
can.onmotion.select(can, can._output, [html.DIV_LIST, html.DIV_ITEM], can.ui.storm_list[can.core.Keys(river, storm)]), can.onmotion.toggle(can, can.ui.sublist[river], true)
|
||||
action: function(event, can, river, storm) {
|
||||
can.onaction.storm({target: can.ui.river_list[river]}, can, river), can.onmotion.toggle(can, can.ui.sublist[river], true)
|
||||
can.onmotion.select(can, can._output, [html.DIV_LIST, html.DIV_ITEM], can.ui.storm_list[can.core.Keys(river, storm)])
|
||||
can.onengine.signal(can, chat.ONSTORM_SELECT, can.request(event, {river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm)}))
|
||||
can.misc.localStorage(can, CAN_RIVER, river), can.misc.localStorage(can, CAN_STORM, storm)
|
||||
},
|
||||
carte: function(event, can, list, river, storm) { if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return can.onkeymap.prevent(event) }
|
||||
can.user.carteRight(event, can, {}, list, function(event, button) { (storm? can.ondetail: can.onaction)[button](event, can, button, river, storm) })
|
||||
carte: function(event, can, list, river, storm) { can.onkeymap.prevent(event); if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return }
|
||||
can.request(event, {river: river, storm: storm})
|
||||
storm? can.user.carteRight(event, can, can.ondetail, list): can.user.carteRight(event, can, can.onaction, list)
|
||||
},
|
||||
_menu: ["添加应用", "重命名群组", "删除群组"],
|
||||
"添加应用": function(event, can, button, river) { can.ondetail.create(event, can, button, river) },
|
||||
"重命名群组": function(event, can, button, river) { can.user.input(event, can, [mdb.NAME], function(args) {
|
||||
_trans: {
|
||||
addapp: "添加应用",
|
||||
rename: "重命名群组",
|
||||
remove: "删除群组",
|
||||
},
|
||||
_menu: ["addapp", "rename", "remove"],
|
||||
addapp: function(event, can, button, river) { can.ondetail.create(event, can, button, river) },
|
||||
rename: function(event, can, button, river) { can.user.input(event, can, [mdb.NAME], function(args) {
|
||||
can.runAction(event, mdb.MODIFY, [mdb.HASH, river].concat(args), function(msg) { can.page.Modify(can, can.ui.river_list[river], args[1]), can.user.toastSuccess(can) })
|
||||
}) },
|
||||
"删除群组": function(event, can, button, river) { can.runAction(event, mdb.REMOVE, [mdb.HASH, river], function(msg) { can.misc.Search(can, {river: "", storm: ""}) }) },
|
||||
remove: function(event, can, button, river) { can.runAction(event, mdb.REMOVE, [mdb.HASH, river], function(msg) {
|
||||
can.misc.localStorage(can, CAN_RIVER, ""), can.misc.localStorage(can, CAN_STORM, ""), can.misc.Search(can, {river: "", storm: ""})
|
||||
}) },
|
||||
})
|
||||
Volcanos(chat.ONDETAIL, {
|
||||
_menu: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"],
|
||||
"共享应用": function(event, can, button, river, storm) { can.onmotion.share(event, can, [{name: chat.TITLE, value: can.user.title()}, {name: chat.THEME, values: [ice.AUTO, html.DARK, html.LIGHT, cli.WHITE, cli.BLACK]}], [mdb.TYPE, chat.STORM, chat.RIVER, river, chat.STORM, storm]) },
|
||||
"添加工具": function(event, can, button, river, storm) { can.user.select(event, can, ctx.COMMAND, ctx.INDEX, function(item, next) {
|
||||
can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.INSERT].concat([web.SPACE, can.misc.Search(can, ice.POD)||"", ctx.INDEX, item[0]]), function(msg) { next() })
|
||||
}, function() { can.misc.Search(can, {river: river, storm: storm}) }) },
|
||||
"保存参数": function(event, can, button, river, storm) { can.getAction(ctx.ARGS, function(args, sub, next, index, array) { var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length)
|
||||
_trans: {
|
||||
share: "共享应用",
|
||||
savearg: "保存参数",
|
||||
addcmd: "添加工具",
|
||||
rename: "重命名应用",
|
||||
remove: "删除应用",
|
||||
},
|
||||
_menu: ["share", "savearg", "addcmd", "rename", "remove"],
|
||||
share: function(event, can, button, river, storm) { can.onmotion.share(event, can, [{name: chat.TITLE, value: can.user.title()}, {name: chat.THEME, values: [ice.AUTO, html.DARK, html.LIGHT, cli.WHITE, cli.BLACK]}], [mdb.TYPE, chat.STORM, chat.RIVER, river, chat.STORM, storm]) },
|
||||
savearg: function(event, can, button, river, storm) { can.getAction(ctx.ARGS, function(args, sub, next, index, array) { var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length)
|
||||
can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.MODIFY, mdb.ID, sub.Conf(mdb.ID), ctx.ARGS, JSON.stringify(args)], function() {
|
||||
can.onmotion.delay(can, function() { toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can) })
|
||||
})
|
||||
}) },
|
||||
"重命名应用": function(event, can, button, river, storm) { can.user.input(event, can, [mdb.NAME], function(args) {
|
||||
addcmd: function(event, can, button, river, storm) { can.user.select(event, can, ctx.COMMAND, ctx.INDEX, function(item, next) {
|
||||
can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.INSERT].concat([web.SPACE, can.misc.Search(can, ice.POD)||"", ctx.INDEX, item[0]]), function(msg) { next() })
|
||||
}, function() { can.misc.Search(can, {river: river, storm: storm}) }) },
|
||||
rename: function(event, can, button, river, storm) { can.user.input(event, can, [mdb.NAME], function(args) {
|
||||
can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function() { can.page.Modify(can, can.ui.storm_list[can.core.Keys(river, storm)], args[1]), can.user.toastSuccess(can) })
|
||||
}) },
|
||||
"删除应用": function(event, can, button, river, storm) { can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {river: river, storm: ""}) }) },
|
||||
remove: function(event, can, button, river, storm) { can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {river: river, storm: ""}) }) },
|
||||
create: function(event, can, button, river) { can.user.input(event, can, [{name: mdb.NAME, value: "hi", _trans: "名称"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}], function(args) {
|
||||
can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { can.misc.Search(can, {river: river, storm: msg.Result()}) })
|
||||
}) },
|
||||
|
@ -225,7 +225,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
|
||||
layout: function(can) { if (can.isSimpleMode()) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) }
|
||||
if (can.isCmdMode()) { can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) }
|
||||
can.ui.size = {profile: can.db.profile_size[can.onexport.keys(can)]||0.5, display: can.db.display_size[can.onexport.keys(can)]||3*html.ACTION_HEIGHT}
|
||||
can.ui.layout(can.ConfWidth(), can.ConfHeight(), 0, function(content_height, content_width) { var sub = can.ui.content._plugin; if (!sub) { return }
|
||||
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(content_height, content_width) { var sub = can.ui.content._plugin; if (!sub) { return }
|
||||
if (content_height == sub.ConfHeight()+sub.onexport.actionHeight(sub)+sub.onexport.statusHeight(sub) && content_width == sub.ConfWidth()) { return }
|
||||
sub.onimport.size(sub, content_height, content_width, true)
|
||||
})
|
||||
@ -381,7 +381,7 @@ Volcanos(chat.ONACTION, {list: ["首页", "官网", "调试", "百度"],
|
||||
}), can.runAction(can.request(event, {text: can.base.Format(list)}), button)
|
||||
},
|
||||
clear: function(event, can) {
|
||||
var list = [".input.float", "div.carte.float", "div.vimer.find.float"]; for (var i = 0; i < list.length; i++) {
|
||||
var list = ["fieldset.input.float", "div.input.float", "div.carte.float", "div.vimer.find.float"]; for (var i = 0; i < list.length; i++) {
|
||||
if (can.page.Select(can, can._root._target, list[i], function(item) { return can.page.Remove(can, item) }).length > 0) { return }
|
||||
}
|
||||
if (can.page.Select(can, can.ui.plug, "legend.select", function(item) { return item.click(), item }).length > 0) { return }
|
||||
@ -437,7 +437,7 @@ Volcanos(chat.ONACTION, {list: ["首页", "官网", "调试", "百度"],
|
||||
},
|
||||
find: function(event, can) {
|
||||
var ui = can.page.Append(can, can._output, [{view: "vimer find float", list: [html.ACTION, html.OUTPUT],
|
||||
style: {left: can.ui.project.offsetWidth+can.ui.content.offsetWidth/4, top: can.ui.content.offsetHeight/2}}]); can.onmotion.move(can, ui._target)
|
||||
style: {left: can.ui.project.offsetWidth+can.ui.content.offsetWidth/4, top: can.ui.content.offsetHeight/2-60}}]); can.onmotion.move(can, ui._target)
|
||||
can.onmotion.delay(can, function() { can.page.style(can, ui._target, html.LEFT, can.ui.project.offsetWidth+can.ui.content.offsetWidth/2-ui._target.offsetWidth/2) })
|
||||
var last = can.onaction._getLineno(can, can.current.line)
|
||||
function find(begin, text) { if (parseInt(text) > 0) { return can.onaction.selectLine(can, parseInt(text)) && meta.close() }
|
||||
|
@ -7,12 +7,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.require(["i
|
||||
can.db._keylist = can.onkeymap._parse(event, can, can.db.mode+(event.ctrlKey? "_ctrl": ""), can.db._keylist, can.ui.current)
|
||||
if (can.db.mode == mdb.NORMAL) { can.onkeymap.prevent(event), can.Status(mdb.KEYS, can.db._keylist.join("")) }
|
||||
if (can.db.mode == mdb.INSERT) { can.db._keylist = [] }
|
||||
}, onkeyup: function(event) { can.onimport._value(can); if (event.metaKey) { return }
|
||||
can.onaction._complete(event, can)
|
||||
}, onfocus: function(event) {
|
||||
can.current.line.appendChild(can.ui.complete)
|
||||
}, onclick: function(event) {
|
||||
can.onkeymap._insert(event, can)
|
||||
}, onkeyup: function(event) { can.onimport._value(can); if (event.metaKey) { return } can.onaction._complete(event, can)
|
||||
}, onfocus: function(event) { can.current.line.appendChild(can.ui.complete)
|
||||
}, onclick: function(event) { can.onkeymap._insert(event, can)
|
||||
}}, {view: [[code.COMPLETE]]},
|
||||
]); can.ui.current = ui.current, can.ui.complete = ui.complete, can.onkeymap._build(can), can.onkeymap._plugin(can) },
|
||||
_value: function(can) { can.db.mode == mdb.INSERT && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) }) },
|
||||
|
@ -4,7 +4,9 @@ Volcanos(chat.ONIMPORT, {_process: function(can, msg) { msg.OptionStatus() && ca
|
||||
_location: function(can, msg, arg) { can.user.jumps(arg) },
|
||||
_replace: function(can, msg, arg) { location.replace(arg) },
|
||||
_history: function(can, msg) { history.back() },
|
||||
_confirm: function(can, msg, arg) { can.user.confirm(arg) && can.runAction(can.request({}, msg), "confirm") },
|
||||
_confirm: function(can, msg, arg) { can.user.toastConfirm(can, arg, "", function() {
|
||||
can.runAction(can.request({}, msg), "confirm")
|
||||
}) },
|
||||
_refresh: function(can, msg, arg) { can.core.Timer(parseInt(arg||"30"), function() { can.Update(can.request({}, {_count: parseInt(msg.Option("_count")||"3")-1})) }) },
|
||||
_rewrite: function(can, msg) { var arg = msg._arg; for (var i = 0; i < arg.length; i += 2) { can.Option(arg[i], arg[i+1]), can.Action(arg[i], arg[i+1]) } can.Update() },
|
||||
_display: function(can, msg) { can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)) },
|
||||
|
9
proto.js
9
proto.js
@ -287,7 +287,6 @@ var Volcanos = shy({version: window._version||"", iceberg: "/chat/", volcano: "/
|
||||
}); set(ice.MSG_HEIGHT, can.ConfHeight()), set(ice.MSG_WIDTH, can.ConfWidth()), set(ice.MSG_MODE, can.Mode())
|
||||
return msg
|
||||
},
|
||||
|
||||
runActionInputs: function(event, cmds, cb) { var msg = can.request(event), meta = can.Conf()
|
||||
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]})
|
||||
if (can.base.isFunc(meta.feature[cmds[1]])) { return meta.feature[cmds[1]](can, msg, cmds.slice(2)) }
|
||||
@ -297,10 +296,13 @@ var Volcanos = shy({version: window._version||"", iceberg: "/chat/", volcano: "/
|
||||
runActionCommand: function(event, index, args, cb) { can.request(event)._caller()
|
||||
can.runAction(event, ice.RUN, [index].concat(args), cb, true)
|
||||
},
|
||||
runAction: function(event, action, args, cb, silent) { can.request(event, {_handle: ice.TRUE}, can.Option())._caller()
|
||||
runAction: function(event, action, args, cb, silent) {
|
||||
var msg = can.request(event); if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && can.onaction && can.onaction[action]) {
|
||||
// return can.core.CallFunc(can.onaction[action], {event: event, can: can, msg: msg, button: action})
|
||||
}
|
||||
can.request(event, {_handle: ice.TRUE}, can.Option())._caller()
|
||||
can.run(event, [ctx.ACTION].concat(action, args), cb, silent)
|
||||
},
|
||||
|
||||
search: function(event, cmds, cb) {
|
||||
if (cmds && typeof cmds == lang.OBJECT && cmds.length > 0 && typeof cmds[0] == lang.OBJECT && cmds[0].length > 0 ) { cmds[0] = cmds[0].join(ice.PT) }
|
||||
return (can._root||can).run(event, [chat._SEARCH].concat(cmds), cb, true)
|
||||
@ -316,7 +318,6 @@ var Volcanos = shy({version: window._version||"", iceberg: "/chat/", volcano: "/
|
||||
setAction: function(key, value) { return can.set(chat.ACTION, key, value) },
|
||||
getAction: function(key, cb) { return can.get(chat.ACTION, key, cb) },
|
||||
getActionSize: function(cb) { return can.get(chat.ACTION, nfs.SIZE, cb) },
|
||||
|
||||
isStoryType: function(value) { return can.page.ClassList.has(can, can._fields, chat.STORY) },
|
||||
isSimpleMode: function(value) { return can.Mode() == chat.SIMPLE },
|
||||
isFloatMode: function(value) { return can.Mode() == chat.FLOAT },
|
||||
|
Loading…
x
Reference in New Issue
Block a user