From 89e5630ea3cbdfef56f684173460ec712b66eb01 Mon Sep 17 00:00:00 2001 From: shaoying Date: Fri, 10 Feb 2023 13:27:04 +0800 Subject: [PATCH] opt river.js --- frame.js | 31 +++++++++------- index.css | 7 ++-- lib/base.js | 9 ++--- lib/misc.js | 1 + lib/page.js | 3 ++ lib/user.js | 26 +++++++++----- panel/action.js | 31 ++++++++-------- panel/footer.css | 2 +- panel/footer.js | 65 ++++++++++++++++----------------- panel/header.js | 45 ++++++++++++----------- panel/river.js | 73 +++++++++++++++++++++++--------------- plugin/local/code/inner.js | 6 ++-- plugin/local/code/vimer.js | 9 ++--- plugin/state.js | 4 ++- proto.js | 9 ++--- 15 files changed, 183 insertions(+), 138 deletions(-) diff --git a/frame.js b/frame.js index 6f244aef..7939fc01 100644 --- a/frame.js +++ b/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) }) }, diff --git a/index.css b/index.css index f7d2e520..514a3cf8 100644 --- a/index.css +++ b/index.css @@ -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; } diff --git a/lib/base.js b/lib/base.js index 70357a08..8be98b78 100644 --- a/lib/base.js +++ b/lib/base.js @@ -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) diff --git a/lib/misc.js b/lib/misc.js index 5bbe955f..1bd7b20a 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -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 diff --git a/lib/page.js b/lib/page.js index 91eb06c2..6e3eae34 100644 --- a/lib/page.js +++ b/lib/page.js @@ -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) }, diff --git a/lib/user.js b/lib/user.js index 0a5412a4..f76aaf52 100644 --- a/lib/user.js +++ b/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) - }) } }, + }) }) }, }) diff --git a/panel/action.js b/panel/action.js index bc0c4d9d..e78101f8 100644 --- a/panel/action.js +++ b/panel/action.js @@ -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) { diff --git a/panel/footer.css b/panel/footer.css index 5682fc9b..f7d8e0ed 100644 --- a/panel/footer.css +++ b/panel/footer.css @@ -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; } diff --git a/panel/footer.js b/panel/footer.js index b856e7b1..78a5e9d1 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -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)) diff --git a/panel/header.js b/panel/header.js index f391fb23..9a7297b6 100644 --- a/panel/header.js +++ b/panel/header.js @@ -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]), }) diff --git a/panel/river.js b/panel/river.js index f0b48406..078f704d 100644 --- a/panel/river.js +++ b/panel/river.js @@ -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()}) }) }) }, diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 5b195a68..9f3794d3 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -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() } diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 5d2e7f6f..ca9c10ba 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -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) }) }, diff --git a/plugin/state.js b/plugin/state.js index 68395655..3c18a43f 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -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)) }, diff --git a/proto.js b/proto.js index 944179d2..097fa902 100644 --- a/proto.js +++ b/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 },